From dda1da7fec55a35ecb22a9ec188702dadf9901bf Mon Sep 17 00:00:00 2001 From: demn98 Date: Thu, 21 Nov 2024 16:23:55 +0300 Subject: [PATCH 1/9] highlighter tmp commit --- app/Docs.php | 25 +- .../CommonMark/CustomHighlightExtension.php | 52 ++++ .../CommonMark/IndentedCodeBlockRenderer.php | 52 ++++ app/MarkDown/CustomHL/IsInjection.php | 54 ++++ .../CustomHL/Languages/Bash/BashLanguage.php | 33 +++ .../Languages/Blade/BladeLanguage.php | 67 +++++ .../Blade/Injections/BladeEchoInjection.php | 26 ++ .../BladeKeywordParametersInjection.php | 24 ++ .../Blade/Injections/BladePhpInjection.php | 24 ++ .../Injections/BladeRawEchoInjection.php | 26 ++ .../Injections/SingleQuoteValueInjection.php | 34 +++ .../Blade/Patterns/BladeCommentPattern.php | 25 ++ .../BladeComponentCloseTagPattern.php | 25 ++ .../Patterns/BladeComponentOpenTagPattern.php | 25 ++ .../Blade/Patterns/BladeKeywordPattern.php | 25 ++ .../Blade/Patterns/DelimeterPattern.php | 31 +++ .../Blade/Patterns/EscapeSymbolPattern.php | 25 ++ .../Blade/Patterns/GenericPattern.php | 31 +++ .../Blade/Patterns/KeywordPattern.php | 46 ++++ .../CustomBase/CustomBaseLanguage.php | 36 +++ .../Injections/AdditionTL2Injection.php | 37 +++ .../Injections/AdditionTLInjection.php | 37 +++ .../AdditionTLMultilineEndInjection.php | 37 +++ .../AdditionTLMultilineStartInjection.php | 37 +++ .../Injections/DeletionTL2Injection.php | 37 +++ .../Injections/DeletionTLInjection.php | 37 +++ .../CustomHL/Languages/Html/HtmlConst.php | 137 ++++++++++ .../CustomHL/Languages/Html/HtmlLanguage.php | 43 +++ .../Html/Injections/HtmlCloseTagInjection.php | 42 +++ .../Html/Injections/HtmlOpenTagInjection.php | 42 +++ .../Injections/JavaScriptInHtmlInjection.php | 24 ++ .../CustomHL/Languages/Ini/IniLanguage.php | 33 +++ .../Ini/Patterns/ConstantPattern.php | 25 ++ .../Ini/Patterns/DoubleQuoteValuePattern.php | 25 ++ .../JavaScript/JavaScriptLanguage.php | 128 +++++++++ .../JavaScript/Patterns/DigitsPattern.php | 25 ++ .../JavaScript/Patterns/JsKeywordPattern.php | 44 +++ .../JavaScript/Patterns/JsMethodPattern.php | 25 ++ .../JavaScript/Patterns/JsPropertyPattern.php | 25 ++ .../Patterns/JsSingleQuoteValuePattern.php | 25 ++ .../Languages/Nginx/NginxLanguage.php | 57 ++++ .../Patterns/DoubleQuoteValuePattern.php | 25 ++ .../Nginx/Patterns/KeywordPattern.php | 46 ++++ .../Nginx/Patterns/LocationPathPattern.php | 25 ++ .../Nginx/Patterns/OperatorPattern.php | 29 ++ .../Nginx/Patterns/VariablesPattern.php | 25 ++ .../Php/Injections/NewObjectInjection.php | 35 +++ .../Php/Injections/PhpDocCommentInjection.php | 37 +++ .../PhpDocCommentParamTypeInjection.php | 90 ++++++ .../PhpDocCommentReturnTypeInjection.php | 87 ++++++ .../PhpFunctionParametersInjection.php | 29 ++ .../Php/Injections/ReturnTypeInjection.php | 47 ++++ .../Injections/SingleQuoteValueInjection.php | 34 +++ .../Injections/SinglelineCommentInjection.php | 51 ++++ .../Injections/TypeForVariableInjection.php | 52 ++++ .../Php/Patterns/ClassNamePattern.php | 25 ++ .../Php/Patterns/ClassResolutionPattern.php | 25 ++ .../Php/Patterns/ConstantNamePattern.php | 25 ++ .../Php/Patterns/DelimeterPattern.php | 31 +++ .../Languages/Php/Patterns/DigitsPattern.php | 25 ++ .../Php/Patterns/EnumBackedTypePattern.php | 28 ++ .../Php/Patterns/EnumCasePattern.php | 25 ++ .../Languages/Php/Patterns/ExtendsPattern.php | 25 ++ .../Php/Patterns/FunctionCallPattern.php | 25 ++ .../Languages/Php/Patterns/GenericPattern.php | 31 +++ .../Php/Patterns/ImplementsPattern.php | 25 ++ .../Php/Patterns/InstanceOfPattern.php | 25 ++ .../Languages/Php/Patterns/KeywordPattern.php | 46 ++++ .../Php/Patterns/NamedArgumentPattern.php | 25 ++ .../Php/Patterns/NewObjectPattern.php | 25 ++ .../Php/Patterns/OperatorPattern.php | 29 ++ .../Php/Patterns/PhpCloseTagPattern.php | 25 ++ .../PhpDocCommentReturnTypePattern.php | 27 ++ ...pDocCommentReturnTypeSingleLinePattern.php | 25 ++ .../Php/Patterns/PhpDocCommentTagPattern.php | 25 ++ .../Patterns/PhpDocCommentVarTypePattern.php | 25 ++ .../Php/Patterns/PhpOpenTagPattern.php | 25 ++ .../Php/Patterns/StaticClassCallPattern.php | 26 ++ .../Php/Patterns/TypeForVariablePattern.php | 25 ++ .../Languages/Php/Patterns/UriPathPattern.php | 25 ++ .../Languages/Php/Patterns/UsePattern.php | 25 ++ .../CustomHL/Languages/Php/PhpConst.php | 18 ++ .../Languages/Php/PhpDocCommentLanguage.php | 51 ++++ .../CustomHL/Languages/Php/PhpLanguage.php | 257 ++++++++++++++++++ .../Languages/Php/PhpTypeLanguage.php | 69 +++++ .../Shell/Patterns/DelimeterPattern.php | 31 +++ .../Patterns/DoubleQuoteValuePattern.php | 25 ++ .../Shell/Patterns/QuoteValuePattern.php | 25 ++ .../Shell/Patterns/ShellKeyPattern.php | 25 ++ .../Languages/Shell/ShellLanguage.php | 46 ++++ .../Injections/VueScriptSetupInjection.php | 26 ++ .../Vue/Patterns/ConstNamePattern.php | 25 ++ .../Vue/Patterns/FunctionCallPattern.php | 25 ++ .../Vue/Patterns/OperatorPattern.php | 29 ++ .../Vue/Patterns/SingleQuoteValuePattern.php | 25 ++ .../Vue/Patterns/VueKeywordPattern.php | 46 ++++ .../Vue/Patterns/VueScriptSetupPattern.php | 25 ++ .../CustomHL/Languages/Vue/VueLanguage.php | 56 ++++ .../Languages/Vue/VueSetupLanguage.php | 46 ++++ .../Patterns/XmlAttributeDelimeterPattern.php | 25 ++ .../Xml/Patterns/XmlAttributePattern.php | 27 ++ .../Xml/Patterns/XmlAttributeValuePattern.php | 25 ++ .../Xml/Patterns/XmlCloseTagPattern.php | 25 ++ .../Xml/Patterns/XmlCommentPattern.php | 25 ++ .../Xml/Patterns/XmlDoctypePattern.php | 27 ++ .../Xml/Patterns/XmlEndCloseTagPattern.php | 25 ++ .../Xml/Patterns/XmlOpenTagPattern.php | 25 ++ .../Xml/Patterns/XmlStartOpenTagPattern.php | 25 ++ .../CustomHL/Languages/Xml/XmlLanguage.php | 48 ++++ app/MarkDown/CustomHL/style.css | 246 +++++++++++++++++ app/MarkDown/GitHubMarkdownConverter.php | 56 ++++ public/build/assets/app-bdQfWviv.css | 12 + 112 files changed, 4343 insertions(+), 11 deletions(-) create mode 100644 app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php create mode 100644 app/MarkDown/CustomHL/CommonMark/IndentedCodeBlockRenderer.php create mode 100644 app/MarkDown/CustomHL/IsInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Bash/BashLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/BladeLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Injections/BladeKeywordParametersInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Injections/BladePhpInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Injections/BladeRawEchoInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Injections/SingleQuoteValueInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeCommentPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeComponentCloseTagPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeComponentOpenTagPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeKeywordPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Patterns/DelimeterPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Patterns/EscapeSymbolPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Patterns/GenericPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Blade/Patterns/KeywordPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/CustomBase/CustomBaseLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTL2Injection.php create mode 100644 app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLMultilineEndInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLMultilineStartInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTL2Injection.php create mode 100644 app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Html/HtmlConst.php create mode 100644 app/MarkDown/CustomHL/Languages/Html/HtmlLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Html/Injections/HtmlCloseTagInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Html/Injections/HtmlOpenTagInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Html/Injections/JavaScriptInHtmlInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Ini/Patterns/ConstantPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Patterns/DigitsPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsKeywordPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsMethodPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsPropertyPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSingleQuoteValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Nginx/NginxLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Nginx/Patterns/DoubleQuoteValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Nginx/Patterns/KeywordPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Nginx/Patterns/LocationPathPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Nginx/Patterns/OperatorPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Nginx/Patterns/VariablesPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/NewObjectInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentParamTypeInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/PhpFunctionParametersInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/ReturnTypeInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/TypeForVariableInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/ClassNamePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/ClassResolutionPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/ConstantNamePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/DelimeterPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/DigitsPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/EnumBackedTypePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/EnumCasePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/ExtendsPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/GenericPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/ImplementsPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/InstanceOfPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/KeywordPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/NamedArgumentPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/NewObjectPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/OperatorPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/PhpCloseTagPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentReturnTypePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentReturnTypeSingleLinePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentTagPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentVarTypePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/PhpOpenTagPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/StaticClassCallPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/TypeForVariablePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/UriPathPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/PhpConst.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/PhpDocCommentLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Shell/Patterns/DelimeterPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Shell/Patterns/DoubleQuoteValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Shell/Patterns/QuoteValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Shell/Patterns/ShellKeyPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Vue/Injections/VueScriptSetupInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Vue/Patterns/ConstNamePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Vue/Patterns/FunctionCallPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Vue/Patterns/OperatorPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Vue/Patterns/SingleQuoteValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Vue/Patterns/VueKeywordPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Vue/Patterns/VueScriptSetupPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Vue/VueLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Vue/VueSetupLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeDelimeterPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlCloseTagPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlCommentPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlEndCloseTagPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/XmlLanguage.php create mode 100644 app/MarkDown/CustomHL/style.css create mode 100644 app/MarkDown/GitHubMarkdownConverter.php diff --git a/app/Docs.php b/app/Docs.php index f9c0575e..43b5f09a 100644 --- a/app/Docs.php +++ b/app/Docs.php @@ -11,9 +11,9 @@ use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; -use Laravel\Unfenced\UnfencedExtension; use Symfony\Component\DomCrawler\Crawler; use Symfony\Component\Yaml\Yaml; +use App\Markdown\GitHubMarkdownConverter; class Docs { @@ -126,16 +126,12 @@ public function variables(?string $key = null): mixed */ public function content(): ?string { - return once(function () { - return Str::of($this->raw()) + $content = Str::of($this->raw()) ->replace('{{version}}', $this->version) ->after('---') - ->after('---') - ->markdown(extensions: [ - new UnfencedExtension, - ]) - ->toString(); - }); + ->after('---'); + + return (new GitHubMarkdownConverter)->convert($content); } /** @@ -149,11 +145,18 @@ public function content(): ?string */ public function view(string $view) { - $data = Cache::remember('doc-file-view-data'.$this->path, now()->addMinutes(30), fn () => collect()->merge($this->variables())->merge([ + // Cache во время разработки не нужен + //$data = Cache::remember('doc-file-view-data'.$this->path, now()->addMinutes(30), fn () => collect()->merge($this->variables())->merge([ + // 'docs' => $this, + // 'content' => $this->content(), + // 'edit' => $this->getEditUrl(), + //])); + + $data = collect()->merge($this->variables())->merge([ 'docs' => $this, 'content' => $this->content(), 'edit' => $this->getEditUrl(), - ])); + ]); return view($view, $data); } diff --git a/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php b/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php new file mode 100644 index 00000000..55cc1a07 --- /dev/null +++ b/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php @@ -0,0 +1,52 @@ +highlighter->addLanguage(new PhpLanguage()); + $this->highlighter->addLanguage(new ShellLanguage()); + $this->highlighter->addLanguage(new BashLanguage()); + $this->highlighter->addLanguage(new IniLanguage()); + $this->highlighter->addLanguage(new BladeLanguage()); + $this->highlighter->addLanguage(new VueLanguage()); + $this->highlighter->addLanguage(new NginxLanguage()); + $this->highlighter->addLanguage(new JavaScriptLanguage()); +// $this->highlighter->addLanguage(new HtmlLanguage()); + $this->highlighter->addLanguage(new XmlLanguage()); + } + + public function register(EnvironmentBuilderInterface $environment): void + { + $environment + ->addRenderer(FencedCode::class, new CodeBlockRenderer($this->highlighter), 10) + ->addRenderer(IndentedCode::class, new IndentedCodeBlockRenderer($this->highlighter), 10) + //->addRenderer(Code::class, new InlineCodeBlockRenderer($this->highlighter), 10) + ; + } +} diff --git a/app/MarkDown/CustomHL/CommonMark/IndentedCodeBlockRenderer.php b/app/MarkDown/CustomHL/CommonMark/IndentedCodeBlockRenderer.php new file mode 100644 index 00000000..86d3f13b --- /dev/null +++ b/app/MarkDown/CustomHL/CommonMark/IndentedCodeBlockRenderer.php @@ -0,0 +1,52 @@ +[\w]+)(\{(?[\d]+)\})?/', $node->getInfoWords()[0] ?? 'php', $matches); + + $highlighter = $this->highlighter; + + //if ($startAt = ($matches['startAt']) ?? null) { + // $highlighter = $highlighter->withGutter((int)$startAt); + //} + + //$language = $matches['language'] ?? 'php'; + $language = 'php'; + + $parsed = $highlighter->parse($node->getLiteral(), $language); + + $theme = $highlighter->getTheme(); + + if ($theme instanceof WebTheme) { + return $theme->preBefore($highlighter) . $parsed . $theme->preAfter($highlighter); + } else { + return '
' . $parsed . '
'; + } + } +} diff --git a/app/MarkDown/CustomHL/IsInjection.php b/app/MarkDown/CustomHL/IsInjection.php new file mode 100644 index 00000000..c2a2ac97 --- /dev/null +++ b/app/MarkDown/CustomHL/IsInjection.php @@ -0,0 +1,54 @@ +getPattern(); + + if (! str_starts_with($pattern, '/')) { + $pattern = "/{$pattern}/"; + } + + $cc = $this->clearContent($content); + $result = preg_replace_callback( + pattern: $pattern, + callback: function ($matches) use ($highlighter) { + $content = $matches['match'] ?? ''; + + if (! $content) { + return $matches[0]; + } + + return str_replace( + search: $content, + replace: $this->parseContent($content, $highlighter), + subject: $matches[0], + ); + }, + subject: $cc, //$content, + ); + + return new ParsedInjection($result ?? $content); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Bash/BashLanguage.php b/app/MarkDown/CustomHL/Languages/Bash/BashLanguage.php new file mode 100644 index 00000000..a8d69cf6 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Bash/BashLanguage.php @@ -0,0 +1,33 @@ +)'), // {{|}}| // /(?({!!|!!}|\<[^!](\/)?|\<(?!\!\--)|\>|=\>))/ + new GenericPattern('/(?({{(?!\-\-)))/', 'hl-blade-delimeter'), // /(?({{(?!\-\-)|[^\-]}}|{!!|!!}))/ + new GenericPattern('/[^\-](?(}}))/', 'hl-blade-delimeter'), // /(?({{(?!\-\-)|[^\-]}}|{!!|!!}))/ + new GenericPattern('/(?(\<(\/)?))[^!]/', 'hl-blade-delimeter'), // /(?({{(?!\-\-)|[^\-]}}|{!!|!!}))/ + new GenericPattern('/[^\-](?(\>))/', 'hl-blade-delimeter'), // /(?({{(?!\-\-)|[^\-]}}|{!!|!!}))/ + new EscapeSymbolPattern(), + + new KeywordPattern('as'), + ]; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php new file mode 100644 index 00000000..e648f1fb --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php @@ -0,0 +1,26 @@ +.*)(}})'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + return $highlighter->parse($content, 'php'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeKeywordParametersInjection.php b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeKeywordParametersInjection.php new file mode 100644 index 00000000..d4e5908d --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeKeywordParametersInjection.php @@ -0,0 +1,24 @@ +.*)\)/'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + return $highlighter->parse($content, 'php'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Injections/BladePhpInjection.php b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladePhpInjection.php new file mode 100644 index 00000000..64bc1592 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladePhpInjection.php @@ -0,0 +1,24 @@ +(\@php|<\?php)(.|\n)*?(\@endphp|\?>))/'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + return $highlighter->parse($content, 'php'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeRawEchoInjection.php b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeRawEchoInjection.php new file mode 100644 index 00000000..f1a546a0 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeRawEchoInjection.php @@ -0,0 +1,26 @@ +.*)(!!})'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $clear_content = Escape::terminal($content); + return $highlighter->parse($clear_content, 'php'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Injections/SingleQuoteValueInjection.php b/app/MarkDown/CustomHL/Languages/Blade/Injections/SingleQuoteValueInjection.php new file mode 100644 index 00000000..e84dd368 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Injections/SingleQuoteValueInjection.php @@ -0,0 +1,34 @@ +'.*?')"; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $theme = $highlighter->getTheme(); + + $clear_content = Escape::terminal($content); + + return //Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType('hl-blade-value'))) + . $clear_content + . Escape::tokens($theme->after(new DynamicTokenType('hl-blade-value'))) + ; //); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeCommentPattern.php b/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeCommentPattern.php new file mode 100644 index 00000000..f9478363 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeCommentPattern.php @@ -0,0 +1,25 @@ +\{\{\-\-(.|\n)*?\-\-\}\})'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-blade-comment'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeComponentCloseTagPattern.php b/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeComponentCloseTagPattern.php new file mode 100644 index 00000000..25bb7ec1 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeComponentCloseTagPattern.php @@ -0,0 +1,25 @@ +x\-[\w\-\:\.]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-blade-component'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeComponentOpenTagPattern.php b/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeComponentOpenTagPattern.php new file mode 100644 index 00000000..c1297e6e --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeComponentOpenTagPattern.php @@ -0,0 +1,25 @@ +x\-[\w\-\:\.]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-blade-component'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeKeywordPattern.php b/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeKeywordPattern.php new file mode 100644 index 00000000..9ec5c482 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Patterns/BladeKeywordPattern.php @@ -0,0 +1,25 @@ +\@[\w]+)\b'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-blade-keyword'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Patterns/DelimeterPattern.php b/app/MarkDown/CustomHL/Languages/Blade/Patterns/DelimeterPattern.php new file mode 100644 index 00000000..fd4572a5 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Patterns/DelimeterPattern.php @@ -0,0 +1,31 @@ +{$this->delimeter})/"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } + +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Patterns/EscapeSymbolPattern.php b/app/MarkDown/CustomHL/Languages/Blade/Patterns/EscapeSymbolPattern.php new file mode 100644 index 00000000..6d1ffb00 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Patterns/EscapeSymbolPattern.php @@ -0,0 +1,25 @@ +@)[\{@]+/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-blade-escape'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Patterns/GenericPattern.php b/app/MarkDown/CustomHL/Languages/Blade/Patterns/GenericPattern.php new file mode 100644 index 00000000..1ffc3c3e --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Patterns/GenericPattern.php @@ -0,0 +1,31 @@ +pattern; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Blade/Patterns/KeywordPattern.php b/app/MarkDown/CustomHL/Languages/Blade/Patterns/KeywordPattern.php new file mode 100644 index 00000000..9de4010d --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Blade/Patterns/KeywordPattern.php @@ -0,0 +1,46 @@ +caseInsensitive = true; + + return $this; + } + + public function getPattern(): string + { + $pattern = "/\b(?)*(?{$this->keyword})(\$|\,|\)|\;|\:|\s|\()/"; + + if ($this->caseInsensitive) { + $pattern .= 'i'; + } + + return $pattern; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/CustomBaseLanguage.php b/app/MarkDown/CustomHL/Languages/CustomBase/CustomBaseLanguage.php new file mode 100644 index 00000000..1539f3cc --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CustomBase/CustomBaseLanguage.php @@ -0,0 +1,36 @@ +(.)*\<\!\-\- \[tl\! add\] \-\-\>)/', $content, $matches, PREG_OFFSET_CAPTURE); + + foreach ($matches['match'] as $match) { + $matchedContent = $match[0]; + + $open = '{+'; + $close = '+}'; //' +}'; + + $parsedMatchedContent = $open . str_replace( // Escape::INJECTION_TOKEN . + '', + $close, // Escape::INJECTION_TOKEN . + $matchedContent, + ); + + $content = str_replace($matchedContent, $parsedMatchedContent, $content); + } + + return new ParsedInjection($content); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLInjection.php b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLInjection.php new file mode 100644 index 00000000..c19893c2 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLInjection.php @@ -0,0 +1,37 @@ +(.)*\/\/ \[tl\! add\])/', $content, $matches, PREG_OFFSET_CAPTURE); // /(?(.)*\/\/ \[tl\! add\])/ + + foreach ($matches['match'] as $match) { + $matchedContent = $match[0]; + + $open = '{+'; + $close = '+}'; //' +}'; + + $parsedMatchedContent = $open . str_replace( // Escape::INJECTION_TOKEN . + '// [tl! add]', + $close, // Escape::INJECTION_TOKEN . + $matchedContent, + ); + + $content = str_replace($matchedContent, $parsedMatchedContent, $content); + } + + return new ParsedInjection($content); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLMultilineEndInjection.php b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLMultilineEndInjection.php new file mode 100644 index 00000000..82c2cf15 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLMultilineEndInjection.php @@ -0,0 +1,37 @@ +(.)*\/\/ \[tl\! add\:end\])/', $content, $matches, PREG_OFFSET_CAPTURE); // /(?(.)*\/\/ \[tl\! add\])/ + + foreach ($matches['match'] as $match) { + $matchedContent = $match[0]; + + //$open = '{+'; + $close = '+}'; //' +}'; + + $parsedMatchedContent = str_replace( + '// [tl! add:end]', + $close, // Escape::INJECTION_TOKEN . + $matchedContent, + ); + + $content = str_replace($matchedContent, $parsedMatchedContent, $content); + } + + return new ParsedInjection($content); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLMultilineStartInjection.php b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLMultilineStartInjection.php new file mode 100644 index 00000000..ff4ba7a0 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLMultilineStartInjection.php @@ -0,0 +1,37 @@ +(.)*\/\/ \[tl\! add\:start\])/', $content, $matches, PREG_OFFSET_CAPTURE); // /(?(.)*\/\/ \[tl\! add\])/ + + foreach ($matches['match'] as $match) { + $matchedContent = $match[0]; + + $open = '{+'; + //$close = ' +}'; + + $parsedMatchedContent = $open . str_replace( // Escape::INJECTION_TOKEN . + '// [tl! add:start]', + '', + $matchedContent, + ); + + $content = str_replace($matchedContent, $parsedMatchedContent, $content); + } + + return new ParsedInjection($content); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTL2Injection.php b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTL2Injection.php new file mode 100644 index 00000000..35905c41 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTL2Injection.php @@ -0,0 +1,37 @@ +(.)*\<\!\-\- \[tl\! remove\] \-\-\>)/', $content, $matches, PREG_OFFSET_CAPTURE); + + foreach ($matches['match'] as $match) { + $matchedContent = $match[0]; + + $open = '{-'; + $close = '-}'; //' -}'; + + $parsedMatchedContent = $open . str_replace( // Escape::INJECTION_TOKEN . + '', + $close, // Escape::INJECTION_TOKEN . + $matchedContent, + ); + + $content = str_replace($matchedContent, $parsedMatchedContent, $content); + } + + return new ParsedInjection($content); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php new file mode 100644 index 00000000..0eaad60c --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php @@ -0,0 +1,37 @@ +(.)*\/\/ \[tl\! remove\])/', $content, $matches, PREG_OFFSET_CAPTURE); + + foreach ($matches['match'] as $match) { + $matchedContent = $match[0]; + + $open = '{-'; + $close = '-}'; //' -}'; + + $parsedMatchedContent = $open . str_replace( // Escape::INJECTION_TOKEN . + '// [tl! remove]', + Escape::INJECTION_TOKEN . $close, // Escape::INJECTION_TOKEN . + $matchedContent, + ); + + $content = str_replace($matchedContent, $parsedMatchedContent, $content); + } + + return new ParsedInjection($content); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Html/HtmlConst.php b/app/MarkDown/CustomHL/Languages/Html/HtmlConst.php new file mode 100644 index 00000000..09af2a1c --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Html/HtmlConst.php @@ -0,0 +1,137 @@ +[\w\-]+)'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $keywords = HtmlConst::TAGS; + //dd($content); + $theme = $highlighter->getTheme(); + + //foreach ($types as $type) { + $token = (in_array($content, $keywords)) ? 'hl-xml-tag' : 'hl-xml-attr'; + $content = preg_replace( + '/\b' . $content . '[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType($token))) + . $content + . Escape::tokens($theme->after(new DynamicTokenType($token))), + $content, + ); + //} + + return $content; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Html/Injections/HtmlOpenTagInjection.php b/app/MarkDown/CustomHL/Languages/Html/Injections/HtmlOpenTagInjection.php new file mode 100644 index 00000000..0a7531d5 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Html/Injections/HtmlOpenTagInjection.php @@ -0,0 +1,42 @@ +[\w\-]+)'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $keywords = HtmlConst::TAGS; + //dd($content); + $theme = $highlighter->getTheme(); + + //foreach ($types as $type) { + $token = (in_array($content, $keywords)) ? 'hl-xml-tag' : 'hl-xml-attr'; + $content = preg_replace( + '/\b' . $content . '[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType($token))) + . $content + . Escape::tokens($theme->after(new DynamicTokenType($token))), + $content, + ); + //} + + return $content; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Html/Injections/JavaScriptInHtmlInjection.php b/app/MarkDown/CustomHL/Languages/Html/Injections/JavaScriptInHtmlInjection.php new file mode 100644 index 00000000..dbc8c3c1 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Html/Injections/JavaScriptInHtmlInjection.php @@ -0,0 +1,24 @@ +(?(.|\n|\r)*)<\/script>'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + return $highlighter->parse($content, 'js'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php b/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php new file mode 100644 index 00000000..f9f3420b --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php @@ -0,0 +1,33 @@ +[\S]+)=/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-ini-constant'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php new file mode 100644 index 00000000..e9db3235 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php @@ -0,0 +1,25 @@ +.*?)"'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-ini-value'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php b/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php new file mode 100644 index 00000000..51a4b072 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php @@ -0,0 +1,128 @@ +[0-9]+)[\w]*/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-number'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsKeywordPattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsKeywordPattern.php new file mode 100644 index 00000000..3664569c --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsKeywordPattern.php @@ -0,0 +1,44 @@ +caseInsensitive = true; + + return $this; + } + + public function getPattern(): string + { + $pattern = "/\b(?{$this->keyword})(\,|\.|\)|\;|\:|\s|\()/"; + + if ($this->caseInsensitive) { + $pattern .= 'i'; + } + + return $pattern; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-keyword'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsMethodPattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsMethodPattern.php new file mode 100644 index 00000000..3c3bf28c --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsMethodPattern.php @@ -0,0 +1,25 @@ +[\w]+)\('; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-property'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsPropertyPattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsPropertyPattern.php new file mode 100644 index 00000000..5523e041 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsPropertyPattern.php @@ -0,0 +1,25 @@ +[\w\$]+)\(/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-property'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSingleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSingleQuoteValuePattern.php new file mode 100644 index 00000000..7958dfdd --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSingleQuoteValuePattern.php @@ -0,0 +1,25 @@ +.*?)'"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-value'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Nginx/NginxLanguage.php b/app/MarkDown/CustomHL/Languages/Nginx/NginxLanguage.php new file mode 100644 index 00000000..ab1076c5 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Nginx/NginxLanguage.php @@ -0,0 +1,57 @@ +".*?")'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-nginx-value'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Nginx/Patterns/KeywordPattern.php b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/KeywordPattern.php new file mode 100644 index 00000000..66a00b8a --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/KeywordPattern.php @@ -0,0 +1,46 @@ +caseInsensitive = true; + + return $this; + } + + public function getPattern(): string + { + $pattern = "/\b(?)*(?{$this->keyword})(\$|\,|\)|\;|\:|\s|\()/"; + + if ($this->caseInsensitive) { + $pattern .= 'i'; + } + + return $pattern; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Nginx/Patterns/LocationPathPattern.php b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/LocationPathPattern.php new file mode 100644 index 00000000..04c02e96 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/LocationPathPattern.php @@ -0,0 +1,25 @@ +[\w\/\\\\.\(\)\?!\-\*\$]+)/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-nginx-loc-path'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Nginx/Patterns/OperatorPattern.php b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/OperatorPattern.php new file mode 100644 index 00000000..8958ebc8 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/OperatorPattern.php @@ -0,0 +1,29 @@ +{$this->operator})(\s|\()/"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-nginx-operator'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Nginx/Patterns/VariablesPattern.php b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/VariablesPattern.php new file mode 100644 index 00000000..234946d1 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/VariablesPattern.php @@ -0,0 +1,25 @@ +[\w\-]+)/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-nginx-variable'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/NewObjectInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/NewObjectInjection.php new file mode 100644 index 00000000..57c270fe --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/NewObjectInjection.php @@ -0,0 +1,35 @@ +[\w\\\\]+)'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $theme = $highlighter->getTheme(); + + $clear_content = Escape::terminal($content); + return Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType('hl-php-type'))) + . $clear_content + . Escape::tokens($theme->after(new DynamicTokenType('hl-php-type'))) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentInjection.php new file mode 100644 index 00000000..590ba85f --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentInjection.php @@ -0,0 +1,37 @@ +\/\*\*(.|\n)*?\*\/)/m'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $theme = $highlighter->getTheme(); + //return Escape::tokens('') . $highlighter->parse($content, new PhpDocCommentLanguage()) . Escape::tokens(''); + + $clear_content = Escape::terminal($content); + return Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType('hl-php-comment'))) + . $highlighter->parse($clear_content, new PhpDocCommentLanguage()) + . Escape::tokens($theme->after(new DynamicTokenType('hl-php-comment'))) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentParamTypeInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentParamTypeInjection.php new file mode 100644 index 00000000..193ac527 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentParamTypeInjection.php @@ -0,0 +1,90 @@ +.*?) \\$'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $keywords = PhpConst::SYS_KEYWORDS; + + $types_tm = explode('|', trim($content)); + + $types = array(); + + foreach($types_tm as $type) { + $tm = explode(':', trim($type)); + foreach($tm as $t) { + //if (strpos($content, ':') == 0){ + // dd($content, $t); + //} + //preg_match_all('/(?[\w\\\\\-]*?)\(([\w\\\\\-]*?)(\s)*?\)/', $t, $match, PREG_OFFSET_CAPTURE); + preg_match_all('/(?[\w\\\\\-]+)(\(([\w\\\\\-]+)(\s)*?\))*/', $t, $match, PREG_OFFSET_CAPTURE); + + if (! $match) { + continue; + } + + $k = $match['match']; + + array_walk($k, function($val, $key) use (&$types) { + if (!empty(trim($val[$key]))) { + array_push($types, trim($val[$key])); + } + }); + + //preg_match_all('/([\w\\\\\-]*?)\((?[\w\\\\\-]*?)(\s)*?\)/', $t, $match, PREG_OFFSET_CAPTURE); + preg_match_all('/([\w\\\\\-]+)(\((?[\w\\\\\-]+)(\s)*?\))*/', $t, $match, PREG_OFFSET_CAPTURE); + + if (! $match) { + continue; + } + + $k = $match['match']; + + array_walk($k, function($val, $key) use (&$types) { + if (!empty(trim($val[$key]))) { + array_push($types, trim($val[$key])); + } + }); + + } + } + //dd($content, $types, $tm); + + $theme = $highlighter->getTheme(); + + foreach ($types as $type) { + $t = explode('\\', $type); + $type = $t[count($t) - 1]; + //dd($type); + $token = (in_array($type, $keywords)) ? 'hl-php-keyword' : 'hl-php-type'; + $content = preg_replace( + '/\b' . $type . '[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType($token))) + . $type + . Escape::tokens($theme->after(new DynamicTokenType($token))), + $content, + ); + } + //dd($content); + + return $content; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php new file mode 100644 index 00000000..642cd218 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php @@ -0,0 +1,87 @@ +.*?)(\*\/|$|\R)'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $keywords = PhpConst::SYS_KEYWORDS; + + $types = explode('|', trim($content)); + + $theme = $highlighter->getTheme(); + + foreach ($types as $type) { + preg_match('/(?array[\s]*\<.*?\>)/', $type, $matches); + if (key_exists('match', $matches)) + { + $content = preg_replace( + '/\barray[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType('hl-php-keyword'))) + . 'array' + . Escape::tokens($theme->after(new DynamicTokenType('hl-php-keyword'))), + $content, + ); + + preg_match('/array[\s]*\<(?.*?)\>/', $type, $matches); + + if (key_exists('match', $matches)) + { + $tks = explode(',', $matches['match']); + + foreach ($tks as $tk) { + $tk = trim($tk); + + $t = explode('\\', $tk); + $tk = $t[count($t) - 1]; + + $token = (in_array($tk, $keywords)) ? 'hl-php-keyword' : 'hl-php-type'; + + $content = preg_replace( + '/\b' . $tk . '[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType($token))) + . $tk + . Escape::tokens($theme->after(new DynamicTokenType($token))), + $content, + ); + } + } + } + else + { + $t = explode('\\', $type); + $type = $t[count($t) - 1]; + + $token = (in_array($type, $keywords)) ? 'hl-php-keyword' : 'hl-php-type'; + + $content = preg_replace( + '/\b' . $type . '[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType($token))) + . $type + . Escape::tokens($theme->after(new DynamicTokenType($token))), + $content, + ); + } + } + + return $content; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpFunctionParametersInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpFunctionParametersInjection.php new file mode 100644 index 00000000..74fc19c7 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpFunctionParametersInjection.php @@ -0,0 +1,29 @@ +(.|\n)*?)({|\)[\s]*({|;|:|=>))'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + //echo '
' . print_r($content, true) . '
'; + return Escape::injection( + $highlighter->parse($content, new PhpTypeLanguage()) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/ReturnTypeInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/ReturnTypeInjection.php new file mode 100644 index 00000000..d27b2bb0 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/ReturnTypeInjection.php @@ -0,0 +1,47 @@ +[\w\(\)\&\|\?]+)[\s{;\n]'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $keywords = PhpConst::SYS_KEYWORDS; + + $types = explode('|', trim($content)); + + $theme = $highlighter->getTheme(); + + foreach ($types as $type) { + $t = explode('\\', $type); + $type = $t[count($t) - 1]; + + $token = (in_array($type, $keywords)) ? 'hl-php-keyword' : 'hl-php-type'; + $content = preg_replace( + '/\b' . $type . '[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType($token))) + . $type + . Escape::tokens($theme->after(new DynamicTokenType($token))), + $content, + ); + } + + return $content; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php new file mode 100644 index 00000000..31e5ed64 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php @@ -0,0 +1,34 @@ +.*?)'"; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $theme = $highlighter->getTheme(); + + $clear_content = Escape::terminal($content); + + return Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType('hl-php-value'))) + . $clear_content + . Escape::tokens($theme->after(new DynamicTokenType('hl-php-value'))) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php new file mode 100644 index 00000000..c34675f4 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php @@ -0,0 +1,51 @@ +\/\/(.)*)'; //(\r\n)*? + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + preg_match_all('/(?❷\/span❸)/', $content, $m1, PREG_OFFSET_CAPTURE); + preg_match_all('/(?❷span)/', $content, $m2, PREG_OFFSET_CAPTURE); + if (count($m1['match']) != count($m2['match'])) { + return $content; + } + //dd($content, $m1, $m2); + $theme = $highlighter->getTheme(); + //return Escape::tokens('') . $highlighter->parse($content, new PhpDocCommentLanguage()) . Escape::tokens(''); + $clear_content = str_replace("\r", '', Escape::terminal($content)); + + //$clear_content = $this->clearContent($content); + + //$t = Escape::injection( + // Escape::tokens($theme->before(new DynamicTokenType('hl-php-comment'))) + // . $clear_content + // . Escape::tokens($theme->after(new DynamicTokenType('hl-php-comment'))) + //); + + //if (strpos($content, 'throttle') > 0) { dd($content, $clear_content, $t); } + return Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType('hl-php-comment'))) + . $clear_content //$content //$clear_content + . Escape::tokens($theme->after(new DynamicTokenType('hl-php-comment'))) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/TypeForVariableInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/TypeForVariableInjection.php new file mode 100644 index 00000000..eb30dbdd --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/TypeForVariableInjection.php @@ -0,0 +1,52 @@ +[\w\&\(\)\|\\\\\?]+)\s+(\.*)\\$'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $keywords = PhpConst::SYS_KEYWORDS; + + $types = explode('|', trim($content)); + + $theme = $highlighter->getTheme(); + + foreach ($types as $type) { + $type = str_replace('?', '', $type); + + $t = explode('\\', $type); + $type = $t[count($t) - 1]; + + + //echo '
' . print_r($types) . '
'; + + $token = (in_array($type, $keywords)) ? 'hl-php-keyword' : 'hl-php-type'; + $content = preg_replace( + '/\b' . $type . '[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType($token))) + . $type + . Escape::tokens($theme->after(new DynamicTokenType($token))), + $content, + ); + } + + return $content; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/ClassNamePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/ClassNamePattern.php new file mode 100644 index 00000000..eed884a6 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/ClassNamePattern.php @@ -0,0 +1,25 @@ +[\w]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-type'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/ClassResolutionPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/ClassResolutionPattern.php new file mode 100644 index 00000000..abf76475 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/ClassResolutionPattern.php @@ -0,0 +1,25 @@ +class)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-keyword'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/ConstantNamePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/ConstantNamePattern.php new file mode 100644 index 00000000..ac526094 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/ConstantNamePattern.php @@ -0,0 +1,25 @@ +[A-Z_]+)\b'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-constant'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/DelimeterPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/DelimeterPattern.php new file mode 100644 index 00000000..e1abd5a9 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/DelimeterPattern.php @@ -0,0 +1,31 @@ +{$this->delimeter})/"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } + +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/DigitsPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/DigitsPattern.php new file mode 100644 index 00000000..98881359 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/DigitsPattern.php @@ -0,0 +1,25 @@ +[0-9]+)[\w]*/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-number'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/EnumBackedTypePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/EnumBackedTypePattern.php new file mode 100644 index 00000000..d2caa74a --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/EnumBackedTypePattern.php @@ -0,0 +1,28 @@ +int|string)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-keyword'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/EnumCasePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/EnumCasePattern.php new file mode 100644 index 00000000..eb7e7945 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/EnumCasePattern.php @@ -0,0 +1,25 @@ +[\w]+)(\s)*(=|;)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-property'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/ExtendsPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/ExtendsPattern.php new file mode 100644 index 00000000..a490f939 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/ExtendsPattern.php @@ -0,0 +1,25 @@ +[\w]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-extends'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php new file mode 100644 index 00000000..42f08c93 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php @@ -0,0 +1,25 @@ +|:]?\b(?[_\-a-z\w]+)\(/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType("hl-php-function"); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/GenericPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/GenericPattern.php new file mode 100644 index 00000000..5bd9fd56 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/GenericPattern.php @@ -0,0 +1,31 @@ +pattern; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/ImplementsPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/ImplementsPattern.php new file mode 100644 index 00000000..5de74dbc --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/ImplementsPattern.php @@ -0,0 +1,25 @@ +[\s\,\w]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-implements'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/InstanceOfPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/InstanceOfPattern.php new file mode 100644 index 00000000..4185e72f --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/InstanceOfPattern.php @@ -0,0 +1,25 @@ +[\w\\\\]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-type'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/KeywordPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/KeywordPattern.php new file mode 100644 index 00000000..0f3310cb --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/KeywordPattern.php @@ -0,0 +1,46 @@ +caseInsensitive = true; + + return $this; + } + + public function getPattern(): string + { + $pattern = "/\b(?)*(?{$this->keyword})(\$|\,|\)|\;|\:|\s|\(|\-\>)/"; + + if ($this->caseInsensitive) { + $pattern .= 'i'; + } + + return $pattern; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/NamedArgumentPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/NamedArgumentPattern.php new file mode 100644 index 00000000..29b66412 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/NamedArgumentPattern.php @@ -0,0 +1,25 @@ +[\w]+):\s'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-property'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/NewObjectPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/NewObjectPattern.php new file mode 100644 index 00000000..cbc551cc --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/NewObjectPattern.php @@ -0,0 +1,25 @@ +[\w\\\\]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-type'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/OperatorPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/OperatorPattern.php new file mode 100644 index 00000000..f0fab598 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/OperatorPattern.php @@ -0,0 +1,29 @@ +{$this->operator})(\s|\()/"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-operator'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpCloseTagPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpCloseTagPattern.php new file mode 100644 index 00000000..fce085ee --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpCloseTagPattern.php @@ -0,0 +1,25 @@ +\?\>+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-slug'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentReturnTypePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentReturnTypePattern.php new file mode 100644 index 00000000..842d40f2 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentReturnTypePattern.php @@ -0,0 +1,27 @@ +.*?)(\*\/|$|\R)'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::TYPE; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentReturnTypeSingleLinePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentReturnTypeSingleLinePattern.php new file mode 100644 index 00000000..5428855a --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentReturnTypeSingleLinePattern.php @@ -0,0 +1,25 @@ +.*?)(\s*\*\/|$)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-keyword'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentTagPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentTagPattern.php new file mode 100644 index 00000000..553a536b --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentTagPattern.php @@ -0,0 +1,25 @@ +\@[\w]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-keyword'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentVarTypePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentVarTypePattern.php new file mode 100644 index 00000000..8d039c02 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpDocCommentVarTypePattern.php @@ -0,0 +1,25 @@ +.*?)( \$|\*|$|\n)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-type'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpOpenTagPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpOpenTagPattern.php new file mode 100644 index 00000000..ec589a04 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/PhpOpenTagPattern.php @@ -0,0 +1,25 @@ +\<\?[=|php]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-slug'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/StaticClassCallPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/StaticClassCallPattern.php new file mode 100644 index 00000000..82bdeb1e --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/StaticClassCallPattern.php @@ -0,0 +1,26 @@ +[\\\\\w]+)\:\:'; + return '(?[A-Za-z]+)\:\:'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-type'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/TypeForVariablePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/TypeForVariablePattern.php new file mode 100644 index 00000000..bc2e8b00 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/TypeForVariablePattern.php @@ -0,0 +1,25 @@ +[\w\&\(\)\|\\\\\?]+)\s+(\.*)\\$'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-type'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/UriPathPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/UriPathPattern.php new file mode 100644 index 00000000..ceea7105 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/UriPathPattern.php @@ -0,0 +1,25 @@ +[\w\:]+)/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-property'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php new file mode 100644 index 00000000..44beca8a --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php @@ -0,0 +1,25 @@ +[\w]+)[;]*/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-type'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpConst.php b/app/MarkDown/CustomHL/Languages/Php/PhpConst.php new file mode 100644 index 00000000..bcfa8bc9 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/PhpConst.php @@ -0,0 +1,18 @@ +|>|=|\*|\+\+)'), + //new OperatorPattern('instanceof'), + ////new OperatorPattern('\?'), + ////new FunctionNamePattern(), + new DelimeterPattern('(\:\:|->|\.)'), + //new DelimeterPattern('->'), + //new DelimeterPattern('[.,(){};\:\[\]]', TokenTypeEnum::PROPERTY), + + //new UriPathPattern(), + + // KEYWORDS + new KeywordPattern('null', 'hl-php-constant'), + new GenericPattern('/(?\$this)(\-|\$|\,|\)|\;|\:|\s|\()/', 'hl-php-this'), + ////new KeywordPattern('parent'), + new KeywordPattern('true', 'hl-php-constant'), + new KeywordPattern('false', 'hl-php-constant'), + ////new KeywordPattern('__halt_compiler'), + new KeywordPattern('app', 'hl-php-constant'), + new KeywordPattern('abstract'), + ////new KeywordPattern('and'), + new KeywordPattern('as'), + ////new KeywordPattern('break'), + ////new KeywordPattern('callable'), + new KeywordPattern('case'), + ////new KeywordPattern('catch'), + new KeywordPattern('class'), + ////new KeywordPattern('clone'), + ////new KeywordPattern('const'), + ////new KeywordPattern('continue'), + ////new KeywordPattern('declare'), + new KeywordPattern('default'), + ////new KeywordPattern('die'), + ////new KeywordPattern('do'), + new KeywordPattern('echo', 'hl-php-constant'), + new KeywordPattern('name', 'hl-php-constant'), + new KeywordPattern('count\+\+', 'hl-php-constant'), + ////new KeywordPattern('else'), + ////new KeywordPattern('elseif'), + ////new KeywordPattern('empty'), + new KeywordPattern('enum'), + ////new KeywordPattern('enddeclare'), + ////new KeywordPattern('endfor'), + new KeywordPattern('endforeach'), + ////new KeywordPattern('endif'), + ////new KeywordPattern('endswitch'), + ////new KeywordPattern('endwhile'), + ////new KeywordPattern('eval'), + ////new KeywordPattern('exit'), + new KeywordPattern('extends'), + ////new KeywordPattern('final'), + ////new KeywordPattern('finally'), + new KeywordPattern('fn'), + ////new KeywordPattern('for'), + new KeywordPattern('foreach'), + new KeywordPattern('function'), + ////new KeywordPattern('global'), + ////new KeywordPattern('goto'), + new KeywordPattern('id', 'hl-php-constant'), + new KeywordPattern('if'), + new KeywordPattern('implements'), + ////new KeywordPattern('include'), + ////new KeywordPattern('include_once'), + new KeywordPattern('instanceof', 'hl-php-constant'), + ////new KeywordPattern('insteadof'), + ////new KeywordPattern('interface'), + ////new KeywordPattern('isset'), + ////new KeywordPattern('list'), + new KeywordPattern('label', 'hl-php-constant'), + new KeywordPattern('match'), + new KeywordPattern('namespace'), + new KeywordPattern('new', 'hl-php-operator'), + ////new KeywordPattern('or'), + new KeywordPattern('photo', 'hl-php-delimeter'), + ////new KeywordPattern('print'), + ////new KeywordPattern('private'), + new KeywordPattern('protected'), + new KeywordPattern('public'), + ////new KeywordPattern('readonly'), + ////new KeywordPattern('require'), + ////new KeywordPattern('require_once'), + new KeywordPattern('return'), + new KeywordPattern('static'), + ////new KeywordPattern('switch'), + ////new KeywordPattern('throw'), + ////new KeywordPattern('trait'), + ////new KeywordPattern('try'), + ////new KeywordPattern('unset'), + new KeywordPattern('use'), + new KeywordPattern('validate', 'hl-php-constant'), + new KeywordPattern('value', 'hl-php-constant'), + ////new KeywordPattern('while'), + ////new KeywordPattern('xor'), + new KeywordPattern('yield'), + ////new KeywordPattern('yield from'), + new ClassResolutionPattern(), + ////new ShortFunctionReferencePattern(), + ////new PropertyHookSetPattern(), + ////new PropertyHookGetPattern(), + new DigitsPattern(), + + // COMMENTS + ////new MultilineSingleDocCommentPattern(), + //new SinglelineCommentPattern(), + + // TYPES + ////new AttributeTypePattern(), + new ImplementsPattern(), + new ExtendsPattern(), + new UsePattern(), + //new UsePatternPath(), + //new NamespacePattern(), + ////new PropertyTypesPattern(), + ////new ConstantTypesPattern(), + new StaticClassCallPattern(), + //new StaticClassCallPathPattern(), + //new NewObjectPattern(), + new InstanceOfPattern(), + ////new UseAsPattern(), + ////new CatchTypePattern(), + new EnumBackedTypePattern(), + ////new GroupedTypePattern(), + ////new PropertyHookSetParameterTypePattern(), + + // PROPERTIES + ////new ClassPropertyPattern(), + ////new PropertyAccessPattern(), + ////new NestedFunctionCallPattern(), + new FunctionCallPattern(), + ////new ConstantPropertyPattern(), + new ConstantNamePattern(), + ////new UntypedClassPropertyPattern(), + new EnumCasePattern(), + ////new StaticPropertyPattern(), + + // VARIABLES + //new VariablePattern(), + + // VALUES + //new SingleQuoteValuePattern(), + //new DoubleQuoteValuePattern(), + ]; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php b/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php new file mode 100644 index 00000000..1c98358b --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php @@ -0,0 +1,69 @@ +|>|=|\*)'), + //new KeywordPattern('array'), + //new KeywordPattern('bool'), + new KeywordPattern('public'), + //new KeywordPattern('private'), + new KeywordPattern('protected'), + new KeywordPattern('null', 'hl-php-constant'), + new KeywordPattern('true', 'hl-php-constant'), + new KeywordPattern('false', 'hl-php-constant'), + //new KeywordPattern('new'), + //new KeywordPattern('readonly'), + + //new ClassPropertyPattern(), + //new NewObjectPattern(), + + // VARIABLES + //new VariablePattern(), + ]; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Shell/Patterns/DelimeterPattern.php b/app/MarkDown/CustomHL/Languages/Shell/Patterns/DelimeterPattern.php new file mode 100644 index 00000000..1449d98f --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Shell/Patterns/DelimeterPattern.php @@ -0,0 +1,31 @@ +{$this->delimeter})(\s)*/"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } + +} diff --git a/app/MarkDown/CustomHL/Languages/Shell/Patterns/DoubleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/Shell/Patterns/DoubleQuoteValuePattern.php new file mode 100644 index 00000000..bc72c1d8 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Shell/Patterns/DoubleQuoteValuePattern.php @@ -0,0 +1,25 @@ +".*?")'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-shell-value'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Shell/Patterns/QuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/Shell/Patterns/QuoteValuePattern.php new file mode 100644 index 00000000..5cacb41d --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Shell/Patterns/QuoteValuePattern.php @@ -0,0 +1,25 @@ +\'.*?\')'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-shell-value'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Shell/Patterns/ShellKeyPattern.php b/app/MarkDown/CustomHL/Languages/Shell/Patterns/ShellKeyPattern.php new file mode 100644 index 00000000..9f46c2e8 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Shell/Patterns/ShellKeyPattern.php @@ -0,0 +1,25 @@ +[-]+[\S]+)/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-constant'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php b/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php new file mode 100644 index 00000000..25896e9a --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php @@ -0,0 +1,46 @@ +)(?(.|\n)*?)(\<\/( )*script( )*>)/'; + return '/(setup( )*>)(?(.|\n)*?)(\<\/( )*)/'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + return $highlighter->parse($content, new VueSetupLanguage()); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Vue/Patterns/ConstNamePattern.php b/app/MarkDown/CustomHL/Languages/Vue/Patterns/ConstNamePattern.php new file mode 100644 index 00000000..5f744f7e --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Vue/Patterns/ConstNamePattern.php @@ -0,0 +1,25 @@ +[\w\-]+)( )+=/"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-vue-constant'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Vue/Patterns/FunctionCallPattern.php b/app/MarkDown/CustomHL/Languages/Vue/Patterns/FunctionCallPattern.php new file mode 100644 index 00000000..85fe250d --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Vue/Patterns/FunctionCallPattern.php @@ -0,0 +1,25 @@ +[a-z][\w]+)\('; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-vue-function'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Vue/Patterns/OperatorPattern.php b/app/MarkDown/CustomHL/Languages/Vue/Patterns/OperatorPattern.php new file mode 100644 index 00000000..7f758e0b --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Vue/Patterns/OperatorPattern.php @@ -0,0 +1,29 @@ +{$this->operator})(\s|\()/"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-vue-operator'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Vue/Patterns/SingleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/Vue/Patterns/SingleQuoteValuePattern.php new file mode 100644 index 00000000..296ca4c8 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Vue/Patterns/SingleQuoteValuePattern.php @@ -0,0 +1,25 @@ +'.*?')"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-vue-value'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Vue/Patterns/VueKeywordPattern.php b/app/MarkDown/CustomHL/Languages/Vue/Patterns/VueKeywordPattern.php new file mode 100644 index 00000000..2a633db3 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Vue/Patterns/VueKeywordPattern.php @@ -0,0 +1,46 @@ +caseInsensitive = true; + + return $this; + } + + public function getPattern(): string + { + $pattern = "/\b(?)*(?{$this->keyword})(\$|\,|\)|\;|\:|\s|\()/"; + + if ($this->caseInsensitive) { + $pattern .= 'i'; + } + + return $pattern; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Vue/Patterns/VueScriptSetupPattern.php b/app/MarkDown/CustomHL/Languages/Vue/Patterns/VueScriptSetupPattern.php new file mode 100644 index 00000000..8bb0a27c --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Vue/Patterns/VueScriptSetupPattern.php @@ -0,0 +1,25 @@ +setup)/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-vue-attr'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Vue/VueLanguage.php b/app/MarkDown/CustomHL/Languages/Vue/VueLanguage.php new file mode 100644 index 00000000..e5ee2b09 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Vue/VueLanguage.php @@ -0,0 +1,56 @@ +|>|=|\*)'), + + new SingleQuoteValuePattern(), + + ]; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeDelimeterPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeDelimeterPattern.php new file mode 100644 index 00000000..15540593 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeDelimeterPattern.php @@ -0,0 +1,25 @@ +=)".+?"/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-delimeter'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php new file mode 100644 index 00000000..23b76121 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php @@ -0,0 +1,27 @@ +[\w\-:]*[\w\-]+)(=")?'; +// return '/<[\w\- #]+\b(?[\w\-:]*[\w\-]+)\s*(=")? >/'; + return '/(?[\w\-\:]+)="/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-attr'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php new file mode 100644 index 00000000..7a577624 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php @@ -0,0 +1,25 @@ +".+?")/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-attr-val'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlCloseTagPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlCloseTagPattern.php new file mode 100644 index 00000000..c5312d29 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlCloseTagPattern.php @@ -0,0 +1,25 @@ +[\w\-\:\.]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-tag'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlCommentPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlCommentPattern.php new file mode 100644 index 00000000..5c1aa425 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlCommentPattern.php @@ -0,0 +1,25 @@ +\)/mU'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-comment'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypePattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypePattern.php new file mode 100644 index 00000000..9a785447 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypePattern.php @@ -0,0 +1,27 @@ +[\w\-:]*[\w\-]+)(=")?'; +// return '/<[\w\- #]+\b(?[\w\-:]*[\w\-]+)\s*(=")? >/'; + return '/\<\!doctype (?\w+)/i'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-attr'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlEndCloseTagPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlEndCloseTagPattern.php new file mode 100644 index 00000000..85cb3f11 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlEndCloseTagPattern.php @@ -0,0 +1,25 @@ +[\/]?>)/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-delimeter'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php new file mode 100644 index 00000000..ac7150f6 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php @@ -0,0 +1,25 @@ +[\w\-\:\.]+)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-tag'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php new file mode 100644 index 00000000..1fda453d --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php @@ -0,0 +1,25 @@ +<[\/\!]?)[\w\-]+/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-delimeter'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/XmlLanguage.php b/app/MarkDown/CustomHL/Languages/Xml/XmlLanguage.php new file mode 100644 index 00000000..5aabe0a9 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/XmlLanguage.php @@ -0,0 +1,48 @@ + $config + */ + public function __construct(array $config = []) + { + $environment = new Environment($config); + $environment->addExtension(new CommonMarkCoreExtension()); + $environment->addExtension(new AutolinkExtension()); + $environment->addExtension(new StrikethroughExtension()); + $environment->addExtension(new TableExtension()); + $environment->addExtension(new TaskListExtension()); + $environment->addExtension(new UnfencedExtension()); + $environment->addExtension(new AttributesExtension()); + $environment->addExtension(new CustomHighlightExtension()); + //$environment->addExtension(new HighlightExtension()); + //$environment->addExtension(new TorchlightExtension()); + + //$environment->addRenderer(BlockQuote::class, new BlockQuoteRenderer); + //$environment->addEventListener(DocumentParsedEvent::class, new ConfigureHeadingLinks); + + parent::__construct($environment); + } + + public function getEnvironment(): EnvironmentInterface + { + \assert($this->environment instanceof EnvironmentInterface); + + return $this->environment; + } +} diff --git a/public/build/assets/app-bdQfWviv.css b/public/build/assets/app-bdQfWviv.css index a9821e7f..e4058f0b 100644 --- a/public/build/assets/app-bdQfWviv.css +++ b/public/build/assets/app-bdQfWviv.css @@ -3,3 +3,15 @@ * Copyright 2011-2024 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */:root,[data-bs-theme=light]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-primary: #f9322c;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-primary-rgb: 249, 50, 44;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text-emphasis: rgb(99.6, 20, 17.6);--bs-secondary-text-emphasis: rgb(43.2, 46.8, 50);--bs-success-text-emphasis: rgb(10, 54, 33.6);--bs-info-text-emphasis: rgb(5.2, 80.8, 96);--bs-warning-text-emphasis: rgb(102, 77.2, 2.8);--bs-danger-text-emphasis: rgb(88, 21.2, 27.6);--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: rgb(253.8, 214, 212.8);--bs-secondary-bg-subtle: rgb(225.6, 227.4, 229);--bs-success-bg-subtle: rgb(209, 231, 220.8);--bs-info-bg-subtle: rgb(206.6, 244.4, 252);--bs-warning-bg-subtle: rgb(255, 242.6, 205.4);--bs-danger-bg-subtle: rgb(248, 214.6, 217.8);--bs-light-bg-subtle: rgb(251.5, 252, 252.5);--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: rgb(252.6, 173, 170.6);--bs-secondary-border-subtle: rgb(196.2, 199.8, 203);--bs-success-border-subtle: rgb(163, 207, 186.6);--bs-info-border-subtle: rgb(158.2, 233.8, 249);--bs-warning-border-subtle: rgb(255, 230.2, 155.8);--bs-danger-border-subtle: rgb(241, 174.2, 180.6);--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0));--bs-body-font-family: var(--bs-font-sans-serif);--bs-body-font-size: 1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #222;--bs-body-color-rgb: 34, 34, 34;--bs-body-bg: #fafafa;--bs-body-bg-rgb: 250, 250, 250;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(34, 34, 34, .75);--bs-secondary-color-rgb: 34, 34, 34;--bs-secondary-bg: #ebeef4;--bs-secondary-bg-rgb: 235, 238, 244;--bs-tertiary-color: rgba(34, 34, 34, .5);--bs-tertiary-color-rgb: 34, 34, 34;--bs-tertiary-bg: #fff;--bs-tertiary-bg-rgb: 255, 255, 255;--bs-heading-color: #272531;--bs-link-color: #f9322c;--bs-link-color-rgb: 249, 50, 44;--bs-link-decoration: underline;--bs-link-hover-color: rgb(199.2, 40, 35.2);--bs-link-hover-color-rgb: 199, 40, 35;--bs-code-color: #d63384;--bs-highlight-color: #222;--bs-highlight-bg: rgb(255, 242.6, 205.4);--bs-border-width: 2px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, .175);--bs-border-radius: .85rem;--bs-border-radius-sm: .25rem;--bs-border-radius-lg: .5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15);--bs-box-shadow-sm: 0 .125rem .25rem rgba(0, 0, 0, .075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, .175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, .075);--bs-focus-ring-width: .25rem;--bs-focus-ring-opacity: .25;--bs-focus-ring-color: rgba(249, 50, 44, .25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #161822;--bs-body-bg-rgb: 22, 24, 34;--bs-emphasis-color: #dee2e6;--bs-emphasis-color-rgb: 222, 226, 230;--bs-secondary-color: rgba(222, 226, 230, .75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #1a1e28;--bs-secondary-bg-rgb: 26, 30, 40;--bs-tertiary-color: rgba(222, 226, 230, .5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #252a37;--bs-tertiary-bg-rgb: 37, 42, 55;--bs-primary-text-emphasis: rgb(251.4, 132, 128.4);--bs-secondary-text-emphasis: rgb(166.8, 172.2, 177);--bs-success-text-emphasis: rgb(117, 183, 152.4);--bs-info-text-emphasis: rgb(109.8, 223.2, 246);--bs-warning-text-emphasis: rgb(255, 217.8, 106.2);--bs-danger-text-emphasis: rgb(234, 133.8, 143.4);--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: rgb(49.8, 10, 8.8);--bs-secondary-bg-subtle: rgb(21.6, 23.4, 25);--bs-success-bg-subtle: rgb(5, 27, 16.8);--bs-info-bg-subtle: rgb(2.6, 40.4, 48);--bs-warning-bg-subtle: rgb(51, 38.6, 1.4);--bs-danger-bg-subtle: rgb(44, 10.6, 13.8);--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #14161f;--bs-primary-border-subtle: rgb(149.4, 30, 26.4);--bs-secondary-border-subtle: rgb(64.8, 70.2, 75);--bs-success-border-subtle: rgb(15, 81, 50.4);--bs-info-border-subtle: rgb(7.8, 121.2, 144);--bs-warning-border-subtle: rgb(153, 115.8, 4.2);--bs-danger-border-subtle: rgb(132, 31.8, 41.4);--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: #f2f2f2;--bs-link-color: rgb(251.4, 132, 128.4);--bs-link-hover-color: rgb(252.12, 156.6, 153.72);--bs-link-color-rgb: 251, 132, 128;--bs-link-hover-color-rgb: 252, 157, 154;--bs-code-color: rgb(230.4, 132.6, 181.2);--bs-highlight-color: #dee2e6;--bs-highlight-bg: rgb(102, 77.2, 2.8);--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, .15);--bs-form-valid-color: rgb(117, 183, 152.4);--bs-form-valid-border-color: rgb(117, 183, 152.4);--bs-form-invalid-color: rgb(234, 133.8, 143.4);--bs-form-invalid-border-color: rgb(234, 133.8, 143.4)}*,*:before,*:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-family:Raleway,system-ui;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small,.post figcaption{font-size:.875em}mark,.mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity, 1));text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-4{font-size:3.5rem}}.display-5,.post h1,.post .h1,.form-editor.form-editor-title{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-5,.post h1,.post .h1,.form-editor.form-editor-title{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer:before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width: 576px){.container-sm,.container{max-width:540px}}@media (min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media (min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media (min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1120px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: .25rem}.g-1,.gy-1{--bs-gutter-y: .25rem}.g-2,.gx-2{--bs-gutter-x: .5rem}.g-2,.gy-2{--bs-gutter-y: .5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3,.answer{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: .25rem}.g-md-1,.gy-md-1{--bs-gutter-y: .25rem}.g-md-2,.gx-md-2{--bs-gutter-x: .5rem}.g-md-2,.gy-md-2{--bs-gutter-y: .5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2,main blockquote:before,.main blockquote:before,.post blockquote:before{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 3rem}}.table,.post table,main table,.main table,main div table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: var(--bs-emphasis-color);--bs-table-bg: var(--bs-body-bg);--bs-table-border-color: var(--bs-border-color);--bs-table-accent-bg: transparent;--bs-table-striped-color: var(--bs-emphasis-color);--bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), .05);--bs-table-active-color: var(--bs-emphasis-color);--bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), .1);--bs-table-hover-color: var(--bs-emphasis-color);--bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), .075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*,.post table>:not(caption)>*>*,main table>:not(caption)>*>*,.main table>:not(caption)>*>*{padding:.5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody,.post table>tbody,main table>tbody,.main table>tbody{vertical-align:inherit}.table>thead,.post table>thead,main table>thead,.main table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*,.post table>:not(caption)>*,main table>:not(caption)>*,.main table>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*,.post table>:not(caption)>*>*,main table>:not(caption)>*>*,.main table>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: rgb(253.8, 214, 212.8);--bs-table-border-color: rgb(203.04, 171.2, 170.24);--bs-table-striped-bg: rgb(241.11, 203.3, 202.16);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(228.42, 192.6, 191.52);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(234.765, 197.95, 196.84);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: rgb(225.6, 227.4, 229);--bs-table-border-color: rgb(180.48, 181.92, 183.2);--bs-table-striped-bg: rgb(214.32, 216.03, 217.55);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(203.04, 204.66, 206.1);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(208.68, 210.345, 211.825);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: rgb(209, 231, 220.8);--bs-table-border-color: rgb(167.2, 184.8, 176.64);--bs-table-striped-bg: rgb(198.55, 219.45, 209.76);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(188.1, 207.9, 198.72);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(193.325, 213.675, 204.24);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: rgb(206.6, 244.4, 252);--bs-table-border-color: rgb(165.28, 195.52, 201.6);--bs-table-striped-bg: rgb(196.27, 232.18, 239.4);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(185.94, 219.96, 226.8);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(191.105, 226.07, 233.1);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: rgb(255, 242.6, 205.4);--bs-table-border-color: rgb(204, 194.08, 164.32);--bs-table-striped-bg: rgb(242.25, 230.47, 195.13);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(229.5, 218.34, 184.86);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(235.875, 224.405, 189.995);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: rgb(248, 214.6, 217.8);--bs-table-border-color: rgb(198.4, 171.68, 174.24);--bs-table-striped-bg: rgb(235.6, 203.87, 206.91);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(223.2, 193.14, 196.02);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(229.4, 198.505, 201.465);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: rgb(198.4, 199.2, 200);--bs-table-striped-bg: rgb(235.6, 236.55, 237.5);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(223.2, 224.1, 225);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(229.4, 230.325, 231.25);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #212529;--bs-table-border-color: rgb(77.4, 80.6, 83.8);--bs-table-striped-bg: rgb(44.1, 47.9, 51.7);--bs-table-striped-color: #fff;--bs-table-active-bg: rgb(55.2, 58.8, 62.4);--bs-table-active-color: #fff;--bs-table-hover-bg: rgb(49.65, 53.35, 57.05);--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive,main #support-policy,.main #support-policy,main div #support-policy{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:.5rem;padding-bottom:.5rem;font-size:1.25rem}.col-form-label-sm{padding-top:.25rem;padding-bottom:.25rem;font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.5rem 1rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-secondary-bg);background-clip:padding-box;border:0 solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-secondary-bg);border-color:#fc9996;outline:0;box-shadow:0 0 0 .25rem #f9322c40}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:0;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.5rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:0 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 0);padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 0);padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 1rem + 0)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 0)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 0)}.form-control-color{width:3rem;height:calc(1.5em + 1rem + 0);padding:.5rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 0)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 0)}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.5rem 3rem .5rem 1rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-secondary-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right 1rem center;background-size:16px 12px;border:0 solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#fc9996;outline:0;box-shadow:0 0 0 .25rem #f9322c40}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:1rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg: var(--bs-secondary-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#fc9996;outline:0;box-shadow:0 0 0 .25rem #f9322c40}.form-check-input:checked{background-color:#f9322c;border-color:#f9322c}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#f9322c;border-color:#f9322c;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28252, 152.5, 149.5%29'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fafafa,0 0 0 .25rem #f9322c40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fafafa,0 0 0 .25rem #f9322c40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#f9322c;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#fdc2c0}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#f9322c;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#fdc2c0}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 0);min-height:calc(3.5rem + 0);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:0 solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control:focus~label:after,.form-floating>.form-control:not(:placeholder-shown)~label:after,.form-floating>.form-control-plaintext~label:after,.form-floating>.form-select~label:after{position:absolute;top:1rem;right:.5rem;bottom:1rem;left:.5rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-secondary-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control-plaintext~label{border-width:0 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label:after,.form-floating>.form-control:disabled~label:after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.5rem 1rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:0 solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:4rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-0;border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + 1rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .25rem) center;background-size:calc(.75em + .5rem) calc(.75em + .5rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 1rem);background-position:top calc(.375em + .25rem) right calc(.375em + .25rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,calc(.75em + .5rem) calc(.75em + .5rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(4rem + 1.5em)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--bs-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + 1rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .25rem) center;background-size:calc(.75em + .5rem) calc(.75em + .5rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 1rem);background-position:top calc(.375em + .25rem) right calc(.375em + .25rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,calc(.75em + .5rem) calc(.75em + .5rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(4rem + 1.5em)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:var(--bs-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: .75rem;--bs-btn-padding-y: .375rem;--bs-btn-font-family: Raleway, system-ui;--bs-btn-font-size: 1rem;--bs-btn-font-weight: 700;--bs-btn-line-height: 1.5;--bs-btn-color: var(--bs-body-color);--bs-btn-bg: transparent;--bs-btn-border-width: var(--bs-border-width);--bs-btn-border-color: transparent;--bs-btn-border-radius: .75rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);--bs-btn-disabled-opacity: .65;--bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color: #000;--bs-btn-bg: #f9322c;--bs-btn-border-color: #f9322c;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(249.9, 80.75, 75.65);--bs-btn-hover-border-color: rgb(249.6, 70.5, 65.1);--bs-btn-focus-shadow-rgb: 212, 43, 37;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(250.2, 91, 86.2);--bs-btn-active-border-color: rgb(249.6, 70.5, 65.1);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f9322c;--bs-btn-disabled-border-color: #f9322c}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(91.8, 99.45, 106.25);--bs-btn-hover-border-color: rgb(86.4, 93.6, 100);--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(86.4, 93.6, 100);--bs-btn-active-border-color: rgb(81, 87.75, 93.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(21.25, 114.75, 71.4);--bs-btn-hover-border-color: rgb(20, 108, 67.2);--bs-btn-focus-shadow-rgb: 60, 153, 110;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(20, 108, 67.2);--bs-btn-active-border-color: rgb(18.75, 101.25, 63);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #198754;--bs-btn-disabled-border-color: #198754}.btn-info{--bs-btn-color: #000;--bs-btn-bg: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(49.3, 209.95, 242.25);--bs-btn-hover-border-color: rgb(37.2, 207.3, 241.5);--bs-btn-focus-shadow-rgb: 11, 172, 204;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(61.4, 212.6, 243);--bs-btn-active-border-color: rgb(37.2, 207.3, 241.5);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #0dcaf0;--bs-btn-disabled-border-color: #0dcaf0}.btn-warning{--bs-btn-color: #000;--bs-btn-bg: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(255, 202.3, 44.2);--bs-btn-hover-border-color: rgb(255, 199.2, 31.8);--bs-btn-focus-shadow-rgb: 217, 164, 6;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(255, 205.4, 56.6);--bs-btn-active-border-color: rgb(255, 199.2, 31.8);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ffc107;--bs-btn-disabled-border-color: #ffc107}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(187, 45.05, 58.65);--bs-btn-hover-border-color: rgb(176, 42.4, 55.2);--bs-btn-focus-shadow-rgb: 225, 83, 97;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(176, 42.4, 55.2);--bs-btn-active-border-color: rgb(165, 39.75, 51.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #dc3545;--bs-btn-disabled-border-color: #dc3545}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(210.8, 211.65, 212.5);--bs-btn-hover-border-color: rgb(198.4, 199.2, 200);--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(198.4, 199.2, 200);--bs-btn-active-border-color: rgb(186, 186.75, 187.5);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(66.3, 69.7, 73.1);--bs-btn-hover-border-color: rgb(55.2, 58.8, 62.4);--bs-btn-focus-shadow-rgb: 66, 70, 73;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(77.4, 80.6, 83.8);--bs-btn-active-border-color: rgb(55.2, 58.8, 62.4);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #212529;--bs-btn-disabled-border-color: #212529}.btn-outline-primary{--bs-btn-color: #f9322c;--bs-btn-border-color: #f9322c;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f9322c;--bs-btn-hover-border-color: #f9322c;--bs-btn-focus-shadow-rgb: 249, 50, 44;--bs-btn-active-color: #000;--bs-btn-active-bg: #f9322c;--bs-btn-active-border-color: #f9322c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #f9322c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f9322c;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #198754;--bs-btn-hover-border-color: #198754;--bs-btn-focus-shadow-rgb: 25, 135, 84;--bs-btn-active-color: #fff;--bs-btn-active-bg: #198754;--bs-btn-active-border-color: #198754;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #198754;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #198754;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #0dcaf0;--bs-btn-hover-border-color: #0dcaf0;--bs-btn-focus-shadow-rgb: 13, 202, 240;--bs-btn-active-color: #000;--bs-btn-active-bg: #0dcaf0;--bs-btn-active-border-color: #0dcaf0;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #0dcaf0;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0dcaf0;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffc107;--bs-btn-hover-border-color: #ffc107;--bs-btn-focus-shadow-rgb: 255, 193, 7;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffc107;--bs-btn-active-border-color: #ffc107;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #ffc107;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ffc107;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #dc3545;--bs-btn-hover-border-color: #dc3545;--bs-btn-focus-shadow-rgb: 220, 53, 69;--bs-btn-active-color: #fff;--bs-btn-active-bg: #dc3545;--bs-btn-active-border-color: #dc3545;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #dc3545;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dc3545;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #212529;--bs-btn-hover-border-color: #212529;--bs-btn-focus-shadow-rgb: 33, 37, 41;--bs-btn-active-color: #fff;--bs-btn-active-bg: #212529;--bs-btn-active-border-color: #212529;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #212529;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #212529;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: var(--bs-link-color);--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: var(--bs-link-hover-color);--bs-btn-hover-border-color: transparent;--bs-btn-active-color: var(--bs-link-hover-color);--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 212, 43, 37;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: .5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size: 1.25rem;--bs-btn-border-radius: var(--bs-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: .25rem;--bs-btn-padding-x: .5rem;--bs-btn-font-size: .875rem;--bs-btn-border-radius: var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: .5rem;--bs-dropdown-spacer: .125rem;--bs-dropdown-font-size: 1rem;--bs-dropdown-color: var(--bs-body-color);--bs-dropdown-bg: var(--bs-body-bg);--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-border-radius: var(--bs-border-radius);--bs-dropdown-border-width: var(--bs-border-width);--bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y: .5rem;--bs-dropdown-box-shadow: var(--bs-box-shadow);--bs-dropdown-link-color: var(--bs-body-color);--bs-dropdown-link-hover-color: var(--bs-body-color);--bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #f9322c;--bs-dropdown-link-disabled-color: var(--bs-tertiary-color);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: .25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: .5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle:after{display:none}.dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, .15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #f9322c;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.75rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: .5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-link-color);--bs-nav-link-hover-color: var(--bs-link-hover-color);--bs-nav-link-disabled-color: var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem #f9322c40}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: var(--bs-border-width);--bs-nav-tabs-border-color: var(--bs-border-color);--bs-nav-tabs-border-radius: var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color: var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg: var(--bs-body-bg);--bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: var(--bs-border-radius);--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #f9322c}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: .125rem;--bs-nav-underline-link-active-color: var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: .5rem;--bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), .65);--bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), .8);--bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), .3);--bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y: .3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x: .5rem;--bs-navbar-toggler-padding-y: .25rem;--bs-navbar-toggler-padding-x: .75rem;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2834, 34, 34, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), .15);--bs-navbar-toggler-border-radius: .75rem;--bs-navbar-toggler-focus-width: .25rem;--bs-navbar-toggler-transition: box-shadow .15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: .5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: rgba(255, 255, 255, .55);--bs-navbar-hover-color: rgba(255, 255, 255, .75);--bs-navbar-disabled-color: rgba(255, 255, 255, .25);--bs-navbar-active-color: #fff;--bs-navbar-brand-color: #fff;--bs-navbar-brand-hover-color: #fff;--bs-navbar-toggler-border-color: rgba(255, 255, 255, .1);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: .5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: var(--bs-border-width);--bs-card-border-color: var(--bs-border-color-translucent);--bs-card-border-radius: var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y: .5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(var(--bs-body-color-rgb), .03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: var(--bs-body-bg);--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: .75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: var(--bs-body-color);--bs-accordion-bg: var(--bs-body-bg);--bs-accordion-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease;--bs-accordion-border-color: var(--bs-border-color);--bs-accordion-border-width: var(--bs-border-width);--bs-accordion-border-radius: var(--bs-border-radius);--bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: var(--bs-body-color);--bs-accordion-btn-bg: var(--bs-accordion-bg);--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23222' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform .2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgb%2899.6, 20, 17.6%29' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow: 0 0 0 .25rem rgba(249, 50, 44, .25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: var(--bs-primary-text-emphasis);--bs-accordion-active-bg: var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button:after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion: reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button:after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28251.4, 132, 128.4%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28251.4, 132, 128.4%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: var(--bs-secondary-color);--bs-breadcrumb-item-padding-x: .5rem;--bs-breadcrumb-item-active-color: var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size: 1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(249, 50, 44, .25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #f9322c;--bs-pagination-active-border-color: #f9322c;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: .75rem;--bs-pagination-font-size: 1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x: .5rem;--bs-pagination-padding-y: .25rem;--bs-pagination-font-size: .875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x: .65em;--bs-badge-padding-y: .35em;--bs-badge-font-size: .75em;--bs-badge-font-weight: normal;--bs-badge-color: #fff;--bs-badge-border-radius: var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius: var(--bs-border-radius);--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size: .75rem;--bs-progress-bg: var(--bs-secondary-bg);--bs-progress-border-radius: var(--bs-border-radius);--bs-progress-box-shadow: var(--bs-box-shadow-inset);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #f9322c;--bs-progress-bar-transition: width .6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: var(--bs-body-color);--bs-list-group-bg: var(--bs-body-bg);--bs-list-group-border-color: var(--bs-border-color);--bs-list-group-border-width: var(--bs-border-width);--bs-list-group-border-radius: var(--bs-border-radius);--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: .5rem;--bs-list-group-action-color: var(--bs-secondary-color);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-tertiary-bg);--bs-list-group-action-active-color: var(--bs-body-color);--bs-list-group-action-active-bg: var(--bs-secondary-bg);--bs-list-group-disabled-color: var(--bs-secondary-color);--bs-list-group-disabled-bg: var(--bs-body-bg);--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #f9322c;--bs-list-group-active-border-color: #f9322c;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: .5;--bs-btn-close-hover-opacity: .75;--bs-btn-close-focus-shadow: 0 0 0 .25rem rgba(249, 50, 44, .25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: .25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.85rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white,[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: .75rem;--bs-toast-padding-y: .5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size: .875rem;--bs-toast-color: ;--bs-toast-bg: rgba(var(--bs-body-bg-rgb), .85);--bs-toast-border-width: var(--bs-border-width);--bs-toast-border-color: var(--bs-border-color-translucent);--bs-toast-border-radius: var(--bs-border-radius);--bs-toast-box-shadow: var(--bs-box-shadow);--bs-toast-header-color: var(--bs-secondary-color);--bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), .85);--bs-toast-header-border-color: var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: .5rem;--bs-modal-color: ;--bs-modal-bg: var(--bs-body-bg);--bs-modal-border-color: var(--bs-border-color-translucent);--bs-modal-border-width: var(--bs-border-width);--bs-modal-border-radius: var(--bs-border-radius-lg);--bs-modal-box-shadow: var(--bs-box-shadow-sm);--bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: var(--bs-border-color);--bs-modal-header-border-width: var(--bs-border-width);--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: .5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: var(--bs-border-color);--bs-modal-footer-border-width: var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: .675;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media (min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media (min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: .5rem;--bs-tooltip-padding-y: .25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size: .875rem;--bs-tooltip-color: var(--bs-body-bg);--bs-tooltip-bg: var(--bs-emphasis-color);--bs-tooltip-border-radius: var(--bs-border-radius);--bs-tooltip-opacity: .9;--bs-tooltip-arrow-width: .8rem;--bs-tooltip-arrow-height: .4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size: .875rem;--bs-popover-bg: var(--bs-body-bg);--bs-popover-border-width: var(--bs-border-width);--bs-popover-border-color: var(--bs-border-color-translucent);--bs-popover-border-radius: var(--bs-border-radius-lg);--bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow: var(--bs-box-shadow);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: .5rem;--bs-popover-header-font-size: 1rem;--bs-popover-header-color: #272531;--bs-popover-header-bg: var(--bs-secondary-bg);--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: var(--bs-body-color);--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: .5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow:before,.popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header:before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translate(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -.125em;--bs-spinner-border-width: .25em;--bs-spinner-animation-speed: .75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: .2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -.125em;--bs-spinner-animation-speed: .75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: var(--bs-body-color);--bs-offcanvas-bg: var(--bs-body-bg);--bs-offcanvas-border-width: var(--bs-border-width);--bs-offcanvas-border-color: var(--bs-border-color-translucent);--bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);--bs-offcanvas-transition: transform .3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media (max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 575.98px) and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media (max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media (min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 767.98px) and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media (max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media (min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 991.98px) and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media (max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media (min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media (max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media (min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media (max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media (min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.675}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn:before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,#000c,#000 95%);mask-image:linear-gradient(130deg,#000 55%,#000c,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix:after{display:block;clear:both;content:""}.text-bg-primary{color:#000!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity, 1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity, 1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity, 1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity, 1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity, 1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity, 1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity, 1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity, 1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity, 1))!important}.link-primary:hover,.link-primary:focus{color:RGBA(250,91,86,var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(250,91,86,var(--bs-link-underline-opacity, 1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity, 1))!important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86,94,100,var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity, 1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity, 1))!important}.link-success:hover,.link-success:focus{color:RGBA(20,108,67,var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity, 1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity, 1))!important}.link-info:hover,.link-info:focus{color:RGBA(61,213,243,var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity, 1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity, 1))!important}.link-warning:hover,.link-warning:focus{color:RGBA(255,205,57,var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity, 1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity, 1))!important}.link-danger:hover,.link-danger:focus{color:RGBA(176,42,55,var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity, 1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity, 1))!important}.link-light:hover,.link-light:focus{color:RGBA(249,250,251,var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity, 1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity, 1))!important}.link-dark:hover,.link-dark:focus{color:RGBA(26,30,33,var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity, 1))!important}.link-body-emphasis,.anchors a{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity, 1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity, 1))!important}.link-body-emphasis:hover,.anchors a:hover,.link-body-emphasis:focus,.anchors a:focus{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity, .75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity, .75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity, .5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute!important}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex,.answer,.anchors a,.anchors ul{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow,main blockquote,.main blockquote,.post blockquote{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0,.form-search,.form-editor{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity: .1}.border-opacity-25{--bs-border-opacity: .25}.border-opacity-50{--bs-border-opacity: .5}.border-opacity-75{--bs-border-opacity: .75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column,.answer,.comments-wrapper .comment .message,.anchors ul{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4,.post h1,.post .h1,.marketing blockquote{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.m-n1{margin:-.25rem!important}.m-n2{margin:-.5rem!important}.m-n3{margin:-1rem!important}.m-n4{margin:-1.5rem!important}.m-n5{margin:-3rem!important}.mx-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-n5{margin-right:-3rem!important;margin-left:-3rem!important}.my-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-n5{margin-top:-3rem!important;margin-bottom:-3rem!important}.mt-n1{margin-top:-.25rem!important}.mt-n2{margin-top:-.5rem!important}.mt-n3{margin-top:-1rem!important}.mt-n4{margin-top:-1.5rem!important}.mt-n5{margin-top:-3rem!important}.me-n1{margin-right:-.25rem!important}.me-n2{margin-right:-.5rem!important}.me-n3{margin-right:-1rem!important}.me-n4{margin-right:-1.5rem!important}.me-n5{margin-right:-3rem!important}.mb-n1{margin-bottom:-.25rem!important}.mb-n2{margin-bottom:-.5rem!important}.mb-n3{margin-bottom:-1rem!important}.mb-n4{margin-bottom:-1.5rem!important}.mb-n5{margin-bottom:-3rem!important}.ms-n1{margin-left:-.25rem!important}.ms-n2{margin-left:-.5rem!important}.ms-n3{margin-left:-1rem!important}.ms-n4{margin-left:-1.5rem!important}.ms-n5{margin-left:-3rem!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2,.anchors a{gap:.5rem!important}.gap-3,.comments-wrapper .comment .message{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:1rem!important}.column-gap-4{column-gap:1.5rem!important}.column-gap-5{column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold,.post h1,.post .h1,.form-editor.form-editor-title,.anchors ul li.anchor-h2 a{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap,.comments-wrapper .comment .message,main blockquote,.main blockquote,.post blockquote,main code,.main code,main div code,main p,.main p,main div p{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break,.post,.comments-wrapper .comment .message,main blockquote,.main blockquote,.post blockquote,main p,.main p,main div p{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted,main picture:after,.main picture:after,.post picture:after{--bs-text-opacity: 1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity: 1;color:#00000080!important}.text-white-50{--bs-text-opacity: 1;color:#ffffff80!important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color)!important}.text-body-emphasis,.form-search::placeholder,.form-search,.post h1,.post .h1,.form-editor::placeholder,.form-editor{--bs-text-opacity: 1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity: 1;color:inherit!important}.text-opacity-25{--bs-text-opacity: .25}.text-opacity-50{--bs-text-opacity: .5}.text-opacity-75{--bs-text-opacity: .75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--bs-link-opacity: .1}.link-opacity-25,.link-opacity-25-hover:hover{--bs-link-opacity: .25}.link-opacity-50,.link-opacity-50-hover:hover{--bs-link-opacity: .5}.link-opacity-75,.link-opacity-75-hover:hover{--bs-link-opacity: .75}.link-opacity-100,.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline,main a,.main a,main div a{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity, 1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: .1}.link-underline-opacity-25,main a,.main a,main div a{--bs-link-underline-opacity: .25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: .25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: .5}.link-underline-opacity-75{--bs-link-underline-opacity: .75}.link-underline-opacity-75-hover:hover,main a:hover,.main a:hover{--bs-link-underline-opacity: .75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body,main blockquote,.main blockquote,.post blockquote{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity: 1;background-color:transparent!important}.bg-body-secondary,.form-search,.post img{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary,.form-editor{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity: .1}.bg-opacity-25{--bs-bg-opacity: .25}.bg-opacity-50{--bs-bg-opacity: .5}.bg-opacity-75{--bs-bg-opacity: .75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded,.gagarin,.post img,.comments-wrapper .comment .message img{border-radius:var(--bs-border-radius)!important}.rounded-0,.form-search,.form-editor{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}.line-clamp-1{-webkit-line-clamp:1!important}.line-clamp-2{-webkit-line-clamp:2!important}.line-clamp-3{-webkit-line-clamp:3!important}.line-clamp-4{-webkit-line-clamp:4!important}.line-clamp-5{-webkit-line-clamp:5!important}@media (min-width: 576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.m-sm-n1{margin:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.m-sm-n3{margin:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mx-sm-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-sm-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-sm-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-sm-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-sm-n5{margin-right:-3rem!important;margin-left:-3rem!important}.my-sm-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-sm-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-sm-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-sm-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-sm-n5{margin-top:-3rem!important;margin-bottom:-3rem!important}.mt-sm-n1{margin-top:-.25rem!important}.mt-sm-n2{margin-top:-.5rem!important}.mt-sm-n3{margin-top:-1rem!important}.mt-sm-n4{margin-top:-1.5rem!important}.mt-sm-n5{margin-top:-3rem!important}.me-sm-n1{margin-right:-.25rem!important}.me-sm-n2{margin-right:-.5rem!important}.me-sm-n3{margin-right:-1rem!important}.me-sm-n4{margin-right:-1.5rem!important}.me-sm-n5{margin-right:-3rem!important}.mb-sm-n1{margin-bottom:-.25rem!important}.mb-sm-n2{margin-bottom:-.5rem!important}.mb-sm-n3{margin-bottom:-1rem!important}.mb-sm-n4{margin-bottom:-1.5rem!important}.mb-sm-n5{margin-bottom:-3rem!important}.ms-sm-n1{margin-left:-.25rem!important}.ms-sm-n2{margin-left:-.5rem!important}.ms-sm-n3{margin-left:-1rem!important}.ms-sm-n4{margin-left:-1.5rem!important}.ms-sm-n5{margin-left:-3rem!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:1rem!important}.column-gap-sm-4{column-gap:1.5rem!important}.column-gap-sm-5{column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}.line-clamp-sm-1{-webkit-line-clamp:1!important}.line-clamp-sm-2{-webkit-line-clamp:2!important}.line-clamp-sm-3{-webkit-line-clamp:3!important}.line-clamp-sm-4{-webkit-line-clamp:4!important}.line-clamp-sm-5{-webkit-line-clamp:5!important}}@media (min-width: 768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.m-md-n1{margin:-.25rem!important}.m-md-n2{margin:-.5rem!important}.m-md-n3{margin:-1rem!important}.m-md-n4{margin:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mx-md-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-md-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-md-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-md-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-md-n5{margin-right:-3rem!important;margin-left:-3rem!important}.my-md-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-md-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-md-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-md-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-md-n5{margin-top:-3rem!important;margin-bottom:-3rem!important}.mt-md-n1{margin-top:-.25rem!important}.mt-md-n2{margin-top:-.5rem!important}.mt-md-n3{margin-top:-1rem!important}.mt-md-n4{margin-top:-1.5rem!important}.mt-md-n5{margin-top:-3rem!important}.me-md-n1{margin-right:-.25rem!important}.me-md-n2{margin-right:-.5rem!important}.me-md-n3{margin-right:-1rem!important}.me-md-n4{margin-right:-1.5rem!important}.me-md-n5{margin-right:-3rem!important}.mb-md-n1{margin-bottom:-.25rem!important}.mb-md-n2{margin-bottom:-.5rem!important}.mb-md-n3{margin-bottom:-1rem!important}.mb-md-n4{margin-bottom:-1.5rem!important}.mb-md-n5{margin-bottom:-3rem!important}.ms-md-n1{margin-left:-.25rem!important}.ms-md-n2{margin-left:-.5rem!important}.ms-md-n3{margin-left:-1rem!important}.ms-md-n4{margin-left:-1.5rem!important}.ms-md-n5{margin-left:-3rem!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:1rem!important}.column-gap-md-4{column-gap:1.5rem!important}.column-gap-md-5{column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}.line-clamp-md-1{-webkit-line-clamp:1!important}.line-clamp-md-2{-webkit-line-clamp:2!important}.line-clamp-md-3{-webkit-line-clamp:3!important}.line-clamp-md-4{-webkit-line-clamp:4!important}.line-clamp-md-5{-webkit-line-clamp:5!important}}@media (min-width: 992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.m-lg-n1{margin:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.m-lg-n3{margin:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mx-lg-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-lg-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-lg-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-lg-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-lg-n5{margin-right:-3rem!important;margin-left:-3rem!important}.my-lg-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-lg-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-lg-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-lg-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-lg-n5{margin-top:-3rem!important;margin-bottom:-3rem!important}.mt-lg-n1{margin-top:-.25rem!important}.mt-lg-n2{margin-top:-.5rem!important}.mt-lg-n3{margin-top:-1rem!important}.mt-lg-n4{margin-top:-1.5rem!important}.mt-lg-n5{margin-top:-3rem!important}.me-lg-n1{margin-right:-.25rem!important}.me-lg-n2{margin-right:-.5rem!important}.me-lg-n3{margin-right:-1rem!important}.me-lg-n4{margin-right:-1.5rem!important}.me-lg-n5{margin-right:-3rem!important}.mb-lg-n1{margin-bottom:-.25rem!important}.mb-lg-n2{margin-bottom:-.5rem!important}.mb-lg-n3{margin-bottom:-1rem!important}.mb-lg-n4{margin-bottom:-1.5rem!important}.mb-lg-n5{margin-bottom:-3rem!important}.ms-lg-n1{margin-left:-.25rem!important}.ms-lg-n2{margin-left:-.5rem!important}.ms-lg-n3{margin-left:-1rem!important}.ms-lg-n4{margin-left:-1.5rem!important}.ms-lg-n5{margin-left:-3rem!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:1rem!important}.column-gap-lg-4{column-gap:1.5rem!important}.column-gap-lg-5{column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}.line-clamp-lg-1{-webkit-line-clamp:1!important}.line-clamp-lg-2{-webkit-line-clamp:2!important}.line-clamp-lg-3{-webkit-line-clamp:3!important}.line-clamp-lg-4{-webkit-line-clamp:4!important}.line-clamp-lg-5{-webkit-line-clamp:5!important}}@media (min-width: 1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.m-xl-n1{margin:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.m-xl-n3{margin:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mx-xl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xl-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xl-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xl-n5{margin-right:-3rem!important;margin-left:-3rem!important}.my-xl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xl-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xl-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xl-n5{margin-top:-3rem!important;margin-bottom:-3rem!important}.mt-xl-n1{margin-top:-.25rem!important}.mt-xl-n2{margin-top:-.5rem!important}.mt-xl-n3{margin-top:-1rem!important}.mt-xl-n4{margin-top:-1.5rem!important}.mt-xl-n5{margin-top:-3rem!important}.me-xl-n1{margin-right:-.25rem!important}.me-xl-n2{margin-right:-.5rem!important}.me-xl-n3{margin-right:-1rem!important}.me-xl-n4{margin-right:-1.5rem!important}.me-xl-n5{margin-right:-3rem!important}.mb-xl-n1{margin-bottom:-.25rem!important}.mb-xl-n2{margin-bottom:-.5rem!important}.mb-xl-n3{margin-bottom:-1rem!important}.mb-xl-n4{margin-bottom:-1.5rem!important}.mb-xl-n5{margin-bottom:-3rem!important}.ms-xl-n1{margin-left:-.25rem!important}.ms-xl-n2{margin-left:-.5rem!important}.ms-xl-n3{margin-left:-1rem!important}.ms-xl-n4{margin-left:-1.5rem!important}.ms-xl-n5{margin-left:-3rem!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:1rem!important}.column-gap-xl-4{column-gap:1.5rem!important}.column-gap-xl-5{column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}.line-clamp-xl-1{-webkit-line-clamp:1!important}.line-clamp-xl-2{-webkit-line-clamp:2!important}.line-clamp-xl-3{-webkit-line-clamp:3!important}.line-clamp-xl-4{-webkit-line-clamp:4!important}.line-clamp-xl-5{-webkit-line-clamp:5!important}}@media (min-width: 1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.m-xxl-n1{margin:-.25rem!important}.m-xxl-n2{margin:-.5rem!important}.m-xxl-n3{margin:-1rem!important}.m-xxl-n4{margin:-1.5rem!important}.m-xxl-n5{margin:-3rem!important}.mx-xxl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xxl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xxl-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xxl-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xxl-n5{margin-right:-3rem!important;margin-left:-3rem!important}.my-xxl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xxl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xxl-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xxl-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xxl-n5{margin-top:-3rem!important;margin-bottom:-3rem!important}.mt-xxl-n1{margin-top:-.25rem!important}.mt-xxl-n2{margin-top:-.5rem!important}.mt-xxl-n3{margin-top:-1rem!important}.mt-xxl-n4{margin-top:-1.5rem!important}.mt-xxl-n5{margin-top:-3rem!important}.me-xxl-n1{margin-right:-.25rem!important}.me-xxl-n2{margin-right:-.5rem!important}.me-xxl-n3{margin-right:-1rem!important}.me-xxl-n4{margin-right:-1.5rem!important}.me-xxl-n5{margin-right:-3rem!important}.mb-xxl-n1{margin-bottom:-.25rem!important}.mb-xxl-n2{margin-bottom:-.5rem!important}.mb-xxl-n3{margin-bottom:-1rem!important}.mb-xxl-n4{margin-bottom:-1.5rem!important}.mb-xxl-n5{margin-bottom:-3rem!important}.ms-xxl-n1{margin-left:-.25rem!important}.ms-xxl-n2{margin-left:-.5rem!important}.ms-xxl-n3{margin-left:-1rem!important}.ms-xxl-n4{margin-left:-1.5rem!important}.ms-xxl-n5{margin-left:-3rem!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:1rem!important}.column-gap-xxl-4{column-gap:1.5rem!important}.column-gap-xxl-5{column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}.line-clamp-xxl-1{-webkit-line-clamp:1!important}.line-clamp-xxl-2{-webkit-line-clamp:2!important}.line-clamp-xxl-3{-webkit-line-clamp:3!important}.line-clamp-xxl-4{-webkit-line-clamp:4!important}.line-clamp-xxl-5{-webkit-line-clamp:5!important}}@media (min-width: 1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}@media (max-width: 767.98px){body,html{max-width:100vw;overflow-x:hidden}}body,button{font-variant-numeric:lining-nums proportional-nums}textarea{resize:none}.lead{font-family:Raleway,system-ui}pre{border-radius:.8rem}pre code{white-space:inherit!important}.turbo-progress-bar{height:2px;background-color:#f9322c}@media (max-width: 767.98px){.vertical-overflow{white-space:nowrap;margin-left:-15vw;margin-right:-15vw;overflow:auto!important;-ms-overflow-style:none;scrollbar-width:none;flex-wrap:inherit}.vertical-overflow>div{padding:0!important}.vertical-overflow>div:last-child{margin-right:0!important}.vertical-overflow:before{content:"";padding-left:15vw}.vertical-overflow:after{content:"";padding-right:15vw}.vertical-overflow::-webkit-scrollbar{display:none}}[contenteditable=true]:not(:focus):empty:before,[contenteditable=true]:not(:focus) code:empty:before{content:attr(placeholder);pointer-events:none;display:block;color:#ffffff73}[contenteditable=true]:focus{outline:none!important}img{color-scheme:var(--bs-color-scheme)}[data-bs-theme=light] img{color-scheme:light!important}[data-bs-theme=light] .modal-backdrop{--bs-backdrop-bg: #fff !important}[data-bs-theme=dark] img{color-scheme:dark!important}[data-bs-theme=dark] .modal-backdrop{--bs-backdrop-bg: #000 !important}.modal-sheet .modal-dialog{width:480px;transition:bottom .75s ease-in-out}.modal-sheet .modal-footer{padding-bottom:2rem}pre[class*=language-],code[class*=language-]{color:#fff;text-shadow:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;overflow:auto;-webkit-overflow-scrolling:touch;max-width:100%}pre[class*=language-]::selection,code[class*=language-]::selection,pre[class*=language-]::mozselection,code[class*=language-]::mozselection{text-shadow:none;background:#fff}@media print{pre[class*=language-],code[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em 1.5em;margin:.5em 0;overflow:auto;background:#171923}:not(pre)>code[class*=language-]{padding:.1em .3em;border-radius:.3em;color:#f98f8c;background:#fff}.namespace{opacity:.7}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#8781a2}.token.punctuation{color:#d2cdea}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#b288ff}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#4bef96}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.atrule,.token.attr-value,.token.keyword{color:#82d4f7}.token.function{color:#f98f8c}.token.regex,.token.important,.token.variable{color:#ffd06b}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}pre[data-line]{position:relative}pre[class*=language-]>code[class*=language-]{position:relative;z-index:1}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:#4a4563;box-shadow:inset 5px 0 #8781a2;z-index:0;pointer-events:none;line-height:inherit;white-space:pre}.back-to-top-container{position:absolute;top:0;right:0;height:100vh;width:1x;z-index:20}.back-to-top__button{position:fixed;bottom:1rem;right:2rem;opacity:1;visibility:visible;transition:all .2s ease}.back-to-top-container--intersecting .back-to-top__button{opacity:0;visibility:hidden}.clipboard .copy-action{display:inline}.clipboard .copy-done,.clipboard.done .copy-action{display:none}.clipboard.done .copy-done{display:inline}.docs-column-list ul,.docs-column-list-2 ul,.docs-column-list-1 ul{column-count:1;-moz-column-count:1;-webkit-column-count:1;column-gap:2em;-moz-column-gap:2em;-webkit-column-gap:2em;padding-left:0;list-style:none}.docs-column-list ul li,.docs-column-list-2 ul li,.docs-column-list-1 ul li{padding-bottom:0}.docs-column-list a,.docs-column-list-2 a,.docs-column-list-1 a{display:block}@media (min-width: 768px){.docs-column-list ul{column-count:2;-moz-column-count:2;-webkit-column-count:2;column-gap:2em;-moz-column-gap:2em;-webkit-column-gap:2em;padding-left:0;list-style:none}.docs-column-list ul li{padding-bottom:0}}@media (min-width: 1200px){.docs-column-list ul{column-count:3;-moz-column-count:3;-webkit-column-count:3;column-gap:2em;-moz-column-gap:2em;-webkit-column-gap:2em;padding-left:0;list-style:none}.docs-column-list ul li{padding-bottom:0}.docs-column-list-2 ul{column-count:2;-moz-column-count:2;-webkit-column-count:2;column-gap:2em;-moz-column-gap:2em;-webkit-column-gap:2em;padding-left:0;list-style:none}.docs-column-list-2 ul li{padding-bottom:0}}.anchors ul{gap:.65rem;list-style:none;padding:0}.anchors ul li{margin:0;padding:0}.anchors ul li.anchor-h3{margin-left:1.5em}.anchors ul li.anchor-h3 a{opacity:.75}.anchors ul li.anchor-h3 a:before{filter:contrast(.5)}.anchors ul li.anchor-h4{margin-left:2.5em}.anchors a{text-wrap:balance;opacity:.75;line-height:1.3rem;letter-spacing:-.005rem;font-size:.875rem;transition:all .34s ease;text-decoration:none}.anchors a:hover{opacity:1!important}.anchors a:before{content:"# ";color:#f9322c}main,.main,main div{line-height:1.8em}main *:last-child,.main *:last-child,main div *:last-child{margin-bottom:0!important}main ol,.main ol,main div ol{padding:0 1.5rem}main .h2,main .h3,main h2,main h3,.main .h2,.main .h3,.main h2,.main h3,main div .h2,main div .h3,main div h2,main div h3{margin-top:1.5em;margin-bottom:15px}main .h2 a,main .h3 a,main h2 a,main h3 a,.main .h2 a,.main .h3 a,.main h2 a,.main h3 a,main div .h2 a,main div .h3 a,main div h2 a,main div h3 a{display:block}main h4,main .h4,main h5,main .h5,main h6,main .h6,.main h4,.main .h4,.main h5,.main .h5,.main h6,.main .h6,main div h4,main div h5,main div h6{line-height:1.8;margin-top:1.25em}@media (min-width: 768px){main h2 a,main .h2 a,.main h2 a,.main .h2 a,main div h2 a{margin-left:-2rem}}main p,.main p,main div p{font-size:1em;line-height:1.6em;margin-bottom:1.5rem;text-wrap:pretty!important}main p>a,.main p>a,main div p>a{text-decoration:underline}main p>:empty:not(br),.main p>:empty:not(br),main div p>:empty:not(br){display:none}main code,.main code,main div code{color:#eb4432e6}main,.main,.post{line-height:1.5em;overflow:initial}main img,.main img,.post img{display:block!important;max-width:100%;object-fit:cover;border-radius:.5em;margin:0 auto}main picture:after,.main picture:after,.post picture:after{content:attr(alt);text-align:center;display:block;font-size:.775em;max-width:calc(66% - 48px);margin:1em auto 2em;line-height:1.5em}main h1 a,main .h1 a,main h2 a,main .h2 a,main h3 a,main .h3 a,main h4 a,main .h4 a,main h5 a,main .h5 a,main h6 a,main .h6 a,.main h1 a,.main .h1 a,.main h2 a,.main .h2 a,.main h3 a,.main .h3 a,.main h4 a,.main .h4 a,.main h5 a,.main .h5 a,.main h6 a,.main .h6 a,.post h1 a,.post .h1 a,.post h2 a,.post .h2 a,.post h3 a,.post .h3 a,.post h4 a,.post .h4 a,.post h5 a,.post .h5 a,.post h6 a,.post .h6 a{color:var(--bs-heading-color)!important;text-decoration:none;position:relative;font-weight:550}main .base-header a,main h2 a,main .h2 a,.main .base-header a,.main h2 a,.main .h2 a,.post .base-header a,.post h2 a,.post .h2 a{padding-left:1em;transition:all .34s}main .base-header a:before,main h2 a:before,main .h2 a:before,.main .base-header a:before,.main h2 a:before,.main .h2 a:before,.post .base-header a:before,.post h2 a:before,.post .h2 a:before{transition:all .34s;content:"#";margin-left:-1em;position:absolute;font-size:1em;color:#f9322c;opacity:.5}main .base-header a:hover:before,main h2 a:hover:before,main .h2 a:hover:before,.main .base-header a:hover:before,.main h2 a:hover:before,.main .h2 a:hover:before,.post .base-header a:hover:before,.post h2 a:hover:before,.post .h2 a:hover:before{opacity:1}main h2,main .h2,.main h2,.main .h2,.post h2,.post .h2{margin-bottom:1em!important}main h2 a:target:before,main .h2 a:target:before,.main h2 a:target:before,.main .h2 a:target:before,.post h2 a:target:before,.post .h2 a:target:before{transform:rotate(200deg)}main li,.main li,.post li{padding-bottom:1em}main li:last-child,.main li:last-child,.post li:last-child{padding-bottom:.33em}main pre,.main pre,.post pre{margin-bottom:2em!important}main .docs-blockquote-tip:before,.main .docs-blockquote-tip:before,.post .docs-blockquote-tip:before{background-color:#8df1a4;background-image:url(/build/assets/info-Dr88BOtQ.svg);content:""}main .docs-blockquote-note:before,.main .docs-blockquote-note:before,.post .docs-blockquote-note:before{background-color:#f1a58d;background-image:url(/build/assets/warning-Bnq9FH37.svg);content:""}main blockquote,.main blockquote,.post blockquote{display:flex;border-radius:.8rem;position:relative;margin:2em 0;overflow:hidden;align-items:stretch}main blockquote>div,main blockquote>p,.main blockquote>div,.main blockquote>p,.post blockquote>div,.post blockquote>p{padding:2rem 1.5rem}main blockquote:before,.main blockquote:before,.post blockquote:before{background-position:center;background-size:contain;background-repeat:no-repeat;border:inset 1em transparent;background-image:url(/build/assets/default-oNrv4Rfh.svg);background-color:#adb5bd;color:#fff;content:" ";text-align:center;font-weight:600;font-size:1.5em;min-height:3em;min-width:3em;aspect-ratio:3/1}@media (max-width: 767.98px){main blockquote:before,.main blockquote:before,.post blockquote:before{border:solid 2rem rgba(0,0,0,0);width:30%;flex:0 0 auto}}main blockquote p:first-child,.main blockquote p:first-child,.post blockquote p:first-child{margin-top:auto}main blockquote p:last-child,.main blockquote p:last-child,.post blockquote p:last-child{margin-bottom:auto!important}.doc-navigation{-ms-overflow-style:none;scrollbar-width:none;max-height:100vh;overflow:scroll}.doc-navigation::-webkit-scrollbar{display:none}.container-docs{max-width:1680px;margin:0 auto}.docs-result-item{max-height:300px}.docs-result-item .main blockquote{display:none!important}.code-container{margin-bottom:2em}.code-container pre{margin-top:0;margin-bottom:0;border-radius:.8rem}.code-container pre code{white-space:inherit!important}.code-container.active pre{border-radius:0}.tabbed-code{margin-top:1.25rem;margin-bottom:1.25rem;overflow:hidden;border-radius:.375rem;background-color:#394056}.tabbed-code .tabbed-code-nav{display:flex}.tabbed-code .tabbed-code-nav .tabbed-code-nav-button{border-top-left-radius:.25rem;border-top-right-radius:.25rem;padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem;color:#d7d7dc;border:0;background:transparent}.tabbed-code .tabbed-code-nav .tabbed-code-nav-button[data-tab=Pest],.tabbed-code .tabbed-code-nav .tabbed-code-nav-button[data-tab=PHPUnit]{background-size:1rem;background-repeat:no-repeat;background-position:.75rem center}.tabbed-code .tabbed-code-nav .tabbed-code-nav-button.active{background-color:#171923}.tabbed-code .tabbed-code-body{background-color:#262a36}.tabbed-code .tabbed-code-body .code-container{margin:0;border-radius:0;display:none}.tabbed-code .tabbed-code-body .code-container.active{display:block}@media (min-width: 576px){.ticket-border{border-left:4px dashed var(--bs-body-bg);padding-left:50px;position:relative}.ticket-border:before,.ticket-border:after{background:var(--bs-body-bg)}.ticket-border:before{width:50px;height:50px;border-radius:50%;content:"";top:-50px;left:-25px;position:absolute}.ticket-border:after{width:50px;height:50px;border-radius:50%;content:"";bottom:-50px;left:-25px;position:absolute}}@keyframes fade-in{0%{opacity:0}}@keyframes fade-out{to{opacity:0}}::view-transition-old(frame){animation:90ms cubic-bezier(.4,0,1,1) both fade-out}::view-transition-new(frame){animation:.21s cubic-bezier(0,0,.2,1) 90ms both fade-in}@keyframes shake{0%{transform:translate(0)}20%{transform:translate(1em)}40%{transform:translate(-1em)}60%{transform:translate(1em)}80%{transform:translate(-1em)}to{transform:translate(0)}}.animate-shake{animation:shake .5s infinite;animation-iteration-count:1}.form-editor{overflow:hidden;outline:none!important}.form-editor::placeholder{opacity:.5}.clone-editor{font-size:1em!important;line-height:1.5!important;font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"!important}.clone-editor .important{font-weight:400!important}.clone-editor .bold{font-weight:400!important;text-decoration:underline}.clone-editor .blockquote{margin:0!important;padding:0!important;font-size:1rem}.clone-editor .italic{font-weight:400!important;font-style:normal!important;opacity:.75}textarea.clone-editor{padding:.8rem 0rem;margin:0;font-size:inherit!important;font-family:inherit!important;line-height:inherit!important;z-index:1;caret-color:var(--bs-emphasis-color)!important;position:relative;background-color:transparent!important;width:100%!important;color:#fff0!important}.wrapper-visualizer{pointer-events:none;position:absolute;top:0;left:0;width:100%;height:100%;padding:.8em 0;margin:0;font-size:inherit;font-family:inherit;line-height:inherit;background-color:transparent;overflow:hidden}code.clone-editor{background-color:initial;margin:0;padding:0!important;white-space:pre-wrap!important;word-break:break-word!important}.text-balance,.lead{text-wrap:balance}.hidden-text{cursor:pointer;filter:brightness(5.8);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='69' height='16' fill='none'%3E%3Cg fill='%23212121' clip-path='url(%23a)'%3E%3Ccircle cx='3.5' cy='3.5' r='.5'/%3E%3Ccircle cx='26.5' cy='3.5' r='.5'/%3E%3Ccircle cx='49.5' cy='3.5' r='.5'/%3E%3Ccircle cx='72.5' cy='3.5' r='.5'/%3E%3Ccircle cx='8.5' cy='4.5' r='.5'/%3E%3Ccircle cx='31.5' cy='4.5' r='.5'/%3E%3Ccircle cx='54.5' cy='4.5' r='.5'/%3E%3Ccircle cx='11.5' cy='6.5' r='.5'/%3E%3Ccircle cx='34.5' cy='6.5' r='.5'/%3E%3Ccircle cx='57.5' cy='6.5' r='.5'/%3E%3Ccircle cx='15.5' cy='9.5' r='.5'/%3E%3Ccircle cx='38.5' cy='9.5' r='.5'/%3E%3Ccircle cx='61.5' cy='9.5' r='.5'/%3E%3Ccircle cx='13.5' cy='5.5' r='.5'/%3E%3Ccircle cx='36.5' cy='5.5' r='.5'/%3E%3Ccircle cx='59.5' cy='5.5' r='.5'/%3E%3Ccircle cx='17.5' cy='8.5' r='.5'/%3E%3Ccircle cx='40.5' cy='8.5' r='.5'/%3E%3Ccircle cx='63.5' cy='8.5' r='.5'/%3E%3Ccircle cx='21.5' cy='4.5' r='.5'/%3E%3Ccircle cx='44.5' cy='4.5' r='.5'/%3E%3Ccircle cx='67.5' cy='4.5' r='.5'/%3E%3Ccircle cx='14.5' cy='2.5' r='.5'/%3E%3Ccircle cx='37.5' cy='2.5' r='.5'/%3E%3Ccircle cx='60.5' cy='2.5' r='.5'/%3E%3Ccircle cx='18.5' cy='5.5' r='.5'/%3E%3Ccircle cx='41.5' cy='5.5' r='.5'/%3E%3Ccircle cx='64.5' cy='5.5' r='.5'/%3E%3Ccircle cx='11.5' cy='3.5' r='.5'/%3E%3Ccircle cx='34.5' cy='3.5' r='.5'/%3E%3Ccircle cx='57.5' cy='3.5' r='.5'/%3E%3Ccircle cx='15.5' cy='6.5' r='.5'/%3E%3Ccircle cx='38.5' cy='6.5' r='.5'/%3E%3Ccircle cx='61.5' cy='6.5' r='.5'/%3E%3Ccircle cx='7.5' cy='1.5' r='.5'/%3E%3Ccircle cx='30.5' cy='1.5' r='.5'/%3E%3Ccircle cx='53.5' cy='1.5' r='.5'/%3E%3Ccircle cx='6.5' cy='6.5' r='.5'/%3E%3Ccircle cx='29.5' cy='6.5' r='.5'/%3E%3Ccircle cx='52.5' cy='6.5' r='.5'/%3E%3Ccircle cx='10.5' cy='9.5' r='.5'/%3E%3Ccircle cx='33.5' cy='9.5' r='.5'/%3E%3Ccircle cx='56.5' cy='9.5' r='.5'/%3E%3Ccircle cx='13.5' cy='9.5' r='.5'/%3E%3Ccircle cx='36.5' cy='9.5' r='.5'/%3E%3Ccircle cx='59.5' cy='9.5' r='.5'/%3E%3Ccircle cx='18.5' cy='2.5' r='.5'/%3E%3Ccircle cx='41.5' cy='2.5' r='.5'/%3E%3Ccircle cx='64.5' cy='2.5' r='.5'/%3E%3Ccircle cx='23.5' cy='2.5' r='.5'/%3E%3Ccircle cx='46.5' cy='2.5' r='.5'/%3E%3Ccircle cx='69.5' cy='2.5' r='.5'/%3E%3Ccircle cx='16.5' cy='11.5' r='.5'/%3E%3Ccircle cx='39.5' cy='11.5' r='.5'/%3E%3Ccircle cx='62.5' cy='11.5' r='.5'/%3E%3Ccircle cx='18.5' cy='12.5' r='.5'/%3E%3Ccircle cx='41.5' cy='12.5' r='.5'/%3E%3Ccircle cx='64.5' cy='12.5' r='.5'/%3E%3Ccircle cx='20.5' cy='9.5' r='.5'/%3E%3Ccircle cx='43.5' cy='9.5' r='.5'/%3E%3Ccircle cx='66.5' cy='9.5' r='.5'/%3E%3Ccircle cx='22.5' cy='12.5' r='.5'/%3E%3Ccircle cx='45.5' cy='12.5' r='.5'/%3E%3Ccircle cx='68.5' cy='12.5' r='.5'/%3E%3Ccircle cx='25.5' cy='9.5' r='.5'/%3E%3Ccircle cx='46.5' cy='5.5' r='.5'/%3E%3Ccircle cx='69.5' cy='8.5' r='.5'/%3E%3Ccircle cx='15.5' cy='14.5' r='.5'/%3E%3Ccircle cx='38.5' cy='14.5' r='.5'/%3E%3Ccircle cx='61.5' cy='14.5' r='.5'/%3E%3Ccircle cx='12.5' cy='12.5' r='.5'/%3E%3Ccircle cx='35.5' cy='12.5' r='.5'/%3E%3Ccircle cx='56.5' cy='13.5' r='.5'/%3E%3Ccircle cx='7.5' cy='11.5' r='.5'/%3E%3Ccircle cx='30.5' cy='11.5' r='.5'/%3E%3Ccircle cx='53.5' cy='11.5' r='.5'/%3E%3Ccircle cx='8.5' cy='8.5' r='.5'/%3E%3Ccircle cx='31.5' cy='8.5' r='.5'/%3E%3Ccircle cx='54.5' cy='8.5' r='.5'/%3E%3Ccircle cx='6.5' cy='9.5' r='.5'/%3E%3Ccircle cx='29.5' cy='9.5' r='.5'/%3E%3Ccircle cx='52.5' cy='9.5' r='.5'/%3E%3Ccircle cx='8.5' cy='13.5' r='.5'/%3E%3Ccircle cx='31.5' cy='13.5' r='.5'/%3E%3Ccircle cx='52.5' cy='14.5' r='.5'/%3E%3Ccircle cx='4.5' cy='11.5' r='.5'/%3E%3Ccircle cx='27.5' cy='11.5' r='.5'/%3E%3Ccircle cx='48.5' cy='9.5' r='.5'/%3E%3Ccircle cx='73.5' cy='11.5' r='.5'/%3E%3Ccircle cx='4.5' cy='7.5' r='.5'/%3E%3Ccircle cx='27.5' cy='7.5' r='.5'/%3E%3Ccircle cx='50.5' cy='7.5' r='.5'/%3E%3Ccircle cx='72.5' cy='9.5' r='.5'/%3E%3Ccircle cx='1.5' cy='8.5' r='.5'/%3E%3Ccircle cx='24.5' cy='5.5' r='.5'/%3E%3Ccircle cx='44.5' cy='14.5' r='.5'/%3E%3Ccircle cx='70.5' cy='6.5' r='.5'/%3E%3Ccircle cx='2.5' cy='13.5' r='.5'/%3E%3Ccircle cx='25.5' cy='13.5' r='.5'/%3E%3Ccircle cx='48.5' cy='13.5' r='.5'/%3E%3Ccircle cx='71.5' cy='13.5' r='.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='a'%3E%3Crect width='255' height='16' fill='%23fff' rx='2'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E");transition:.34s all;color:transparent;background-repeat:repeat no-repeat;background-position-y:center}.line-clamp{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.feature-icon-small{width:3rem;height:3rem}.border-dashed{--bs-border-style: dashed;border-style:dashed}@media (min-width: 768px){.hangman{max-height:50vh;object-fit:cover}}.comments-wrapper .thread{position:relative;overflow:hidden}.comments-wrapper .thread:before{position:absolute;display:block;top:0;left:1rem;border:solid 1px rgba(73,80,87,.2);content:"";-webkit-box-sizing:content-box;box-sizing:content-box;width:.75rem;height:1.5rem;padding-bottom:1em;border-width:0 0 1px 1px;border-bottom-left-radius:1rem;border-color:#49505733}.comments-wrapper .thread .comment:last-child:before{display:none}.comments-wrapper .comment{position:relative;overflow:hidden}.comments-wrapper .comment:before{position:absolute;display:block;top:3.5rem;left:1rem;content:"";width:1px;height:100%;background-color:#49505733}.comments-wrapper .comment .message{display:flex}.comments-wrapper .comment .message *{margin-bottom:0}.comments-wrapper .comment .message img{max-width:100%;max-height:300px}.marketing blockquote:before{content:"«";padding-right:.5em}.marketing blockquote:after{content:"»";padding-left:.5em}.marketing blockquote:before,.marketing blockquote:after{display:inline-block;color:#f9322c;position:relative;opacity:.5}.post h1,.post .h1{text-wrap:balance!important}.post h2,.post .h2{line-height:1.23;margin:0 0 1rem}.post .h2,.post .h3,.post h2,.post h3{margin-top:1.5em;margin-bottom:1rem}.post h4,.post .h4,.post h5,.post .h5,.post h6,.post .h6{margin-top:1.25em}.post img{width:100%;min-height:200px;object-fit:cover;display:block}.post figure{margin:0 0 1.5rem}.post figcaption{display:block;margin:1em;padding:0 2rem;opacity:.75;text-align:center}.post-preview-text{max-height:25rem;overflow:hidden;position:relative}.post-preview-text pre{overflow:hidden!important}@keyframes rotation-space{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes rotation-space-item{0%{transform:rotate(0)}50%{transform:rotate(-2deg)}to{transform:rotate(0)}}.gagarin{background-size:cover;overflow:hidden;position:relative}.gagarin .space{background-image:url(/img/ui/vostok/space.jpg);background-size:cover;animation:rotation-space 300s infinite linear;position:absolute;bottom:-50%;top:-50%;left:-50%;right:-50%}.gagarin #vostok-game{display:block;animation:rotation-space-item 3s infinite linear;overflow:visible}.gagarin #vostok-game svg{display:block;animation:rotation-space-item .3s infinite linear;overflow:hidden}@supports (-moz-appearance: none){.gagarin #vostok-game svg{animation:none}}.gagarin #ship,.gagarin #comet{border-radius:8px}@keyframes scroll{0%{transform:translate(0)}to{transform:translate(-1750px)}}.slider{margin:auto;overflow:hidden;position:relative;width:100%}.slider:before,.slider:after{background:linear-gradient(to right,var(--bs-body-bg) 0%,rgba(255,255,255,0) 100%);content:"";height:100%;position:absolute;width:200px;z-index:2;pointer-events:none}.slider:after{right:0;top:0;transform:rotate(180deg)}.slider:before{left:0;top:0}.slider .slide-track{animation:scroll 40s linear infinite;display:flex;width:3500px}.slider .slide{min-width:250px;width:20rem}.avatar{border-radius:10em}.avatar-sm{max-width:40px}.avatar-xl{width:80px;height:80px;margin:0 auto}.avatar-xxl{width:8rem;height:8rem}.avatar-img{aspect-ratio:1/1;max-width:100%;min-width:40px;object-fit:cover;background-color:#e2e3e5b3}[data-bs-theme=dark] .avatar-img{background-color:#e2e3e580}.company-usage img{filter:grayscale(100%) contrast(.5);opacity:.8;height:60px;object-fit:contain}.footer-sun{object-position:top center}.btn.btn-primary,.btn.btn-outline-primary:hover{color:var(--bs-body-bg)}.form-search{overflow:hidden;font-size:1em;line-height:1.5;outline:none!important}.form-search::placeholder{opacity:.5}.bg-light-danger{background-color:#fbdbd9!important}.to-transparent{background-image:linear-gradient(to top,var(--bs-tertiary-bg),rgb(var(--bs-tertiary-bg-rgb),0%));position:absolute;left:0;bottom:0;right:0;pointer-events:none;z-index:2;height:4rem}.sponsors img{max-width:75%;height:64px}[data-bs-theme=dark] .sponsors img{filter:grayscale(5%) contrast(.5)}.profile-cover{height:150px;background-image:url(/build/assets/background-profile-C9TOZ9gt.svg);background-position:center;background-size:cover;background-repeat:no-repeat;background-color:#fafafa}@media (min-width: 768px){.profile-cover{height:200px}}.quiz-code-hover{opacity:.25!important;filter:blur(2px);transition:all .35s ease-in-out}.quiz-code-hover:hover{opacity:1!important;filter:blur(0)}.hero-image{background:linear-gradient(180deg,#0000,#f9322c 150%)}.tentacle{position:relative;bottom:-10%}@media (max-width: 991.98px){.package-cover{height:110px}.tentacle{position:relative;bottom:-5%}}.pb-6{padding-bottom:3.8rem!important}.challenge-blur{position:absolute;top:0;left:0;-webkit-backdrop-filter:blur(.5rem) brightness(.5);backdrop-filter:blur(.5rem) brightness(.5);background-image:url(/img/bg-packages.svg);width:100%;height:100%;z-index:1}.answer p{margin:0!important} + +.hl-deletion { + min-width: 100%; + background-color: #FF000033; + color: #f07178; +} + +.hl-addition { + min-width: 100%; + background-color: #99b76d33; + color: #C3E88D; +} \ No newline at end of file From 145052d56257a988a2466121c1895f7f3a11a85c Mon Sep 17 00:00:00 2001 From: demn98 Date: Fri, 22 Nov 2024 22:04:20 +0300 Subject: [PATCH 2/9] highlighter tmp commit 20241122 --- .../CommonMark/CustomHighlightExtension.php | 2 + .../Blade/Injections/BladeEchoInjection.php | 4 +- .../CustomHL/Languages/Ini/IniLanguage.php | 7 +++ .../JavaScript/JavaScriptLanguage.php | 19 +++++-- .../Patterns/ConstantNamePattern.php | 25 +++++++++ .../JavaScript/Patterns/JsKeywordPattern.php | 8 +-- .../JavaScript/Patterns/JsPropertyPattern.php | 2 +- .../Patterns/JsSinglelineCommentPattern.php | 25 +++++++++ .../JavaScript/Patterns/OperatorPattern.php | 29 +++++++++++ .../Json/Injections/JsonArrayInjection.php | 44 ++++++++++++++++ .../CustomHL/Languages/Json/JsonLanguage.php | 39 ++++++++++++++ .../Patterns/JsonDoubleQuoteValuePattern.php | 25 +++++++++ .../Json/Patterns/JsonPropertyPattern.php | 25 +++++++++ .../Injections/ClassResolutionInjection.php | 35 +++++++++++++ .../Injections/DoubleQuoteValueInjection.php | 34 +++++++++++++ .../MultilineSingleDocCommentInjection.php | 51 +++++++++++++++++++ .../PhpDocCommentParamTypeInjection.php | 8 +-- .../Injections/SingleQuoteValueInjection.php | 2 +- .../Injections/SinglelineCommentInjection.php | 4 +- ...lutionPattern.php => CatchTypePattern.php} | 6 +-- .../Php/Patterns/ConstantNamePattern.php | 2 +- .../Php/Patterns/FunctionCallPattern.php | 2 +- .../Php/Patterns/ImplementsPattern.php | 2 +- .../Languages/Php/Patterns/KeywordPattern.php | 2 +- .../MultilineSingleDocCommentPattern.php | 25 +++++++++ .../Languages/Php/Patterns/UsePattern.php | 2 +- .../CustomHL/Languages/Php/PhpLanguage.php | 28 ++++++---- .../Languages/Php/PhpTypeLanguage.php | 4 +- .../Patterns/SinglelineCommentPattern.php | 25 +++++++++ .../Languages/Shell/ShellLanguage.php | 2 + .../Xml/Patterns/XmlDoctypePattern.php | 4 +- .../Xml/Patterns/XmlDoctypeTypePattern.php | 27 ++++++++++ .../Xml/Patterns/XmlOpenTagPattern.php | 2 +- .../Xml/Patterns/XmlStartOpenTagPattern.php | 2 +- .../CustomHL/Languages/Xml/XmlLanguage.php | 2 + app/MarkDown/CustomHL/style.css | 31 ++++++++++- 36 files changed, 511 insertions(+), 45 deletions(-) create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Patterns/ConstantNamePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSinglelineCommentPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Patterns/OperatorPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Json/Patterns/JsonDoubleQuoteValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Json/Patterns/JsonPropertyPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/ClassResolutionInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/DoubleQuoteValueInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Injections/MultilineSingleDocCommentInjection.php rename app/MarkDown/CustomHL/Languages/Php/Patterns/{ClassResolutionPattern.php => CatchTypePattern.php} (70%) create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/MultilineSingleDocCommentPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Shell/Patterns/SinglelineCommentPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypeTypePattern.php diff --git a/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php b/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php index 55cc1a07..d1e89f16 100644 --- a/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php +++ b/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php @@ -23,6 +23,7 @@ use App\MarkDown\CustomHL\Languages\JavaScript\JavaScriptLanguage; //use App\MarkDown\CustomHL\Languages\Html\HtmlLanguage; use App\MarkDown\CustomHL\Languages\Xml\XmlLanguage; +use App\MarkDown\CustomHL\Languages\Json\JsonLanguage; final class CustomHighlightExtension implements ExtensionInterface { @@ -39,6 +40,7 @@ public function __construct( $this->highlighter->addLanguage(new JavaScriptLanguage()); // $this->highlighter->addLanguage(new HtmlLanguage()); $this->highlighter->addLanguage(new XmlLanguage()); + $this->highlighter->addLanguage(new JsonLanguage()); } public function register(EnvironmentBuilderInterface $environment): void diff --git a/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php index e648f1fb..98555e6d 100644 --- a/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php +++ b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php @@ -7,8 +7,6 @@ use Tempest\Highlight\Highlighter; use Tempest\Highlight\Injection; use Tempest\Highlight\IsInjection; -use Tempest\Highlight\Escape; -use Tempest\Highlight\Tokens\DynamicTokenType; final readonly class BladeEchoInjection implements Injection { @@ -16,7 +14,7 @@ public function getPattern(): string { - return '({{(?!--))(?.*)(}})'; + return '({{(?!--))(?(.|\n)*?)(}})'; } public function parseContent(string $content, Highlighter $highlighter): string diff --git a/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php b/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php index f9f3420b..31b5b33a 100644 --- a/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php @@ -15,6 +15,13 @@ public function getName(): string return 'ini'; } + public function getAliases(): array + { + return [ + 'env', + ]; + } + public function getInjections(): array { return [ diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php b/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php index 51a4b072..59b39178 100644 --- a/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php +++ b/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php @@ -14,11 +14,13 @@ //use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsNewObjectPattern; //use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsObjectPropertyPattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\JsPropertyPattern; -//use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsSinglelineCommentPattern; +use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\JsSinglelineCommentPattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\JsSingleQuoteValuePattern; //use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsStaticClassPattern; //use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsStaticPropertyPattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\DigitsPattern; +use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\ConstantNamePattern; +use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\OperatorPattern; class JavaScriptLanguage extends CustomBaseLanguage { @@ -47,10 +49,14 @@ public function getPatterns(): array { return [ ...parent::getPatterns(), + new JsKeywordPattern('const'), new JsKeywordPattern('default'), new JsKeywordPattern('export'), + new JsKeywordPattern('false', 'hl-js-slug'), new JsKeywordPattern('from'), new JsKeywordPattern('import'), + new JsKeywordPattern('null', 'hl-js-slug'), + new JsKeywordPattern('true', 'hl-js-slug'), new JsKeywordPattern('var'), //new JsKeywordPattern('set'), //new JsKeywordPattern('of'), @@ -62,7 +68,6 @@ public function getPatterns(): array //new JsKeywordPattern('case'), //new JsKeywordPattern('catch'), //new JsKeywordPattern('class'), - //new JsKeywordPattern('const'), //new JsKeywordPattern('continue'), //new JsKeywordPattern('debugger'), //new JsKeywordPattern('delete'), @@ -76,7 +81,7 @@ public function getPatterns(): array //new JsKeywordPattern('if'), //new JsKeywordPattern('in'), //new JsKeywordPattern('instanceof'), - //new JsKeywordPattern('new'), + new JsKeywordPattern('new'), //new JsKeywordPattern('null'), //new JsKeywordPattern('return'), //new JsKeywordPattern('super'), @@ -103,9 +108,11 @@ public function getPatterns(): array //new JsKeywordPattern('constructor'), //new JsKeywordPattern('this'), + new OperatorPattern('(=|\?\?|===)'), + // COMMENTS //new JsMultilineCommentPattern(), - //new JsSinglelineCommentPattern(), + new JsSinglelineCommentPattern(), // TYPES //new JsClassNamePattern(), @@ -113,7 +120,7 @@ public function getPatterns(): array //new JsStaticClassPattern(), // PROPERTIES - //new JsPropertyPattern(), + new JsPropertyPattern(), //new JsObjectPropertyPattern(), new JsMethodPattern(), //new JsStaticPropertyPattern(), @@ -122,6 +129,8 @@ public function getPatterns(): array new JsSingleQuoteValuePattern(), //new JsDoubleQuoteValuePattern(), + new ConstantNamePattern(), + new DigitsPattern(), ]; } diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/ConstantNamePattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/ConstantNamePattern.php new file mode 100644 index 00000000..6b013770 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/ConstantNamePattern.php @@ -0,0 +1,25 @@ +[A-Z_]+)\b'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-constant'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsKeywordPattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsKeywordPattern.php index 3664569c..7436be3f 100644 --- a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsKeywordPattern.php +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsKeywordPattern.php @@ -15,8 +15,10 @@ final class JsKeywordPattern implements Pattern private bool $caseInsensitive = false; - public function __construct(private string $keyword) - { + public function __construct( + private string $keyword, + private string $tokenType = 'hl-js-keyword' + ) { } public function caseInsensitive(): self @@ -39,6 +41,6 @@ public function getPattern(): string public function getTokenType(): TokenType { - return new DynamicTokenType('hl-js-keyword'); + return new DynamicTokenType($this->tokenType); } } diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsPropertyPattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsPropertyPattern.php index 5523e041..865445ea 100644 --- a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsPropertyPattern.php +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsPropertyPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/(?[\w\$]+)\(/'; + return '/\.(?[\w]+)/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSinglelineCommentPattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSinglelineCommentPattern.php new file mode 100644 index 00000000..c6bdc1f5 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSinglelineCommentPattern.php @@ -0,0 +1,25 @@ +\/\/(.)*)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-comment'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/OperatorPattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/OperatorPattern.php new file mode 100644 index 00000000..25cedc69 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/OperatorPattern.php @@ -0,0 +1,29 @@ +{$this->operator})(\s|\()/"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-operator'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php b/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php new file mode 100644 index 00000000..bec8a002 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php @@ -0,0 +1,44 @@ +(.|\n)*?)\]'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + preg_match_all('/\"(?.*?)\"/', $content, $match, PREG_OFFSET_CAPTURE); + + if (! $match) { + return $content; + } + + $theme = $highlighter->getTheme(); + + foreach($match['match'] as $val) { + $content = preg_replace( + '/\b' . $val[0] . '[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType('hl-json-value'))) + . $val[0] + . Escape::tokens($theme->after(new DynamicTokenType('hl-json-value'))), + $content, + ); + } + + return $content; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php b/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php new file mode 100644 index 00000000..d8fe28d4 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php @@ -0,0 +1,39 @@ +.*?)\"'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-json-value'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonPropertyPattern.php b/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonPropertyPattern.php new file mode 100644 index 00000000..3365dfc6 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonPropertyPattern.php @@ -0,0 +1,25 @@ +[\w\\\\\-\.]+)\"(\s)*\:/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-json-property'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/ClassResolutionInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/ClassResolutionInjection.php new file mode 100644 index 00000000..ca6e7d64 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/ClassResolutionInjection.php @@ -0,0 +1,35 @@ +[\w]+?)\b[^\(]/'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $theme = $highlighter->getTheme(); + + $tokenType = Str::upper($content) == 'CLASS' ? 'hl-php-keyword' : 'hl-php-constant'; + + return Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType($tokenType))) + . $content + . Escape::tokens($theme->after(new DynamicTokenType($tokenType))) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/DoubleQuoteValueInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/DoubleQuoteValueInjection.php new file mode 100644 index 00000000..62f03962 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/DoubleQuoteValueInjection.php @@ -0,0 +1,34 @@ +".*?")'; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $theme = $highlighter->getTheme(); + + $clear_content = Escape::terminal($content); + + return Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType('hl-php-value'))) + . $clear_content + . Escape::tokens($theme->after(new DynamicTokenType('hl-php-value'))) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/MultilineSingleDocCommentInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/MultilineSingleDocCommentInjection.php new file mode 100644 index 00000000..bc2d8e34 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/MultilineSingleDocCommentInjection.php @@ -0,0 +1,51 @@ +\/\*(.|\n)*?\*\/)/m'; //(\r\n)*? + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + preg_match_all('/(?❷\/span❸)/', $content, $m1, PREG_OFFSET_CAPTURE); + preg_match_all('/(?❷span)/', $content, $m2, PREG_OFFSET_CAPTURE); + if (count($m1['match']) != count($m2['match'])) { + return $content; + } + //dd($content, $m1, $m2); + $theme = $highlighter->getTheme(); + //return Escape::tokens('') . $highlighter->parse($content, new PhpDocCommentLanguage()) . Escape::tokens(''); + $clear_content = str_replace("\r", '', Escape::terminal($content)); + + //$clear_content = $this->clearContent($content); + + //$t = Escape::injection( + // Escape::tokens($theme->before(new DynamicTokenType('hl-php-comment'))) + // . $clear_content + // . Escape::tokens($theme->after(new DynamicTokenType('hl-php-comment'))) + //); + + //if (strpos($content, 'throttle') > 0) { dd($content, $clear_content, $t); } + return Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType('hl-php-comment'))) + . $clear_content //$content //$clear_content + . Escape::tokens($theme->after(new DynamicTokenType('hl-php-comment'))) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentParamTypeInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentParamTypeInjection.php index 193ac527..24a44ad0 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentParamTypeInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentParamTypeInjection.php @@ -44,8 +44,8 @@ public function parseContent(string $content, Highlighter $highlighter): string $k = $match['match']; array_walk($k, function($val, $key) use (&$types) { - if (!empty(trim($val[$key]))) { - array_push($types, trim($val[$key])); + if (!empty(trim($val[0]))) { + array_push($types, trim($val[0])); } }); @@ -59,8 +59,8 @@ public function parseContent(string $content, Highlighter $highlighter): string $k = $match['match']; array_walk($k, function($val, $key) use (&$types) { - if (!empty(trim($val[$key]))) { - array_push($types, trim($val[$key])); + if (!empty(trim($val[0]))) { + array_push($types, trim($val[0])); } }); diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php index 31e5ed64..3e0faeeb 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php @@ -16,7 +16,7 @@ public function getPattern(): string { - return "'(?.*?)'"; + return "(?'(.|\n)*?')"; } public function parseContent(string $content, Highlighter $highlighter): string diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php index c34675f4..f6c23bb1 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php @@ -4,14 +4,14 @@ namespace App\MarkDown\CustomHL\Languages\Php\Injections; -use Tempest\Highlight\Before; +use Tempest\Highlight\After; use Tempest\Highlight\Highlighter; use Tempest\Highlight\Injection; use Tempest\Highlight\IsInjection; use Tempest\Highlight\Escape; use Tempest\Highlight\Tokens\DynamicTokenType; -#[Before] +#[After] final readonly class SinglelineCommentInjection implements Injection { use IsInjection; diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/ClassResolutionPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/CatchTypePattern.php similarity index 70% rename from app/MarkDown/CustomHL/Languages/Php/Patterns/ClassResolutionPattern.php rename to app/MarkDown/CustomHL/Languages/Php/Patterns/CatchTypePattern.php index abf76475..191793c2 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/ClassResolutionPattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/CatchTypePattern.php @@ -9,17 +9,17 @@ use Tempest\Highlight\Tokens\TokenType; use Tempest\Highlight\Tokens\DynamicTokenType; -final readonly class ClassResolutionPattern implements Pattern +final readonly class CatchTypePattern implements Pattern { use IsPattern; public function getPattern(): string { - return '\:\:(?class)'; + return 'catch \((?[\w\||]+)'; } public function getTokenType(): TokenType { - return new DynamicTokenType('hl-php-keyword'); + return new DynamicTokenType('hl-php-type'); } } diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/ConstantNamePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/ConstantNamePattern.php index ac526094..baa93668 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/ConstantNamePattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/ConstantNamePattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '\b(?[A-Z_]+)\b'; + return '\b(?[A-Z_]+)\b(?!:)'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php index 42f08c93..432fa0bf 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/[ |>|:]?\b(?[_\-a-z\w]+)\(/'; + return '/[^\$][(^)| |>|:]?(?!\$)\b(?[_\-a-z\w]+)\(/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/ImplementsPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/ImplementsPattern.php index 5de74dbc..b0fd304c 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/ImplementsPattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/ImplementsPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return 'implements(?[\s\,\w]+)'; + return 'implements(?[\s\,\w\\\\]+)'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/KeywordPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/KeywordPattern.php index 0f3310cb..2988368f 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/KeywordPattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/KeywordPattern.php @@ -30,7 +30,7 @@ public function caseInsensitive(): self public function getPattern(): string { - $pattern = "/\b(?)*(?{$this->keyword})(\$|\,|\)|\;|\:|\s|\(|\-\>)/"; + $pattern = "/\b(?)*(?{$this->keyword})(\$|\,|\)|\;|\:|\s|\(|\-\>|\])/"; if ($this->caseInsensitive) { $pattern .= 'i'; diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/MultilineSingleDocCommentPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/MultilineSingleDocCommentPattern.php new file mode 100644 index 00000000..0a6f375d --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/MultilineSingleDocCommentPattern.php @@ -0,0 +1,25 @@ +\/\*(.|\n)*?\*\/)/m'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-php-comment'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php index 44beca8a..130e63c3 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/use [\w\\\\]*\b(?[\w]+)[;]*/'; + return '/use\s+(function(\s)+)?[\w\\\\]*\b(?[\w]+)[;]*/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php index 8b7929dd..3c893295 100644 --- a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php @@ -12,10 +12,9 @@ //use App\Tempest\Highlight\Languages\Php\Injections\PhpHeredocInjection; //use App\Tempest\Highlight\Languages\Php\Patterns\AttributeTypePattern; -//use App\Tempest\Highlight\Languages\Php\Patterns\CatchTypePattern; +use App\MarkDown\CustomHL\Languages\Php\Patterns\CatchTypePattern; use App\MarkDown\CustomHL\Languages\Php\Patterns\ClassNamePattern; //use App\Tempest\Highlight\Languages\Php\Patterns\ClassPropertyPattern; -use App\MarkDown\CustomHL\Languages\Php\Patterns\ClassResolutionPattern; //use App\Tempest\Highlight\Languages\Php\Patterns\ConstantPropertyPattern; //use App\Tempest\Highlight\Languages\Php\Patterns\ConstantTypesPattern; //use App\Tempest\Highlight\Languages\Php\Patterns\DoubleQuoteValuePattern; @@ -31,7 +30,7 @@ use App\MarkDown\CustomHL\Languages\Php\Patterns\KeywordPattern; -//use App\Tempest\Highlight\Languages\Php\Patterns\MultilineSingleDocCommentPattern; +//use App\MarkDown\CustomHL\Languages\Php\Patterns\MultilineSingleDocCommentPattern; use App\MarkDown\CustomHL\Languages\Php\Patterns\NamedArgumentPattern; //use App\Tempest\Highlight\Languages\Php\Patterns\NestedFunctionCallPattern; //use App\MarkDown\CustomHL\Languages\Php\Patterns\NewObjectPattern; @@ -70,10 +69,13 @@ //use App\MarkDown\CustomHL\Languages\Php\Patterns\NamespacePattern; use App\MarkDown\CustomHL\Languages\Php\Injections\SinglelineCommentInjection; +use App\MarkDown\CustomHL\Languages\Php\Injections\MultilineSingleDocCommentInjection; use App\MarkDown\CustomHL\Languages\Php\Injections\SingleQuoteValueInjection; +use App\MarkDown\CustomHL\Languages\Php\Injections\DoubleQuoteValueInjection; use App\MarkDown\CustomHL\Languages\Php\Patterns\GenericPattern; use App\MarkDown\CustomHL\Languages\Php\Injections\NewObjectInjection; -use App\MarkDown\CustomHL\Languages\Php\Patterns\UriPathPattern; +//use App\MarkDown\CustomHL\Languages\Php\Patterns\UriPathPattern; +use App\MarkDown\CustomHL\Languages\Php\Injections\ClassResolutionInjection; class PhpLanguage extends CustomBaseLanguage { @@ -92,7 +94,10 @@ public function getInjections(): array ////new PhpAttributeInstanceInjection(), new PhpFunctionParametersInjection(), new SingleQuoteValueInjection(), + new DoubleQuoteValueInjection(), new SinglelineCommentInjection(), + new MultilineSingleDocCommentInjection(), + new ClassResolutionInjection(), new ReturnTypeInjection(), new NewObjectInjection(), @@ -112,7 +117,7 @@ public function getPatterns(): array new NamedArgumentPattern(), ////new OperatorPattern('&&'), ////new OperatorPattern('\|\|'), - new OperatorPattern('(!==|===|==|<|=>|>|=|\*|\+\+)'), + new OperatorPattern('(!==|===|==|<|=>|>|=|\*|\+\+|&&|\?)'), //new OperatorPattern('instanceof'), ////new OperatorPattern('\?'), ////new FunctionNamePattern(), @@ -125,6 +130,8 @@ public function getPatterns(): array // KEYWORDS new KeywordPattern('null', 'hl-php-constant'), new GenericPattern('/(?\$this)(\-|\$|\,|\)|\;|\:|\s|\()/', 'hl-php-this'), + new GenericPattern('/\->(?[\w]+?)\b[^\(]/', 'hl-php-delimeter'), + new GenericPattern('/\((?(string))\)/', 'hl-php-keyword'), ////new KeywordPattern('parent'), new KeywordPattern('true', 'hl-php-constant'), new KeywordPattern('false', 'hl-php-constant'), @@ -136,7 +143,7 @@ public function getPatterns(): array ////new KeywordPattern('break'), ////new KeywordPattern('callable'), new KeywordPattern('case'), - ////new KeywordPattern('catch'), + new KeywordPattern('catch'), new KeywordPattern('class'), ////new KeywordPattern('clone'), ////new KeywordPattern('const'), @@ -195,9 +202,9 @@ public function getPatterns(): array new KeywordPattern('return'), new KeywordPattern('static'), ////new KeywordPattern('switch'), - ////new KeywordPattern('throw'), + new KeywordPattern('throw'), ////new KeywordPattern('trait'), - ////new KeywordPattern('try'), + new KeywordPattern('try'), ////new KeywordPattern('unset'), new KeywordPattern('use'), new KeywordPattern('validate', 'hl-php-constant'), @@ -206,14 +213,13 @@ public function getPatterns(): array ////new KeywordPattern('xor'), new KeywordPattern('yield'), ////new KeywordPattern('yield from'), - new ClassResolutionPattern(), ////new ShortFunctionReferencePattern(), ////new PropertyHookSetPattern(), ////new PropertyHookGetPattern(), new DigitsPattern(), // COMMENTS - ////new MultilineSingleDocCommentPattern(), + //new MultilineSingleDocCommentPattern(), //new SinglelineCommentPattern(), // TYPES @@ -230,7 +236,7 @@ public function getPatterns(): array //new NewObjectPattern(), new InstanceOfPattern(), ////new UseAsPattern(), - ////new CatchTypePattern(), + new CatchTypePattern(), new EnumBackedTypePattern(), ////new GroupedTypePattern(), ////new PropertyHookSetParameterTypePattern(), diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php b/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php index 1c98358b..b689ef91 100644 --- a/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php @@ -7,7 +7,7 @@ use App\MarkDown\CustomHL\Languages\CustomBase\CustomBaseLanguage; //use Tempest\Highlight\Languages\Php\Injections\PhpAttributeInstanceInjection; //use Tempest\Highlight\Languages\Php\Injections\PhpAttributePlainInjection; -//use Tempest\Highlight\Languages\Php\Injections\PhpDocCommentInjection; +use App\MarkDown\CustomHL\Languages\Php\Injections\PhpDocCommentInjection; //use Tempest\Highlight\Languages\Php\Patterns\ClassPropertyPattern; use App\MarkDown\CustomHL\Languages\Php\Patterns\KeywordPattern; //use App\Tempest\Highlight\Languages\Php\Patterns\MultilineSingleDocCommentPattern; @@ -31,7 +31,7 @@ public function getInjections(): array ...parent::getInjections(), //new PhpAttributePlainInjection(), //new PhpAttributeInstanceInjection(), - //new PhpDocCommentInjection(), + new PhpDocCommentInjection(), new TypeForVariableInjection(), ]; } diff --git a/app/MarkDown/CustomHL/Languages/Shell/Patterns/SinglelineCommentPattern.php b/app/MarkDown/CustomHL/Languages/Shell/Patterns/SinglelineCommentPattern.php new file mode 100644 index 00000000..76de00b9 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Shell/Patterns/SinglelineCommentPattern.php @@ -0,0 +1,25 @@ +#(.)*)/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-shell-comment'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php b/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php index 25896e9a..cf8b401a 100644 --- a/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php @@ -11,6 +11,7 @@ use App\MarkDown\CustomHL\Languages\Shell\Patterns\DoubleQuoteValuePattern; use App\MarkDown\CustomHL\Languages\Shell\Patterns\QuoteValuePattern; use App\MarkDown\CustomHL\Languages\Shell\Patterns\DelimeterPattern; +use App\MarkDown\CustomHL\Languages\Shell\Patterns\SinglelineCommentPattern; class ShellLanguage extends CustomBaseLanguage { @@ -41,6 +42,7 @@ public function getPatterns(): array new DoubleQuoteValuePattern(), new QuoteValuePattern(), new DelimeterPattern('(cd|\|)'), + new SinglelineCommentPattern(), ]; } } \ No newline at end of file diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypePattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypePattern.php index 9a785447..601a800a 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypePattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypePattern.php @@ -17,11 +17,11 @@ public function getPattern(): string { // return '(?[\w\-:]*[\w\-]+)(=")?'; // return '/<[\w\- #]+\b(?[\w\-:]*[\w\-]+)\s*(=")? >/'; - return '/\<\!doctype (?\w+)/i'; + return '/\<\!(?doctype)/i'; } public function getTokenType(): TokenType { - return new DynamicTokenType('hl-xml-attr'); + return new DynamicTokenType('hl-xml-tag'); } } diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypeTypePattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypeTypePattern.php new file mode 100644 index 00000000..5476f28b --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlDoctypeTypePattern.php @@ -0,0 +1,27 @@ +[\w\-:]*[\w\-]+)(=")?'; +// return '/<[\w\- #]+\b(?[\w\-:]*[\w\-]+)\s*(=")? >/'; + return '/\<\!doctype (?\w+)/i'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-xml-attr'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php index ac7150f6..de5a2258 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '<(\!)?(?[\w\-\:\.]+)'; + return '<(?[\w\-\:\.]+)'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php index 1fda453d..46518330 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/(?<[\/\!]?)[\w\-]+/'; + return '/(?<(\/|\!)?(?!\-))[\w\-]+/'; // '/(?<[\/\!]?)[\w\-]+/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Xml/XmlLanguage.php b/app/MarkDown/CustomHL/Languages/Xml/XmlLanguage.php index 5aabe0a9..87ea82c9 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/XmlLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Xml/XmlLanguage.php @@ -14,6 +14,7 @@ use App\MarkDown\CustomHL\Languages\Xml\Patterns\XmlStartOpenTagPattern; use App\MarkDown\CustomHL\Languages\Xml\Patterns\XmlEndCloseTagPattern; use App\MarkDown\CustomHL\Languages\Xml\Patterns\XmlDoctypePattern; +use App\MarkDown\CustomHL\Languages\Xml\Patterns\XmlDoctypeTypePattern; class XmlLanguage extends CustomBaseLanguage { @@ -34,6 +35,7 @@ public function getPatterns(): array return [ ...parent::getPatterns(), new XmlDoctypePattern(), + new XmlDoctypeTypePattern(), new XmlOpenTagPattern(), new XmlCloseTagPattern(), new XmlAttributePattern(), diff --git a/app/MarkDown/CustomHL/style.css b/app/MarkDown/CustomHL/style.css index 5940731e..835c9b73 100644 --- a/app/MarkDown/CustomHL/style.css +++ b/app/MarkDown/CustomHL/style.css @@ -71,6 +71,10 @@ pre, code { color: #89DDFF; } +.hl-shell-comment{ + color: #697098; +} + .hl-ini-constant{ color: #C792EA; @@ -173,7 +177,7 @@ pre, code { .hl-js-property{ - color: #82AAFF; + color: #89DDFF; } .hl-js-number{ @@ -188,6 +192,31 @@ pre, code { color: #C792EA; } +.hl-js-comment{ + color: #697098; +} + +.hl-js-slug{ + color: #FF5874; +} + +.hl-js-constant{ + color: #82AAFF; +} + +.hl-js-operator{ + color: #C792EA; +} + + +.hl-json-property{ + color: #C3E88D; +} + +.hl-json-value{ + color: #80CBC4; +} + .hl-property { color: #cb57ac; From 49cdab6872b0b2b4f7c7804315d357fa4b83988d Mon Sep 17 00:00:00 2001 From: demn98 Date: Tue, 26 Nov 2024 20:21:57 +0300 Subject: [PATCH 3/9] highlighter tmp commit 20241126 --- .../JsSingleQuoteValue2Injection.php | 34 +++++++++++++++++++ .../JsSingleQuoteValueInjection.php | 34 +++++++++++++++++++ .../JavaScript/JavaScriptLanguage.php | 13 ++++--- ...eValuePattern.php => FunctionEPattern.php} | 6 ++-- .../Patterns/JsMultilineCommentPattern.php | 25 ++++++++++++++ .../CustomHL/Languages/Json/JsonLanguage.php | 2 ++ .../Json/Patterns/DigitsValuePattern.php | 25 ++++++++++++++ .../Patterns/JsonDoubleQuoteValuePattern.php | 5 +-- .../PhpDocCommentReturnTypeInjection.php | 32 ++++++++++++++--- .../Injections/SingleQuoteValueInjection.php | 2 +- .../Php/Patterns/FunctionCallPattern.php | 2 +- .../Languages/Php/Patterns/UsePattern.php | 2 +- .../CustomHL/Languages/Php/PhpLanguage.php | 8 ++--- .../Languages/Php/PhpTypeLanguage.php | 6 ++++ .../CustomHL/Tokens/QuotedValueTokenType.php | 20 +++++++++++ 15 files changed, 196 insertions(+), 20 deletions(-) create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsSingleQuoteValue2Injection.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsSingleQuoteValueInjection.php rename app/MarkDown/CustomHL/Languages/JavaScript/Patterns/{JsSingleQuoteValuePattern.php => FunctionEPattern.php} (71%) create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsMultilineCommentPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Json/Patterns/DigitsValuePattern.php create mode 100644 app/MarkDown/CustomHL/Tokens/QuotedValueTokenType.php diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsSingleQuoteValue2Injection.php b/app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsSingleQuoteValue2Injection.php new file mode 100644 index 00000000..4edd0884 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsSingleQuoteValue2Injection.php @@ -0,0 +1,34 @@ +`.*?`)"; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $theme = $highlighter->getTheme(); + + $clear_content = Escape::terminal($content); + + return Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType('hl-js-value'))) + . $clear_content + . Escape::tokens($theme->after(new DynamicTokenType('hl-js-value'))) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsSingleQuoteValueInjection.php b/app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsSingleQuoteValueInjection.php new file mode 100644 index 00000000..be499397 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsSingleQuoteValueInjection.php @@ -0,0 +1,34 @@ +'.*?')"; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + $theme = $highlighter->getTheme(); + + $clear_content = Escape::terminal($content); + + return Escape::injection( + Escape::tokens($theme->before(new DynamicTokenType('hl-js-value'))) + . $clear_content + . Escape::tokens($theme->after(new DynamicTokenType('hl-js-value'))) + ); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php b/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php index 59b39178..4a74f6e7 100644 --- a/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php +++ b/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php @@ -10,17 +10,19 @@ //use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsDoubleQuoteValuePattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\JsKeywordPattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\JsMethodPattern; -//use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsMultilineCommentPattern; +use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\JsMultilineCommentPattern; //use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsNewObjectPattern; //use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsObjectPropertyPattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\JsPropertyPattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\JsSinglelineCommentPattern; -use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\JsSingleQuoteValuePattern; //use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsStaticClassPattern; //use App\Tempest\Highlight\Languages\JavaScript\Patterns\JsStaticPropertyPattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\DigitsPattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\ConstantNamePattern; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\OperatorPattern; +use App\MarkDown\CustomHL\Languages\JavaScript\Injections\JsSingleQuoteValueInjection; +use App\MarkDown\CustomHL\Languages\JavaScript\Injections\JsSingleQuoteValue2Injection; +use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\FunctionEPattern; class JavaScriptLanguage extends CustomBaseLanguage { @@ -42,6 +44,8 @@ public function getInjections(): array return [ ...parent::getInjections(), //new JsDocInjection(), + new JsSingleQuoteValueInjection(), + new JsSingleQuoteValue2Injection(), ]; } @@ -56,6 +60,7 @@ public function getPatterns(): array new JsKeywordPattern('from'), new JsKeywordPattern('import'), new JsKeywordPattern('null', 'hl-js-slug'), + new JsKeywordPattern('this', 'hl-js-slug'), new JsKeywordPattern('true', 'hl-js-slug'), new JsKeywordPattern('var'), //new JsKeywordPattern('set'), @@ -111,7 +116,7 @@ public function getPatterns(): array new OperatorPattern('(=|\?\?|===)'), // COMMENTS - //new JsMultilineCommentPattern(), + new JsMultilineCommentPattern(), new JsSinglelineCommentPattern(), // TYPES @@ -126,12 +131,12 @@ public function getPatterns(): array //new JsStaticPropertyPattern(), // VALUES - new JsSingleQuoteValuePattern(), //new JsDoubleQuoteValuePattern(), new ConstantNamePattern(), new DigitsPattern(), + new FunctionEPattern(), ]; } } diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSingleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/FunctionEPattern.php similarity index 71% rename from app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSingleQuoteValuePattern.php rename to app/MarkDown/CustomHL/Languages/JavaScript/Patterns/FunctionEPattern.php index 7958dfdd..01bb34fd 100644 --- a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSingleQuoteValuePattern.php +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/FunctionEPattern.php @@ -9,17 +9,17 @@ use Tempest\Highlight\Tokens\TokenType; use Tempest\Highlight\Tokens\DynamicTokenType; -final readonly class JsSingleQuoteValuePattern implements Pattern +final readonly class FunctionEPattern implements Pattern { use IsPattern; public function getPattern(): string { - return "'(?.*?)'"; + return '\((?[a-z]+)\)'; } public function getTokenType(): TokenType { - return new DynamicTokenType('hl-js-value'); + return new DynamicTokenType('hl-js-constant'); } } diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsMultilineCommentPattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsMultilineCommentPattern.php new file mode 100644 index 00000000..5665ec53 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsMultilineCommentPattern.php @@ -0,0 +1,25 @@ +\/\*(.|\n)*?\*\/)/m'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-comment'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php b/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php index d8fe28d4..005c9d93 100644 --- a/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php @@ -10,6 +10,7 @@ use App\MarkDown\CustomHL\Languages\Json\Patterns\JsonDoubleQuoteValuePattern; use App\MarkDown\CustomHL\Languages\Json\Patterns\JsonPropertyPattern; use App\MarkDown\CustomHL\Languages\Json\Injections\JsonArrayInjection; +use App\MarkDown\CustomHL\Languages\Json\Patterns\DigitsValuePattern; class JsonLanguage extends CustomBaseLanguage { @@ -34,6 +35,7 @@ public function getPatterns(): array //new JsonAccoladesPattern(), //new JsonArrayBracketsPattern(), new JsonDoubleQuoteValuePattern(), + new DigitsValuePattern(), ]; } } diff --git a/app/MarkDown/CustomHL/Languages/Json/Patterns/DigitsValuePattern.php b/app/MarkDown/CustomHL/Languages/Json/Patterns/DigitsValuePattern.php new file mode 100644 index 00000000..53b2da19 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Json/Patterns/DigitsValuePattern.php @@ -0,0 +1,25 @@ +[0-9.]+)/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-js-number'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonDoubleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonDoubleQuoteValuePattern.php index 46298510..1d1f88c4 100644 --- a/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonDoubleQuoteValuePattern.php +++ b/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonDoubleQuoteValuePattern.php @@ -7,7 +7,8 @@ use Tempest\Highlight\IsPattern; use Tempest\Highlight\Pattern; use Tempest\Highlight\Tokens\TokenType; -use Tempest\Highlight\Tokens\DynamicTokenType; +//use Tempest\Highlight\Tokens\DynamicTokenType; +use App\MarkDown\CustomHL\Tokens\QuotedValueTokenType; final readonly class JsonDoubleQuoteValuePattern implements Pattern { @@ -20,6 +21,6 @@ public function getPattern(): string public function getTokenType(): TokenType { - return new DynamicTokenType('hl-json-value'); + return new QuotedValueTokenType(); //DynamicTokenType('hl-json-value'); } } diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php index 642cd218..508c969d 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php @@ -12,6 +12,8 @@ use Tempest\Highlight\Tokens\DynamicTokenType; use App\MarkDown\CustomHL\Languages\Php\PhpConst; +//use App\MarkDown\CustomHL\Languages\Php\PhpDocCommentParamTypes; + final readonly class PhpDocCommentReturnTypeInjection implements Injection { use IsInjection; @@ -25,6 +27,28 @@ public function parseContent(string $content, Highlighter $highlighter): string { $keywords = PhpConst::SYS_KEYWORDS; + $types = preg_match_all('/(?!([\w]+)\\\\)(?[\w]+)/', $content, $matches); + + $theme = $highlighter->getTheme(); + + if (key_exists('match', $matches)) + { + foreach($matches['match'] as $type) + { + $token = (in_array($type, $keywords)) ? 'hl-php-keyword' : 'hl-php-type'; + + $content = preg_replace( + '/\b' . $type . '[\b]*/', + Escape::tokens($theme->before(new DynamicTokenType($token))) + . $type + . Escape::tokens($theme->after(new DynamicTokenType($token))), + $content, + ); + } + } + + + /* $types = explode('|', trim($content)); $theme = $highlighter->getTheme(); @@ -34,7 +58,7 @@ public function parseContent(string $content, Highlighter $highlighter): string if (key_exists('match', $matches)) { $content = preg_replace( - '/\barray[\b]*/', + '/\barray[\b]* /', Escape::tokens($theme->before(new DynamicTokenType('hl-php-keyword'))) . 'array' . Escape::tokens($theme->after(new DynamicTokenType('hl-php-keyword'))), @@ -56,7 +80,7 @@ public function parseContent(string $content, Highlighter $highlighter): string $token = (in_array($tk, $keywords)) ? 'hl-php-keyword' : 'hl-php-type'; $content = preg_replace( - '/\b' . $tk . '[\b]*/', + '/\b' . $tk . '[\b]* /', Escape::tokens($theme->before(new DynamicTokenType($token))) . $tk . Escape::tokens($theme->after(new DynamicTokenType($token))), @@ -73,7 +97,7 @@ public function parseContent(string $content, Highlighter $highlighter): string $token = (in_array($type, $keywords)) ? 'hl-php-keyword' : 'hl-php-type'; $content = preg_replace( - '/\b' . $type . '[\b]*/', + '/\b' . $type . '[\b] * /', Escape::tokens($theme->before(new DynamicTokenType($token))) . $type . Escape::tokens($theme->after(new DynamicTokenType($token))), @@ -81,7 +105,7 @@ public function parseContent(string $content, Highlighter $highlighter): string ); } } - +*/ return $content; } } diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php index 3e0faeeb..b410f60a 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php @@ -16,7 +16,7 @@ public function getPattern(): string { - return "(?'(.|\n)*?')"; + return "(?'(?!(s ))(.|\n)*?')"; } public function parseContent(string $content, Highlighter $highlighter): string diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php index 432fa0bf..aacd5613 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/[^\$][(^)| |>|:]?(?!\$)\b(?[_\-a-z\w]+)\(/'; + return '/[(^)| |>|:]?(?!\$)\b(?[_\-a-z\w]+)\(/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php index 130e63c3..e3abcc70 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/use\s+(function(\s)+)?[\w\\\\]*\b(?[\w]+)[;]*/'; + return '/use\s+(function(\s)+)?[\w\\\\]*\b(?[\w]+[, \w]*)[;]*/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php index 3c893295..50871262 100644 --- a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php @@ -117,7 +117,7 @@ public function getPatterns(): array new NamedArgumentPattern(), ////new OperatorPattern('&&'), ////new OperatorPattern('\|\|'), - new OperatorPattern('(!==|===|==|<|=>|>|=|\*|\+\+|&&|\?)'), + new OperatorPattern('(!==|===|==|<=>|<|=>|>|=|\*|\+\+|\+|&&|\?)'), //new OperatorPattern('instanceof'), ////new OperatorPattern('\?'), ////new FunctionNamePattern(), @@ -129,7 +129,7 @@ public function getPatterns(): array // KEYWORDS new KeywordPattern('null', 'hl-php-constant'), - new GenericPattern('/(?\$this)(\-|\$|\,|\)|\;|\:|\s|\()/', 'hl-php-this'), + new GenericPattern('/(?\$this)(\-|\$|\,|\)|\;|\:|\s|\(|\])/', 'hl-php-this'), new GenericPattern('/\->(?[\w]+?)\b[^\(]/', 'hl-php-delimeter'), new GenericPattern('/\((?(string))\)/', 'hl-php-keyword'), ////new KeywordPattern('parent'), @@ -169,7 +169,7 @@ public function getPatterns(): array ////new KeywordPattern('exit'), new KeywordPattern('extends'), ////new KeywordPattern('final'), - ////new KeywordPattern('finally'), + new KeywordPattern('finally'), new KeywordPattern('fn'), ////new KeywordPattern('for'), new KeywordPattern('foreach'), @@ -209,7 +209,7 @@ public function getPatterns(): array new KeywordPattern('use'), new KeywordPattern('validate', 'hl-php-constant'), new KeywordPattern('value', 'hl-php-constant'), - ////new KeywordPattern('while'), + new KeywordPattern('while'), ////new KeywordPattern('xor'), new KeywordPattern('yield'), ////new KeywordPattern('yield from'), diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php b/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php index b689ef91..6a255bd6 100644 --- a/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Php/PhpTypeLanguage.php @@ -17,6 +17,8 @@ //use Tempest\Highlight\Languages\Php\Patterns\VariablePattern; use App\MarkDown\CustomHL\Languages\Php\Patterns\OperatorPattern; use App\MarkDown\CustomHL\Languages\Php\Injections\TypeForVariableInjection; +use App\MarkDown\CustomHL\Languages\Php\Patterns\DigitsPattern; +//use App\MarkDown\CustomHL\Languages\Php\Patterns\NamedArgumentPattern; final class PhpTypeLanguage extends CustomBaseLanguage { @@ -47,6 +49,7 @@ public function getPatterns(): array //new TypeForVariablePattern(), + //new NamedArgumentPattern(), new OperatorPattern('(<|=>|>|=|\*)'), //new KeywordPattern('array'), //new KeywordPattern('bool'), @@ -56,6 +59,7 @@ public function getPatterns(): array new KeywordPattern('null', 'hl-php-constant'), new KeywordPattern('true', 'hl-php-constant'), new KeywordPattern('false', 'hl-php-constant'), + new KeywordPattern('use'), //new KeywordPattern('new'), //new KeywordPattern('readonly'), @@ -64,6 +68,8 @@ public function getPatterns(): array // VARIABLES //new VariablePattern(), + + new DigitsPattern(), ]; } } diff --git a/app/MarkDown/CustomHL/Tokens/QuotedValueTokenType.php b/app/MarkDown/CustomHL/Tokens/QuotedValueTokenType.php new file mode 100644 index 00000000..94689a4b --- /dev/null +++ b/app/MarkDown/CustomHL/Tokens/QuotedValueTokenType.php @@ -0,0 +1,20 @@ + Date: Thu, 28 Nov 2024 11:55:10 +0300 Subject: [PATCH 4/9] highlighter tmp commit 20241127 --- .../Languages/Json/Injections/JsonArrayInjection.php | 2 +- .../Languages/Json/Patterns/JsonPropertyPattern.php | 2 +- .../Php/Injections/DoubleQuoteValueInjection.php | 2 +- .../Languages/Php/Injections/NewObjectInjection.php | 3 ++- .../Php/Injections/SingleQuoteValueInjection.php | 11 +++++++---- .../Languages/Php/Patterns/FunctionCallPattern.php | 1 + .../Languages/Php/Patterns/NewObjectPattern.php | 3 ++- app/MarkDown/CustomHL/Languages/Php/PhpConst.php | 1 + app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php | 9 +++++++-- app/MarkDown/CustomHL/Tokens/QuotedValueTokenType.php | 6 +++++- 10 files changed, 28 insertions(+), 12 deletions(-) diff --git a/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php b/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php index bec8a002..50195fe2 100644 --- a/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php +++ b/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php @@ -31,7 +31,7 @@ public function parseContent(string $content, Highlighter $highlighter): string foreach($match['match'] as $val) { $content = preg_replace( - '/\b' . $val[0] . '[\b]*/', + '/\b' . addcslashes($val[0], '/*') . '[\b]*/', Escape::tokens($theme->before(new DynamicTokenType('hl-json-value'))) . $val[0] . Escape::tokens($theme->after(new DynamicTokenType('hl-json-value'))), diff --git a/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonPropertyPattern.php b/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonPropertyPattern.php index 3365dfc6..babf4d3b 100644 --- a/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonPropertyPattern.php +++ b/app/MarkDown/CustomHL/Languages/Json/Patterns/JsonPropertyPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/\"(?[\w\\\\\-\.]+)\"(\s)*\:/'; + return '/\"(?[\w\\\\\-\. \|]+)\"(\s)*\:/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/DoubleQuoteValueInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/DoubleQuoteValueInjection.php index 62f03962..2eccfa25 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/DoubleQuoteValueInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/DoubleQuoteValueInjection.php @@ -16,7 +16,7 @@ public function getPattern(): string { - return '(?".*?")'; + return '(?"(\\\"|.)*?")'; } public function parseContent(string $content, Highlighter $highlighter): string diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/NewObjectInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/NewObjectInjection.php index 57c270fe..a1b25e20 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/NewObjectInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/NewObjectInjection.php @@ -18,7 +18,8 @@ public function getPattern(): string { - return 'new (?[\w\\\\]+)'; + //return 'new (?[\w\\\\]+)'; + return '/new [\w\\\\]*\b(?[\w]+)/'; } public function parseContent(string $content, Highlighter $highlighter): string diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php index b410f60a..8e9ae59c 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php @@ -4,19 +4,22 @@ namespace App\MarkDown\CustomHL\Languages\Php\Injections; +use Tempest\Highlight\After; use Tempest\Highlight\Highlighter; use Tempest\Highlight\Injection; use Tempest\Highlight\IsInjection; use Tempest\Highlight\Escape; -use Tempest\Highlight\Tokens\DynamicTokenType; +//use Tempest\Highlight\Tokens\DynamicTokenType; +use App\MarkDown\CustomHL\Tokens\QuotedValueTokenType; +#[After] final readonly class SingleQuoteValueInjection implements Injection { use IsInjection; public function getPattern(): string { - return "(?'(?!(s ))(.|\n)*?')"; + return "(?'(?!(s ))(\\\'|.|\n)*?')"; } public function parseContent(string $content, Highlighter $highlighter): string @@ -26,9 +29,9 @@ public function parseContent(string $content, Highlighter $highlighter): string $clear_content = Escape::terminal($content); return Escape::injection( - Escape::tokens($theme->before(new DynamicTokenType('hl-php-value'))) + Escape::tokens($theme->before(new QuotedValueTokenType('hl-php-value'))) . $clear_content - . Escape::tokens($theme->after(new DynamicTokenType('hl-php-value'))) + . Escape::tokens($theme->after(new QuotedValueTokenType('hl-php-value'))) ); } } diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php index aacd5613..b5b0ba99 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/FunctionCallPattern.php @@ -16,6 +16,7 @@ public function getPattern(): string { return '/[(^)| |>|:]?(?!\$)\b(?[_\-a-z\w]+)\(/'; + //return '/[^\$][(^)| |>|:]?(?!\$)\b(?[_\-a-z\w]+)\(/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/NewObjectPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/NewObjectPattern.php index cbc551cc..b5fa196d 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/NewObjectPattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/NewObjectPattern.php @@ -15,7 +15,8 @@ public function getPattern(): string { - return 'new (?[\w\\\\]+)'; + //return 'new (?[\w\\\\]+)'; + return '/new [\w\\\\]*\b(?[\w]+)/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpConst.php b/app/MarkDown/CustomHL/Languages/Php/PhpConst.php index bcfa8bc9..43aea383 100644 --- a/app/MarkDown/CustomHL/Languages/Php/PhpConst.php +++ b/app/MarkDown/CustomHL/Languages/Php/PhpConst.php @@ -14,5 +14,6 @@ class PhpConst 'void', 'int', 'mixed', + 'object', ]; } diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php index 50871262..e556ba0c 100644 --- a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php @@ -84,6 +84,11 @@ public function getName(): string return 'php'; } + public function getAliases(): array + { + return ['txt']; + } + public function getInjections(): array { return [ @@ -117,7 +122,7 @@ public function getPatterns(): array new NamedArgumentPattern(), ////new OperatorPattern('&&'), ////new OperatorPattern('\|\|'), - new OperatorPattern('(!==|===|==|<=>|<|=>|>|=|\*|\+\+|\+|&&|\?)'), + new OperatorPattern('(!==|===|==|<=>|<|=>|>|=|\*|\+\+|\+|&&|\?|\|\|)'), //new OperatorPattern('instanceof'), ////new OperatorPattern('\?'), ////new FunctionNamePattern(), @@ -141,7 +146,7 @@ public function getPatterns(): array ////new KeywordPattern('and'), new KeywordPattern('as'), ////new KeywordPattern('break'), - ////new KeywordPattern('callable'), + new KeywordPattern('callable'), new KeywordPattern('case'), new KeywordPattern('catch'), new KeywordPattern('class'), diff --git a/app/MarkDown/CustomHL/Tokens/QuotedValueTokenType.php b/app/MarkDown/CustomHL/Tokens/QuotedValueTokenType.php index 94689a4b..a72c1623 100644 --- a/app/MarkDown/CustomHL/Tokens/QuotedValueTokenType.php +++ b/app/MarkDown/CustomHL/Tokens/QuotedValueTokenType.php @@ -8,9 +8,13 @@ final readonly class QuotedValueTokenType implements TokenType { + public function __construct( + private string $value = 'hl-json-value' + ) {} + public function getValue(): string { - return 'hl-json-value'; + return $this->value; } public function canContain(TokenType $other): bool From 61ca89fc348939a55427c93c8e46073164187b08 Mon Sep 17 00:00:00 2001 From: Alexandr Chernyaev Date: Sun, 1 Dec 2024 04:51:12 +0300 Subject: [PATCH 5/9] Automatically display the latest version on the library upgrade page. --- resources/views/library/upgrade.blade.php | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/resources/views/library/upgrade.blade.php b/resources/views/library/upgrade.blade.php index 4bd3e320..d81706ef 100644 --- a/resources/views/library/upgrade.blade.php +++ b/resources/views/library/upgrade.blade.php @@ -12,16 +12,27 @@ которого необходимо придерживаться. - +
- 7.x - 8.x - 9.x - 10.x + @php + $version = \Str::of(\App\Docs::DEFAULT_VERSION)->before('.')->toString(); + @endphp + + @foreach(collect()->range(0,3)->reverse() as $index) + $index === 0, + ])> + {{ $version - $index }}.x + + @endforeach
+ @php $sections = collect([ "security", From 97585312c9d1efbe4b7906faf4ca461312f41c67 Mon Sep 17 00:00:00 2001 From: demn98 Date: Wed, 4 Dec 2024 19:39:52 +0300 Subject: [PATCH 6/9] highlighter tmp commit 20241204 --- .../CommonMark/CustomHighlightExtension.php | 8 ++--- .../CustomHL/Languages/Bash/BashLanguage.php | 33 ------------------- .../MultilineSingleDocCommentInjection.php | 6 ++-- .../Languages/Shell/ShellLanguage.php | 3 +- 4 files changed, 9 insertions(+), 41 deletions(-) delete mode 100644 app/MarkDown/CustomHL/Languages/Bash/BashLanguage.php diff --git a/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php b/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php index d1e89f16..86600062 100644 --- a/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php +++ b/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php @@ -7,15 +7,15 @@ use League\CommonMark\Environment\EnvironmentBuilderInterface; use League\CommonMark\Extension\CommonMark\Node\Block\FencedCode; use League\CommonMark\Extension\CommonMark\Node\Block\IndentedCode; -use League\CommonMark\Extension\CommonMark\Node\Inline\Code; +//use League\CommonMark\Extension\CommonMark\Node\Inline\Code; use League\CommonMark\Extension\ExtensionInterface; use Tempest\Highlight\Highlighter; use Tempest\Highlight\Themes\InlineTheme; use Tempest\Highlight\CommonMark\CodeBlockRenderer; -use Tempest\Highlight\CommonMark\InlineCodeBlockRenderer; +//use Tempest\Highlight\CommonMark\InlineCodeBlockRenderer; use App\MarkDown\CustomHL\Languages\Php\PhpLanguage; use App\MarkDown\CustomHL\Languages\Shell\ShellLanguage; -use App\MarkDown\CustomHL\Languages\Bash\BashLanguage; +//use App\MarkDown\CustomHL\Languages\Bash\BashLanguage; use App\MarkDown\CustomHL\Languages\Ini\IniLanguage; use App\MarkDown\CustomHL\Languages\Blade\BladeLanguage; use App\MarkDown\CustomHL\Languages\Vue\VueLanguage; @@ -32,7 +32,7 @@ public function __construct( ) { $this->highlighter->addLanguage(new PhpLanguage()); $this->highlighter->addLanguage(new ShellLanguage()); - $this->highlighter->addLanguage(new BashLanguage()); +// $this->highlighter->addLanguage(new BashLanguage()); $this->highlighter->addLanguage(new IniLanguage()); $this->highlighter->addLanguage(new BladeLanguage()); $this->highlighter->addLanguage(new VueLanguage()); diff --git a/app/MarkDown/CustomHL/Languages/Bash/BashLanguage.php b/app/MarkDown/CustomHL/Languages/Bash/BashLanguage.php deleted file mode 100644 index a8d69cf6..00000000 --- a/app/MarkDown/CustomHL/Languages/Bash/BashLanguage.php +++ /dev/null @@ -1,33 +0,0 @@ -\/\*(.|\n)*?\*\/)/m'; //(\r\n)*? + return '/(?\/\*(?!\*)(.|\n)*?\*\/)/m'; //(\r\n)*? } public function parseContent(string $content, Highlighter $highlighter): string diff --git a/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php b/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php index cf8b401a..62f45ba7 100644 --- a/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Shell/ShellLanguage.php @@ -23,7 +23,8 @@ public function getName(): string public function getAliases(): array { return [ - 'sh' + 'sh', + 'bash' ]; } From 9ae34e52973bc2a653f284c32ec8092cd0d787be Mon Sep 17 00:00:00 2001 From: demn98 Date: Fri, 6 Dec 2024 19:50:05 +0300 Subject: [PATCH 7/9] highlighter tmp commit 20241206 --- .../Blade/Injections/BladeEchoInjection.php | 3 ++- .../Injections/DeletionTLInjection.php | 2 +- .../Patterns/JsSinglelineCommentPattern.php | 3 ++- .../CustomHL/Languages/Php/PhpLanguage.php | 2 +- .../Xml/Patterns/XmlAttributePattern.php | 3 ++- .../Xml/Patterns/XmlAttributeValuePattern.php | 4 +++- .../Tokens/CanNotContainTokenType.php | 24 +++++++++++++++++++ 7 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 app/MarkDown/CustomHL/Tokens/CanNotContainTokenType.php diff --git a/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php index 98555e6d..0696d2f3 100644 --- a/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php +++ b/app/MarkDown/CustomHL/Languages/Blade/Injections/BladeEchoInjection.php @@ -7,6 +7,7 @@ use Tempest\Highlight\Highlighter; use Tempest\Highlight\Injection; use Tempest\Highlight\IsInjection; +use Tempest\Highlight\Escape; final readonly class BladeEchoInjection implements Injection { @@ -19,6 +20,6 @@ public function getPattern(): string public function parseContent(string $content, Highlighter $highlighter): string { - return $highlighter->parse($content, 'php'); + return $highlighter->parse(Escape::terminal($content), 'php'); } } diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php index 0eaad60c..78669ed0 100644 --- a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php +++ b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php @@ -25,7 +25,7 @@ public function parse(string $content, Highlighter $highlighter): ParsedInjectio $parsedMatchedContent = $open . str_replace( // Escape::INJECTION_TOKEN . '// [tl! remove]', - Escape::INJECTION_TOKEN . $close, // Escape::INJECTION_TOKEN . + $close, // Escape::INJECTION_TOKEN . $matchedContent, ); diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSinglelineCommentPattern.php b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSinglelineCommentPattern.php index c6bdc1f5..16be1963 100644 --- a/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSinglelineCommentPattern.php +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Patterns/JsSinglelineCommentPattern.php @@ -8,6 +8,7 @@ use Tempest\Highlight\Pattern; use Tempest\Highlight\Tokens\TokenType; use Tempest\Highlight\Tokens\DynamicTokenType; +use App\MarkDown\CustomHL\Tokens\CanNotContainTokenType; final readonly class JsSinglelineCommentPattern implements Pattern { @@ -20,6 +21,6 @@ public function getPattern(): string public function getTokenType(): TokenType { - return new DynamicTokenType('hl-js-comment'); + return new CanNotContainTokenType('hl-js-comment'); } } diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php index e556ba0c..24b8eb2b 100644 --- a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php @@ -135,7 +135,7 @@ public function getPatterns(): array // KEYWORDS new KeywordPattern('null', 'hl-php-constant'), new GenericPattern('/(?\$this)(\-|\$|\,|\)|\;|\:|\s|\(|\])/', 'hl-php-this'), - new GenericPattern('/\->(?[\w]+?)\b[^\(]/', 'hl-php-delimeter'), + new GenericPattern('/\->\b(?[\w]+?)\b(?!\()/', 'hl-php-delimeter'), new GenericPattern('/\((?(string))\)/', 'hl-php-keyword'), ////new KeywordPattern('parent'), new KeywordPattern('true', 'hl-php-constant'), diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php index 23b76121..1285e914 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php @@ -17,7 +17,8 @@ public function getPattern(): string { // return '(?[\w\-:]*[\w\-]+)(=")?'; // return '/<[\w\- #]+\b(?[\w\-:]*[\w\-]+)\s*(=")? >/'; - return '/(?[\w\-\:]+)="/'; +// return '/(?[\w\-\:]+)="/'; + return '/ #?(?(?!--)[\w\-\:]+)(="|>)/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php index 7a577624..7af49c60 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php @@ -8,6 +8,7 @@ use Tempest\Highlight\Pattern; use Tempest\Highlight\Tokens\TokenType; use Tempest\Highlight\Tokens\DynamicTokenType; +use App\MarkDown\CustomHL\Tokens\QuotedValueTokenType; final readonly class XmlAttributeValuePattern implements Pattern { @@ -20,6 +21,7 @@ public function getPattern(): string public function getTokenType(): TokenType { - return new DynamicTokenType('hl-xml-attr-val'); + //return new DynamicTokenType('hl-xml-attr-val'); + return new QuotedValueTokenType('hl-xml-attr-val'); } } diff --git a/app/MarkDown/CustomHL/Tokens/CanNotContainTokenType.php b/app/MarkDown/CustomHL/Tokens/CanNotContainTokenType.php new file mode 100644 index 00000000..70190554 --- /dev/null +++ b/app/MarkDown/CustomHL/Tokens/CanNotContainTokenType.php @@ -0,0 +1,24 @@ +value; + } + + public function canContain(TokenType $other): bool + { + return false; + } +} From e28683dc3ab4f45e5e8f3ee829892bb876358217 Mon Sep 17 00:00:00 2001 From: demn98 Date: Fri, 13 Dec 2024 20:37:28 +0300 Subject: [PATCH 8/9] highlighter tmp commit 20241213 --- .../CommonPatterns/DigitsPattern.php | 30 ++++ .../DoubleQuoteValuePattern.php | 31 ++++ .../CommonPatterns/KeywordPattern.php | 46 +++++ .../CommonPatterns/OperatorPattern.php | 31 ++++ .../SingleApostropheValuePattern.php | 30 ++++ .../SingleQuoteValuePattern.php | 30 ++++ .../CustomHL/Languages/Ini/IniLanguage.php | 2 +- .../Ini/Patterns/ConstantPattern.php | 3 +- .../Ini/Patterns/DoubleQuoteValuePattern.php | 7 +- .../CustomHL/Languages/Json/JsonLanguage.php | 4 + .../PhpDocCommentReturnTypeInjection.php | 2 +- .../Injections/SingleQuoteValueInjection.php | 2 +- .../Injections/SinglelineCommentInjection.php | 5 +- .../CustomHL/Languages/Php/PhpLanguage.php | 12 +- .../CustomHL/Languages/Sql/SqlLanguage.php | 161 ++++++++++++++++++ .../Yaml/Patterns/YamlCommentPattern.php | 27 +++ .../Yaml/Patterns/YamlPropertyPattern.php | 25 +++ .../CustomHL/Languages/Yaml/YamlLanguage.php | 64 +++++++ app/MarkDown/CustomHL/style.css | 67 +++++++- 19 files changed, 560 insertions(+), 19 deletions(-) create mode 100644 app/MarkDown/CustomHL/Languages/CommonPatterns/DigitsPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/CommonPatterns/DoubleQuoteValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/CommonPatterns/KeywordPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/CommonPatterns/OperatorPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/CommonPatterns/SingleApostropheValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/CommonPatterns/SingleQuoteValuePattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Sql/SqlLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/Yaml/Patterns/YamlCommentPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Yaml/Patterns/YamlPropertyPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Yaml/YamlLanguage.php diff --git a/app/MarkDown/CustomHL/Languages/CommonPatterns/DigitsPattern.php b/app/MarkDown/CustomHL/Languages/CommonPatterns/DigitsPattern.php new file mode 100644 index 00000000..dc00be95 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CommonPatterns/DigitsPattern.php @@ -0,0 +1,30 @@ +[0-9]+)[\w]*/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CommonPatterns/DoubleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/CommonPatterns/DoubleQuoteValuePattern.php new file mode 100644 index 00000000..9a95dc8c --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CommonPatterns/DoubleQuoteValuePattern.php @@ -0,0 +1,31 @@ +\".*?\")'; + } + + public function getTokenType(): TokenType + { + return new CanNotContainTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CommonPatterns/KeywordPattern.php b/app/MarkDown/CustomHL/Languages/CommonPatterns/KeywordPattern.php new file mode 100644 index 00000000..7cd9638d --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CommonPatterns/KeywordPattern.php @@ -0,0 +1,46 @@ +caseInsensitive = true; + + return $this; + } + + public function getPattern(): string + { + $pattern = "/\b(?)*(?{$this->keyword})(\$|\,|\)|\;|\:|\s|\(|\-\>|\])/"; + + if ($this->caseInsensitive) { + $pattern .= 'i'; + } + + return $pattern; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CommonPatterns/OperatorPattern.php b/app/MarkDown/CustomHL/Languages/CommonPatterns/OperatorPattern.php new file mode 100644 index 00000000..de6c40e0 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CommonPatterns/OperatorPattern.php @@ -0,0 +1,31 @@ +{$this->operator})(\s|\()/"; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleApostropheValuePattern.php b/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleApostropheValuePattern.php new file mode 100644 index 00000000..ad3b6aff --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleApostropheValuePattern.php @@ -0,0 +1,30 @@ +`.*?`)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleQuoteValuePattern.php new file mode 100644 index 00000000..a5ab7160 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleQuoteValuePattern.php @@ -0,0 +1,30 @@ +\'.*\'?)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType($this->tokenType); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php b/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php index 31b5b33a..7aa3dd51 100644 --- a/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php @@ -33,8 +33,8 @@ public function getPatterns(): array { return [ ...parent::getPatterns(), - new ConstantPattern(), new DoubleQuoteValuePattern(), + new ConstantPattern(), ]; } } \ No newline at end of file diff --git a/app/MarkDown/CustomHL/Languages/Ini/Patterns/ConstantPattern.php b/app/MarkDown/CustomHL/Languages/Ini/Patterns/ConstantPattern.php index 3f43ae2d..38d80368 100644 --- a/app/MarkDown/CustomHL/Languages/Ini/Patterns/ConstantPattern.php +++ b/app/MarkDown/CustomHL/Languages/Ini/Patterns/ConstantPattern.php @@ -15,7 +15,8 @@ public function getPattern(): string { - return '/\s?(?[\S]+)=/'; + //return '/\s?(?[\S]+)=/'; + return '/(?[\w]+)=/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php index e9db3235..37fdbfc5 100644 --- a/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php +++ b/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php @@ -7,7 +7,8 @@ use Tempest\Highlight\IsPattern; use Tempest\Highlight\Pattern; use Tempest\Highlight\Tokens\TokenType; -use Tempest\Highlight\Tokens\DynamicTokenType; +//use Tempest\Highlight\Tokens\DynamicTokenType; +use App\MarkDown\CustomHL\Tokens\CanNotContainTokenType; final readonly class DoubleQuoteValuePattern implements Pattern { @@ -15,11 +16,11 @@ public function getPattern(): string { - return '"(?.*?)"'; + return '(?".*?")'; } public function getTokenType(): TokenType { - return new DynamicTokenType('hl-ini-value'); + return new CanNotContainTokenType('hl-ini-value'); } } diff --git a/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php b/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php index 005c9d93..af0bfa60 100644 --- a/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php @@ -11,6 +11,7 @@ use App\MarkDown\CustomHL\Languages\Json\Patterns\JsonPropertyPattern; use App\MarkDown\CustomHL\Languages\Json\Injections\JsonArrayInjection; use App\MarkDown\CustomHL\Languages\Json\Patterns\DigitsValuePattern; +use App\MarkDown\CustomHL\Languages\CommonPatterns\KeywordPattern; class JsonLanguage extends CustomBaseLanguage { @@ -31,6 +32,9 @@ public function getPatterns(): array { return [ ...parent::getPatterns(), + + new KeywordPattern('null', 'hl-slug'), + new JsonPropertyPattern(), //new JsonAccoladesPattern(), //new JsonArrayBracketsPattern(), diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php index 508c969d..4bf85370 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/PhpDocCommentReturnTypeInjection.php @@ -20,7 +20,7 @@ public function getPattern(): string { - return '\@(return|throws|var)(\s)+(?.*?)(\*\/|$|\R)'; + return '\@(return|throws|var|extends)(\s)+(?.*?)(\*\/|$|\R)'; } public function parseContent(string $content, Highlighter $highlighter): string diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php index 8e9ae59c..2ac7ffa8 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/SingleQuoteValueInjection.php @@ -19,7 +19,7 @@ public function getPattern(): string { - return "(?'(?!(s ))(\\\'|.|\n)*?')"; + return "(?'(?!(s ))([^\\\\]\\\'|.|\n)*?')"; } public function parseContent(string $content, Highlighter $highlighter): string diff --git a/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php b/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php index f6c23bb1..27e3054b 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php +++ b/app/MarkDown/CustomHL/Languages/Php/Injections/SinglelineCommentInjection.php @@ -10,6 +10,7 @@ use Tempest\Highlight\IsInjection; use Tempest\Highlight\Escape; use Tempest\Highlight\Tokens\DynamicTokenType; +use App\MarkDown\CustomHL\Tokens\CanNotContainTokenType; #[After] final readonly class SinglelineCommentInjection implements Injection @@ -43,9 +44,9 @@ public function parseContent(string $content, Highlighter $highlighter): string //if (strpos($content, 'throttle') > 0) { dd($content, $clear_content, $t); } return Escape::injection( - Escape::tokens($theme->before(new DynamicTokenType('hl-php-comment'))) + Escape::tokens($theme->before(new CanNotContainTokenType('hl-php-comment'))) //DynamicTokenType('hl-php-comment'))) . $clear_content //$content //$clear_content - . Escape::tokens($theme->after(new DynamicTokenType('hl-php-comment'))) + . Escape::tokens($theme->after(new CanNotContainTokenType('hl-php-comment'))) //DynamicTokenType('hl-php-comment'))) ); } } diff --git a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php index 24b8eb2b..e4f776d3 100644 --- a/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Php/PhpLanguage.php @@ -137,6 +137,7 @@ public function getPatterns(): array new GenericPattern('/(?\$this)(\-|\$|\,|\)|\;|\:|\s|\(|\])/', 'hl-php-this'), new GenericPattern('/\->\b(?[\w]+?)\b(?!\()/', 'hl-php-delimeter'), new GenericPattern('/\((?(string))\)/', 'hl-php-keyword'), + new GenericPattern('/protected static (\?)?(?(string)) \$/', 'hl-php-keyword'), ////new KeywordPattern('parent'), new KeywordPattern('true', 'hl-php-constant'), new KeywordPattern('false', 'hl-php-constant'), @@ -145,6 +146,8 @@ public function getPatterns(): array new KeywordPattern('abstract'), ////new KeywordPattern('and'), new KeywordPattern('as'), + new KeywordPattern('array'), + new KeywordPattern('string'), ////new KeywordPattern('break'), new KeywordPattern('callable'), new KeywordPattern('case'), @@ -160,8 +163,8 @@ public function getPatterns(): array new KeywordPattern('echo', 'hl-php-constant'), new KeywordPattern('name', 'hl-php-constant'), new KeywordPattern('count\+\+', 'hl-php-constant'), - ////new KeywordPattern('else'), - ////new KeywordPattern('elseif'), + new KeywordPattern('else'), + new KeywordPattern('elseif'), ////new KeywordPattern('empty'), new KeywordPattern('enum'), ////new KeywordPattern('enddeclare'), @@ -188,7 +191,7 @@ public function getPatterns(): array ////new KeywordPattern('include_once'), new KeywordPattern('instanceof', 'hl-php-constant'), ////new KeywordPattern('insteadof'), - ////new KeywordPattern('interface'), + new KeywordPattern('interface'), ////new KeywordPattern('isset'), ////new KeywordPattern('list'), new KeywordPattern('label', 'hl-php-constant'), @@ -227,6 +230,8 @@ public function getPatterns(): array //new MultilineSingleDocCommentPattern(), //new SinglelineCommentPattern(), + new ConstantNamePattern(), + // TYPES ////new AttributeTypePattern(), new ImplementsPattern(), @@ -252,7 +257,6 @@ public function getPatterns(): array ////new NestedFunctionCallPattern(), new FunctionCallPattern(), ////new ConstantPropertyPattern(), - new ConstantNamePattern(), ////new UntypedClassPropertyPattern(), new EnumCasePattern(), ////new StaticPropertyPattern(), diff --git a/app/MarkDown/CustomHL/Languages/Sql/SqlLanguage.php b/app/MarkDown/CustomHL/Languages/Sql/SqlLanguage.php new file mode 100644 index 00000000..1708d327 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Sql/SqlLanguage.php @@ -0,0 +1,161 @@ +|=|>=)'), + new OperatorPattern('(\*)', 'hl-delimeter'), + + // KEYWORDS + //(new KeywordPattern('ADD'))->caseInsensitive(), + //(new KeywordPattern('ADD CONSTRAINT'))->caseInsensitive(), + //(new KeywordPattern('ALL'))->caseInsensitive(), + //(new KeywordPattern('ALTER'))->caseInsensitive(), + //(new KeywordPattern('ALTER COLUMN'))->caseInsensitive(), + //(new KeywordPattern('ALTER TABLE'))->caseInsensitive(), + (new KeywordPattern('AND'))->caseInsensitive(), + //(new KeywordPattern('ANY'))->caseInsensitive(), + //(new KeywordPattern('AS'))->caseInsensitive(), + (new KeywordPattern('ASC'))->caseInsensitive(), + //(new KeywordPattern('BACKUP DATABASE'))->caseInsensitive(), + //(new KeywordPattern('BETWEEN'))->caseInsensitive(), + //(new KeywordPattern('CASE'))->caseInsensitive(), + //(new KeywordPattern('CAST'))->caseInsensitive(), + //(new KeywordPattern('CHECK'))->caseInsensitive(), + //(new KeywordPattern('COLUMN'))->caseInsensitive(), + //(new KeywordPattern('CONSTRAINT'))->caseInsensitive(), + //(new KeywordPattern('CREATE'))->caseInsensitive(), + //(new KeywordPattern('CREATE DATABASE'))->caseInsensitive(), + //(new KeywordPattern('CREATE INDEX'))->caseInsensitive(), + //(new KeywordPattern('CREATE OR REPLACE VIEW'))->caseInsensitive(), + //(new KeywordPattern('CREATE TABLE'))->caseInsensitive(), + //(new KeywordPattern('CREATE PROCEDURE'))->caseInsensitive(), + //(new KeywordPattern('CREATE UNIQUE INDEX'))->caseInsensitive(), + //(new KeywordPattern('CREATE VIEW'))->caseInsensitive(), + //(new KeywordPattern('DATABASE'))->caseInsensitive(), + //(new KeywordPattern('DEFAULT'))->caseInsensitive(), + //(new KeywordPattern('DELETE'))->caseInsensitive(), + //(new KeywordPattern('DESC'))->caseInsensitive(), + //(new KeywordPattern('DISTINCT'))->caseInsensitive(), + //(new KeywordPattern('DROP'))->caseInsensitive(), + //(new KeywordPattern('DROP COLUMN'))->caseInsensitive(), + //(new KeywordPattern('DROP CONSTRAINT'))->caseInsensitive(), + //(new KeywordPattern('DROP DATABASE'))->caseInsensitive(), + //(new KeywordPattern('DROP DEFAULT'))->caseInsensitive(), + //(new KeywordPattern('DROP INDEX'))->caseInsensitive(), + //(new KeywordPattern('DROP TABLE'))->caseInsensitive(), + //(new KeywordPattern('DROP VIEW'))->caseInsensitive(), + //(new KeywordPattern('ELSE'))->caseInsensitive(), + //(new KeywordPattern('END'))->caseInsensitive(), + //(new KeywordPattern('EXCEPT'))->caseInsensitive(), + //(new KeywordPattern('EXEC'))->caseInsensitive(), + (new KeywordPattern('EXISTS'))->caseInsensitive(), + //(new KeywordPattern('FOREIGN KEY'))->caseInsensitive(), + (new KeywordPattern('FROM'))->caseInsensitive(), + //(new KeywordPattern('FULL JOIN'))->caseInsensitive(), + //(new KeywordPattern('FULL OUTER JOIN'))->caseInsensitive(), + //(new KeywordPattern('GROUP BY'))->caseInsensitive(), + //(new KeywordPattern('HAVING'))->caseInsensitive(), + (new KeywordPattern('IN'))->caseInsensitive(), + //(new KeywordPattern('INDEX'))->caseInsensitive(), + //(new KeywordPattern('INNER JOIN'))->caseInsensitive(), + //(new KeywordPattern('INSERT INTO'))->caseInsensitive(), + //(new KeywordPattern('INSERT INTO SELECT'))->caseInsensitive(), + //(new KeywordPattern('INTERSECT'))->caseInsensitive(), + //(new KeywordPattern('IS NULL'))->caseInsensitive(), + //(new KeywordPattern('IS NOT NULL'))->caseInsensitive(), + //(new KeywordPattern('JOIN'))->caseInsensitive(), + //(new KeywordPattern('LEFT JOIN'))->caseInsensitive(), + (new KeywordPattern('LIKE'))->caseInsensitive(), + (new KeywordPattern('LIMIT'))->caseInsensitive(), + //(new KeywordPattern('NOT'))->caseInsensitive(), + //(new KeywordPattern('NOT NULL'))->caseInsensitive(), + (new KeywordPattern('OFFSET'))->caseInsensitive(), + (new KeywordPattern('OR'))->caseInsensitive(), + (new KeywordPattern('ORDER BY'))->caseInsensitive(), + //(new KeywordPattern('OUTER JOIN'))->caseInsensitive(), + //(new KeywordPattern('PRIMARY KEY'))->caseInsensitive(), + //(new KeywordPattern('PROCEDURE'))->caseInsensitive(), + //(new KeywordPattern('RIGHT JOIN'))->caseInsensitive(), + //(new KeywordPattern('ROWNUM'))->caseInsensitive(), + (new KeywordPattern('SELECT'))->caseInsensitive(), + //(new KeywordPattern('SELECT DISTINCT'))->caseInsensitive(), + //(new KeywordPattern('SELECT INTO'))->caseInsensitive(), + //(new KeywordPattern('SELECT TOP'))->caseInsensitive(), + //(new KeywordPattern('SET'))->caseInsensitive(), + //(new KeywordPattern('SOME'))->caseInsensitive(), + //(new KeywordPattern('TABLE'))->caseInsensitive(), + //(new KeywordPattern('THEN'))->caseInsensitive(), + //(new KeywordPattern('TOP'))->caseInsensitive(), + //(new KeywordPattern('TRUNCATE TABLE'))->caseInsensitive(), + //(new KeywordPattern('UNION'))->caseInsensitive(), + //(new KeywordPattern('UNION ALL'))->caseInsensitive(), + //(new KeywordPattern('UNIQUE'))->caseInsensitive(), + //(new KeywordPattern('UPDATE'))->caseInsensitive(), + //(new KeywordPattern('VALUES'))->caseInsensitive(), + //(new KeywordPattern('VIEW'))->caseInsensitive(), + //(new KeywordPattern('WHEN'))->caseInsensitive(), + (new KeywordPattern('WHERE'))->caseInsensitive(), + //(new KeywordPattern('ON'))->caseInsensitive(), + + // COMMENTS + //new SqlMultilineCommentPattern(), + //new SqlSinglelineCommentPattern(), + + // TYPES + //new SqlTableAccessPattern(), + //new SqlFromTablePattern(), + //new SqlJoinTablePattern(), + //new SqlAsTablePattern(), + + // VALUES + new SingleQuoteValuePattern(), + new SingleApostropheValuePattern(), + //new SqlDoubleQuoteValuePattern(), + + // PROPERTIES + //new SqlFunctionPattern(), + //new SqlTablePropertyPattern(), + //new SqlPropertyPattern(), + ]; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Yaml/Patterns/YamlCommentPattern.php b/app/MarkDown/CustomHL/Languages/Yaml/Patterns/YamlCommentPattern.php new file mode 100644 index 00000000..3d611fcf --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Yaml/Patterns/YamlCommentPattern.php @@ -0,0 +1,27 @@ +\#(.)*)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-yaml-comment'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Yaml/Patterns/YamlPropertyPattern.php b/app/MarkDown/CustomHL/Languages/Yaml/Patterns/YamlPropertyPattern.php new file mode 100644 index 00000000..5856cc25 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Yaml/Patterns/YamlPropertyPattern.php @@ -0,0 +1,25 @@ +[\w-]+)\:'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-yaml-property'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Yaml/YamlLanguage.php b/app/MarkDown/CustomHL/Languages/Yaml/YamlLanguage.php new file mode 100644 index 00000000..dca71c3e --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Yaml/YamlLanguage.php @@ -0,0 +1,64 @@ + Date: Tue, 17 Dec 2024 17:22:13 +0300 Subject: [PATCH 9/9] highlighter tmp commit 20241217 --- .../CommonMark/CustomHighlightExtension.php | 12 ++++++ .../SingleQuoteValuePattern.php | 21 ++++++++++- .../CustomBase/CustomBaseLanguage.php | 2 + .../Injections/AdditionTL3Injection.php | 37 +++++++++++++++++++ .../Injections/AdditionTLInjection.php | 2 +- .../Injections/DeletionTLInjection.php | 2 +- .../ExtendedCss/ExtendedCssLanguage.php | 28 ++++++++++++++ .../ExtendedCss/Patterns/CssConfigPattern.php | 25 +++++++++++++ .../Patterns/CssTailwindPattern.php | 25 +++++++++++++ .../CustomHL/Languages/Ini/IniLanguage.php | 3 ++ .../Languages/Ini/Patterns/CommentPattern.php | 25 +++++++++++++ .../Ini/Patterns/ConstantPattern.php | 3 +- .../Ini/Patterns/DoubleQuoteValuePattern.php | 2 +- .../JavaScript/Injections/JsHTMLInjection.php | 26 +++++++++++++ .../JavaScript/JavaScriptLanguage.php | 11 ++++-- .../Json/Injections/JsonArrayInjection.php | 2 +- .../CustomHL/Languages/Json/JsonLanguage.php | 2 + .../Languages/Nginx/NginxLanguage.php | 3 ++ .../Nginx/Patterns/NginxKeywordPattern.php | 25 +++++++++++++ .../Php/Patterns/SinglelineCommentPattern.php | 25 +++++++++++++ .../Languages/Php/Patterns/UsePattern.php | 2 +- .../Xml/Patterns/XmlAttributePattern.php | 3 +- .../Xml/Patterns/XmlAttributeValuePattern.php | 2 +- .../Xml/Patterns/XmlEndCloseTagPattern.php | 2 +- .../Xml/Patterns/XmlOpenTagPattern.php | 2 +- .../Xml/Patterns/XmlStartOpenTagPattern.php | 2 +- .../CustomHL/Languages/Yaml/YamlLanguage.php | 5 +++ 27 files changed, 282 insertions(+), 17 deletions(-) create mode 100644 app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTL3Injection.php create mode 100644 app/MarkDown/CustomHL/Languages/ExtendedCss/ExtendedCssLanguage.php create mode 100644 app/MarkDown/CustomHL/Languages/ExtendedCss/Patterns/CssConfigPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/ExtendedCss/Patterns/CssTailwindPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Ini/Patterns/CommentPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsHTMLInjection.php create mode 100644 app/MarkDown/CustomHL/Languages/Nginx/Patterns/NginxKeywordPattern.php create mode 100644 app/MarkDown/CustomHL/Languages/Php/Patterns/SinglelineCommentPattern.php diff --git a/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php b/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php index 86600062..dfe5dcba 100644 --- a/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php +++ b/app/MarkDown/CustomHL/CommonMark/CustomHighlightExtension.php @@ -24,6 +24,12 @@ //use App\MarkDown\CustomHL\Languages\Html\HtmlLanguage; use App\MarkDown\CustomHL\Languages\Xml\XmlLanguage; use App\MarkDown\CustomHL\Languages\Json\JsonLanguage; +use App\MarkDown\CustomHL\Languages\Sql\SqlLanguage; +use App\MarkDown\CustomHL\Languages\Yaml\YamlLanguage; +use App\MarkDown\CustomHL\Languages\ExtendedCss\ExtendedCssLanguage; + +//use App\MarkDown\CustomHL\Languages\ExtendedPhp\ExtendedPhpLanguage; +//use App\MarkDown\CustomHL\Languages\ExtendedXml\ExtendedXmlLanguage; final class CustomHighlightExtension implements ExtensionInterface { @@ -41,6 +47,12 @@ public function __construct( // $this->highlighter->addLanguage(new HtmlLanguage()); $this->highlighter->addLanguage(new XmlLanguage()); $this->highlighter->addLanguage(new JsonLanguage()); + $this->highlighter->addLanguage(new SqlLanguage()); + $this->highlighter->addLanguage(new YamlLanguage()); + $this->highlighter->addLanguage(new ExtendedCssLanguage()); + +// $this->highlighter->addLanguage(new ExtendedPhpLanguage()); +// $this->highlighter->addLanguage(new ExtendedXmlLanguage()); } public function register(EnvironmentBuilderInterface $environment): void diff --git a/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleQuoteValuePattern.php index a5ab7160..5a10f699 100644 --- a/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleQuoteValuePattern.php +++ b/app/MarkDown/CustomHL/Languages/CommonPatterns/SingleQuoteValuePattern.php @@ -8,16 +8,26 @@ use Tempest\Highlight\Pattern; use Tempest\Highlight\Tokens\TokenType; use Tempest\Highlight\Tokens\DynamicTokenType; +use App\MarkDown\CustomHL\Tokens\CanNotContainTokenType; -final readonly class SingleQuoteValuePattern implements Pattern +final class SingleQuoteValuePattern implements Pattern { use IsPattern; + private bool $canNotContain = false; + public function __construct( private string $tokenType = 'hl-value', ) { } + public function canNotContain(): self + { + $this->canNotContain = true; + + return $this; + } + public function getPattern(): string { return '(?\'.*\'?)'; @@ -25,6 +35,13 @@ public function getPattern(): string public function getTokenType(): TokenType { - return new DynamicTokenType($this->tokenType); + if ($this->canNotContain) + { + return new CanNotContainTokenType($this->tokenType); + } + else + { + return new DynamicTokenType($this->tokenType); + } } } diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/CustomBaseLanguage.php b/app/MarkDown/CustomHL/Languages/CustomBase/CustomBaseLanguage.php index 1539f3cc..e3962d7d 100644 --- a/app/MarkDown/CustomHL/Languages/CustomBase/CustomBaseLanguage.php +++ b/app/MarkDown/CustomHL/Languages/CustomBase/CustomBaseLanguage.php @@ -7,6 +7,7 @@ use Tempest\Highlight\Languages\Base\BaseLanguage; use App\MarkDown\CustomHL\Languages\CustomBase\Injections\AdditionTLInjection; use App\MarkDown\CustomHL\Languages\CustomBase\Injections\AdditionTL2Injection; +use App\MarkDown\CustomHL\Languages\CustomBase\Injections\AdditionTL3Injection; use App\MarkDown\CustomHL\Languages\CustomBase\Injections\DeletionTLInjection; use App\MarkDown\CustomHL\Languages\CustomBase\Injections\DeletionTL2Injection; use App\MarkDown\CustomHL\Languages\CustomBase\Injections\AdditionTLMultilineStartInjection; @@ -20,6 +21,7 @@ public function getInjections(): array ...parent::getInjections(), new AdditionTLInjection(), new AdditionTL2Injection(), + new AdditionTL3Injection(), new DeletionTLInjection(), new DeletionTL2Injection(), new AdditionTLMultilineStartInjection(), diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTL3Injection.php b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTL3Injection.php new file mode 100644 index 00000000..e87f2744 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTL3Injection.php @@ -0,0 +1,37 @@ +(.)*# \[tl\! add\])/', $content, $matches, PREG_OFFSET_CAPTURE); + + foreach ($matches['match'] as $match) { + $matchedContent = $match[0]; + + $open = '{+'; + $close = '+}'; //' +}'; + + $parsedMatchedContent = $open . str_replace( // Escape::INJECTION_TOKEN . + '# [tl! add]', + $close, // Escape::INJECTION_TOKEN . + $matchedContent, + ); + + $content = str_replace($matchedContent, $parsedMatchedContent, $content); + } + + return new ParsedInjection($content); + } +} diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLInjection.php b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLInjection.php index c19893c2..ffedb6d7 100644 --- a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLInjection.php +++ b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/AdditionTLInjection.php @@ -21,7 +21,7 @@ public function parse(string $content, Highlighter $highlighter): ParsedInjectio $matchedContent = $match[0]; $open = '{+'; - $close = '+}'; //' +}'; + $close = ' +}'; //' +}'; $parsedMatchedContent = $open . str_replace( // Escape::INJECTION_TOKEN . '// [tl! add]', diff --git a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php index 78669ed0..713f5548 100644 --- a/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php +++ b/app/MarkDown/CustomHL/Languages/CustomBase/Injections/DeletionTLInjection.php @@ -21,7 +21,7 @@ public function parse(string $content, Highlighter $highlighter): ParsedInjectio $matchedContent = $match[0]; $open = '{-'; - $close = '-}'; //' -}'; + $close = ' -}'; //' -}'; $parsedMatchedContent = $open . str_replace( // Escape::INJECTION_TOKEN . '// [tl! remove]', diff --git a/app/MarkDown/CustomHL/Languages/ExtendedCss/ExtendedCssLanguage.php b/app/MarkDown/CustomHL/Languages/ExtendedCss/ExtendedCssLanguage.php new file mode 100644 index 00000000..45226633 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/ExtendedCss/ExtendedCssLanguage.php @@ -0,0 +1,28 @@ +\@config)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-keyword'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/ExtendedCss/Patterns/CssTailwindPattern.php b/app/MarkDown/CustomHL/Languages/ExtendedCss/Patterns/CssTailwindPattern.php new file mode 100644 index 00000000..68aa0810 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/ExtendedCss/Patterns/CssTailwindPattern.php @@ -0,0 +1,25 @@ +\@tailwind)'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-keyword'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php b/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php index 7aa3dd51..f2afe465 100644 --- a/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Ini/IniLanguage.php @@ -7,6 +7,7 @@ use App\MarkDown\CustomHL\Languages\CustomBase\CustomBaseLanguage; use App\MarkDown\CustomHL\Languages\Ini\Patterns\ConstantPattern; use App\MarkDown\CustomHL\Languages\Ini\Patterns\DoubleQuoteValuePattern; +use App\MarkDown\CustomHL\Languages\Ini\Patterns\CommentPattern; class IniLanguage extends CustomBaseLanguage { @@ -35,6 +36,8 @@ public function getPatterns(): array ...parent::getPatterns(), new DoubleQuoteValuePattern(), new ConstantPattern(), + + new CommentPattern(), ]; } } \ No newline at end of file diff --git a/app/MarkDown/CustomHL/Languages/Ini/Patterns/CommentPattern.php b/app/MarkDown/CustomHL/Languages/Ini/Patterns/CommentPattern.php new file mode 100644 index 00000000..aa07d6d8 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Ini/Patterns/CommentPattern.php @@ -0,0 +1,25 @@ +#(.)*)/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-comment'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Ini/Patterns/ConstantPattern.php b/app/MarkDown/CustomHL/Languages/Ini/Patterns/ConstantPattern.php index 38d80368..4ddfcb66 100644 --- a/app/MarkDown/CustomHL/Languages/Ini/Patterns/ConstantPattern.php +++ b/app/MarkDown/CustomHL/Languages/Ini/Patterns/ConstantPattern.php @@ -16,7 +16,8 @@ public function getPattern(): string { //return '/\s?(?[\S]+)=/'; - return '/(?[\w]+)=/'; + //return '/(?[\w]+)=/'; + return '/(?[\w\.-]+)(\s)*=/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php b/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php index 37fdbfc5..cb2d2d47 100644 --- a/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php +++ b/app/MarkDown/CustomHL/Languages/Ini/Patterns/DoubleQuoteValuePattern.php @@ -16,7 +16,7 @@ public function getPattern(): string { - return '(?".*?")'; + return '(?"(.|\n)*?")'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsHTMLInjection.php b/app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsHTMLInjection.php new file mode 100644 index 00000000..28ce9ee8 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/JavaScript/Injections/JsHTMLInjection.php @@ -0,0 +1,26 @@ +(.|\n)*)/"; + } + + public function parseContent(string $content, Highlighter $highlighter): string + { + return $highlighter->parse($content, 'html'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php b/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php index 4a74f6e7..ccecb828 100644 --- a/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php +++ b/app/MarkDown/CustomHL/Languages/JavaScript/JavaScriptLanguage.php @@ -23,6 +23,7 @@ use App\MarkDown\CustomHL\Languages\JavaScript\Injections\JsSingleQuoteValueInjection; use App\MarkDown\CustomHL\Languages\JavaScript\Injections\JsSingleQuoteValue2Injection; use App\MarkDown\CustomHL\Languages\JavaScript\Patterns\FunctionEPattern; +use App\MarkDown\CustomHL\Languages\JavaScript\Injections\JsHTMLInjection; class JavaScriptLanguage extends CustomBaseLanguage { @@ -36,6 +37,7 @@ public function getAliases(): array return [ 'javascript', 'node', + 'jsx', ]; } @@ -46,6 +48,7 @@ public function getInjections(): array //new JsDocInjection(), new JsSingleQuoteValueInjection(), new JsSingleQuoteValue2Injection(), + new JsHTMLInjection(), ]; } @@ -67,7 +70,7 @@ public function getPatterns(): array //new JsKeywordPattern('of'), //new JsKeywordPattern('get'), //new JsKeywordPattern('eval'), - //new JsKeywordPattern('async'), + new JsKeywordPattern('async'), //new JsKeywordPattern('as'), //new JsKeywordPattern('break'), //new JsKeywordPattern('case'), @@ -77,13 +80,13 @@ public function getPatterns(): array //new JsKeywordPattern('debugger'), //new JsKeywordPattern('delete'), //new JsKeywordPattern('do'), - //new JsKeywordPattern('else'), + new JsKeywordPattern('else'), //new JsKeywordPattern('extends'), //new JsKeywordPattern('false'), //new JsKeywordPattern('finally'), //new JsKeywordPattern('for'), //new JsKeywordPattern('function'), - //new JsKeywordPattern('if'), + new JsKeywordPattern('if'), //new JsKeywordPattern('in'), //new JsKeywordPattern('instanceof'), new JsKeywordPattern('new'), @@ -102,7 +105,7 @@ public function getPatterns(): array //new JsKeywordPattern('let'), //new JsKeywordPattern('static'), //new JsKeywordPattern('yield'), - //new JsKeywordPattern('await'), + new JsKeywordPattern('await'), //new JsKeywordPattern('enum'), //new JsKeywordPattern('implements'), //new JsKeywordPattern('interface'), diff --git a/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php b/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php index 50195fe2..0b27eda3 100644 --- a/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php +++ b/app/MarkDown/CustomHL/Languages/Json/Injections/JsonArrayInjection.php @@ -31,7 +31,7 @@ public function parseContent(string $content, Highlighter $highlighter): string foreach($match['match'] as $val) { $content = preg_replace( - '/\b' . addcslashes($val[0], '/*') . '[\b]*/', + '/' . addcslashes($val[0], '/*') . '[\b]*/', Escape::tokens($theme->before(new DynamicTokenType('hl-json-value'))) . $val[0] . Escape::tokens($theme->after(new DynamicTokenType('hl-json-value'))), diff --git a/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php b/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php index af0bfa60..969ac546 100644 --- a/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Json/JsonLanguage.php @@ -34,6 +34,8 @@ public function getPatterns(): array ...parent::getPatterns(), new KeywordPattern('null', 'hl-slug'), + new KeywordPattern('true', 'hl-slug'), + new KeywordPattern('false', 'hl-slug'), new JsonPropertyPattern(), //new JsonAccoladesPattern(), diff --git a/app/MarkDown/CustomHL/Languages/Nginx/NginxLanguage.php b/app/MarkDown/CustomHL/Languages/Nginx/NginxLanguage.php index ab1076c5..af4744eb 100644 --- a/app/MarkDown/CustomHL/Languages/Nginx/NginxLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Nginx/NginxLanguage.php @@ -10,6 +10,7 @@ use App\MarkDown\CustomHL\Languages\Nginx\Patterns\VariablesPattern; use App\MarkDown\CustomHL\Languages\Nginx\Patterns\OperatorPattern; use App\MarkDown\CustomHL\Languages\Nginx\Patterns\LocationPathPattern; +use App\MarkDown\CustomHL\Languages\Nginx\Patterns\NginxKeywordPattern; class NginxLanguage extends CustomBaseLanguage { @@ -47,6 +48,8 @@ public function getPatterns(): array new KeywordPattern('fastcgi_hide_header'), new KeywordPattern('deny'), + new NginxKeywordPattern(), + new OperatorPattern('(=|~)'), new LocationPathPattern(), diff --git a/app/MarkDown/CustomHL/Languages/Nginx/Patterns/NginxKeywordPattern.php b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/NginxKeywordPattern.php new file mode 100644 index 00000000..e0c09d83 --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Nginx/Patterns/NginxKeywordPattern.php @@ -0,0 +1,25 @@ +(\w)*)\s/'; + } + + public function getTokenType(): TokenType + { + return new DynamicTokenType('hl-nginx-keyword'); + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/SinglelineCommentPattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/SinglelineCommentPattern.php new file mode 100644 index 00000000..d97f7c6d --- /dev/null +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/SinglelineCommentPattern.php @@ -0,0 +1,25 @@ +\/\/(.)*)'; + } + + public function getTokenType(): TokenType + { + return new CanNotContainTokenType('hl-php-comment'); //TokenTypeEnum::COMMENT; + } +} diff --git a/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php b/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php index e3abcc70..70378bc2 100644 --- a/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php +++ b/app/MarkDown/CustomHL/Languages/Php/Patterns/UsePattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/use\s+(function(\s)+)?[\w\\\\]*\b(?[\w]+[, \w]*)[;]*/'; + return '/use\s+(function(\s)+)?[\w\\\\{]*\b(?[\w]+[, \w]*)[;|}]*/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php index 1285e914..bb0b6d0b 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributePattern.php @@ -18,7 +18,8 @@ public function getPattern(): string // return '(?[\w\-:]*[\w\-]+)(=")?'; // return '/<[\w\- #]+\b(?[\w\-:]*[\w\-]+)\s*(=")? >/'; // return '/(?[\w\-\:]+)="/'; - return '/ #?(?(?!--)[\w\-\:]+)(="|>)/'; +// return '/ (#)?(?(?!--)[\w\-\:@]+)(=("|{)|>)/'; + return '/ (#)?(?(?!--)[\w\-\:@\.]+)(=("|{)|>| \/>)/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php index 7af49c60..18aa63d3 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlAttributeValuePattern.php @@ -16,7 +16,7 @@ public function getPattern(): string { - return '/[\w\-:]*[\w\-]+=(?".+?")/'; + return '/[\w\-:]*[\w\-]+=(?"(.|\n)*?")/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlEndCloseTagPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlEndCloseTagPattern.php index 85cb3f11..8b0336d7 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlEndCloseTagPattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlEndCloseTagPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/<[\/\!]?[\w\-]+[ ]?(?[\/]?>)/'; + return '/("|\s|\w)(?(\/|\?)?>)/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php index de5a2258..b8fe57a3 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlOpenTagPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '<(?[\w\-\:\.]+)'; + return '/<(\?)?(?[\w\-\:\.]+)/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php index 46518330..82a673df 100644 --- a/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php +++ b/app/MarkDown/CustomHL/Languages/Xml/Patterns/XmlStartOpenTagPattern.php @@ -15,7 +15,7 @@ public function getPattern(): string { - return '/(?<(\/|\!)?(?!\-))[\w\-]+/'; // '/(?<[\/\!]?)[\w\-]+/'; + return '/(?<(\/|\!|\?)?(?!\-))[\w\-]+/'; // '/(?<[\/\!]?)[\w\-]+/'; } public function getTokenType(): TokenType diff --git a/app/MarkDown/CustomHL/Languages/Yaml/YamlLanguage.php b/app/MarkDown/CustomHL/Languages/Yaml/YamlLanguage.php index dca71c3e..b60f2879 100644 --- a/app/MarkDown/CustomHL/Languages/Yaml/YamlLanguage.php +++ b/app/MarkDown/CustomHL/Languages/Yaml/YamlLanguage.php @@ -19,6 +19,8 @@ use App\MarkDown\CustomHL\Languages\CommonPatterns\DigitsPattern; use App\MarkDown\CustomHL\Languages\CommonPatterns\DoubleQuoteValuePattern; +use App\MarkDown\CustomHL\Languages\CommonPatterns\SingleQuoteValuePattern; +use App\MarkDown\CustomHL\Languages\CommonPatterns\KeywordPattern; class YamlLanguage extends CustomBaseLanguage { @@ -57,8 +59,11 @@ public function getPatterns(): array new YamlCommentPattern(), //new YamlDoubleAccoladesValuePattern(), + new KeywordPattern('true', 'hl-slug'), + new DigitsPattern(), new DoubleQuoteValuePattern(), + (new SingleQuoteValuePattern())->canNotContain(), ]; } }