diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/404.html b/404.html new file mode 100644 index 000000000000..c87440a2eb5f --- /dev/null +++ b/404.html @@ -0,0 +1,5 @@ +FastGPT +

Page not found :(

The page you are looking for doesn't exist or has been moved.

+ \ No newline at end of file diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 000000000000..93c678aa85c2 Binary files /dev/null and b/android-chrome-192x192.png differ diff --git a/android-chrome-256x256.png b/android-chrome-256x256.png new file mode 100644 index 000000000000..7110384f84f5 Binary files /dev/null and b/android-chrome-256x256.png differ diff --git a/android-chrome-512x512.png b/android-chrome-512x512.png new file mode 100644 index 000000000000..80466008f938 Binary files /dev/null and b/android-chrome-512x512.png differ diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 000000000000..408418f80199 Binary files /dev/null and b/apple-touch-icon.png differ diff --git a/browserconfig.xml b/browserconfig.xml new file mode 100644 index 000000000000..b3930d0f0471 --- /dev/null +++ b/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/categories/index.xml b/categories/index.xml new file mode 100644 index 000000000000..21fda24f7cf5 --- /dev/null +++ b/categories/index.xml @@ -0,0 +1 @@ +Categories on FastGPThttps://doc.tryfastgpt.ai/categories/Recent content in Categories on FastGPTHugo -- gohugo.iozh-cn \ No newline at end of file diff --git a/docs/agreement/index.html b/docs/agreement/index.html new file mode 100644 index 000000000000..c8a6350d86fc --- /dev/null +++ b/docs/agreement/index.html @@ -0,0 +1,44 @@ +协议 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/agreement/index.xml b/docs/agreement/index.xml new file mode 100644 index 000000000000..dfc8d848dfd6 --- /dev/null +++ b/docs/agreement/index.xml @@ -0,0 +1,30 @@ +协议 on FastGPThttps://doc.tryfastgpt.ai/docs/agreement/Recent content in 协议 on FastGPTHugo -- gohugo.iozh-cn开源协议https://doc.tryfastgpt.ai/docs/agreement/open-source/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/agreement/open-source/FastGPT 项目在 Apache License 2.0 许可下开源,同时包含以下附加条件: +FastGPT 允许被用于商业化,例如作为其他应用的“后端即服务”使用,或者作为应用开发平台提供给企业。然而,当满足以下条件时,必须联系作者获得商业许可: +多租户 SaaS 服务:除非获得 FastGPT 的明确书面授权,否则不得使用 tryfastgpt.ai 的源码来运营与 tryfastgpt.ai 服务类似的多租户 SaaS 服务。 LOGO 及版权信息:在使用 FastGPT 的过程中,不得移除或修改 FastGPT 控制台内的 LOGO 或版权信息。 请通过电子邮件 yujinlong@sealos.io 联系我们咨询许可事宜。 +作为贡献者,你必须同意将你贡献的代码用于以下用途: +生产者有权将开源协议调整为更严格或更宽松的形式。 可用于商业目的,例如 FastGPT 的云服务。 除此之外,所有其他权利和限制均遵循 Apache License 2.0。如果你需要更多详细信息,可以参考 Apache License 2.0 的完整版本。本产品的交互设计受到外观专利保护。© 2023 Sealos.服务协议https://doc.tryfastgpt.ai/docs/agreement/terms/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/agreement/terms/最后更新时间:2024年3月3日 +FastGPT 服务协议是您与珠海环界云计算有限公司(以下简称“我们”或“本公司”)之间就FastGPT云服务(以下简称“本服务”)的使用等相关事项所订立的协议。请您仔细阅读并充分理解本协议各条款,特别是免除或者限制我们责任的条款、对您权益的限制条款、争议解决和法律适用条款等。如您不同意本协议任一内容,请勿注册或使用本服务。 +第1条 服务内容 +我们将向您提供存储、计算、网络传输等基于互联网的信息技术服务。 我们将不定期向您通过站内信、电子邮件或短信等形式向您推送最新的动态。 我们将为您提供相关技术支持和客户服务,帮助您更好地使用本服务。 我们将为您提供稳定的在线服务,保证每月服务可用性不低于99%。 第2条 用户注册与账户管理 +您在使用本服务前需要注册一个账户。您保证在注册时提供的信息真实、准确、完整,并及时更新。 您应妥善保管账户名和密码,对由此产生的全部行为负责。如发现他人使用您的账户,请及时修改账号密码或与我们进行联系。 我们有权对您的账户进行审查,如发现您的账户存在异常或违法情况,我们有权暂停或终止向您提供服务。 第3条 使用规则 +您不得利用本服务从事任何违法活动或侵犯他人合法权益的行为,包括但不限于侵犯知识产权、泄露他人商业机密等。 您不得通过任何手段恶意注册账户,包括但不限于以牟利、炒作、套现等目的。 您不得利用本服务传播任何违法、有害、恶意软件等信息。 您应遵守相关法律法规及本协议的规定,对在本服务中发布的信息及使用本服务所产生的结果承担全部责任。 我们禁止使用我们对接的模型服务生成可能对个人或社会造成伤害的内容。保障平台的安全性,是长期稳定运营的关键。如发现任何利用平台接入模型能力进行违规内容生成和使用,将立即封号,账号余额不退。违规内容包括但不限于: 剥削和虐待 禁止描述、展示或宣扬儿童性剥削或性虐待的内容,无论法律是否禁止。这包括涉及儿童或使儿童色情的内容。 禁止描述或用于培养儿童的内容。修饰是成年人以剥削,特别是性剥削为目的与儿童建立关系的行为。这包括以性剥削、贩运或其他形式剥削为目的与儿童交流。 未经同意的私密内容 服务禁止描述、提供或宣传未经同意的亲密活动的内容。 禁止描述、提供特征或宣传或用于招揽商业性活动和性服务的内容。这包括鼓励和协调真正的性活动。 禁止描述或用于人口贩运目的的内容。这包括招募人员、便利交通、支付和助长对人的剥削,如强迫劳动、家庭奴役、役、强迫婚姻和强迫医疗程序。 自杀和自残,禁止描述、赞美、支持、促进、美化、鼓励和/或指导个人自残或自杀的内容。 暴力内容和行为 禁止描述、展示或宣扬血腥暴力或血腥的内容。 禁止描绘恐怖主义行为的内容;赞扬或支持恐怖组织、恐怖行为者或暴力恐怖意识形态;鼓励恐怖活动;向恐怖组织或恐怖事业提供援助;或协助恐怖组织招募成员。 禁止通过暴力威胁或煽动来鼓吹或宣扬对他人的暴力行为的内容。 仇恨言论和歧视 禁止基于实际或感知的种族、民族、国籍、性别、性别认同、性取向、宗教信仰、年龄、残疾状况、种姓或与系统性偏见或边缘化相关的任何其他特征等特征攻击、诋毁、恐吓、降级、针对或排斥个人或群体的内容。 禁止针对个人或群体进行威胁、恐吓、侮辱、贬低或贬低的语言或图像、宣扬身体伤害或其他虐待行为(如跟踪)的内容。 禁止故意欺骗并可能对公共利益产生不利影响的内容,包括与健康、安全、选举诚信或公民参与相关的欺骗性或不真实内容。 直接支持非法主动攻击或造成技术危害的恶意软件活动的内容,例如提供恶意可执行文件、组织拒绝服务攻击或管理命令和控制服务器。 第4条 费用及支付 +您同意支付与本服务相关的费用,具体费用标准以我们公布的价格为准。 我们可能会根据运营成本和市场情况调整费用标准。最新价格以您付款时刻的价格为准。 第5条 服务免责与责任限制 +本服务按照现有技术和条件所能达到的水平提供。我们不能保证本服务完全无故障或满足您的所有需求。 对于因您自身误操作导致的数据丢失、损坏等情况,我们不承担责任。 由于生成式 AI 的特性,其在不同国家的管控措施也会有所不同,请所有使用者务必遵守所在地的相关法律。如果您以任何违反 FastGPT 可接受使用政策的方式使用,包括但不限于法律、法规、政府命令或法令禁止的任何用途,或任何侵犯他人权利的使用;由使用者自行承担。我们对由客户使用产生的问题概不负责。下面是各国对生成式AI的管控条例的链接: 中国生成式人工智能服务管理办法(征求意见稿) +第6条 知识产权 +我们对本服务及相关软件、技术、文档等拥有全部知识产权,除非经我们明确许可,您不得进行复制、分发、出租、反向工程等行为。 您在使用本服务过程中产生的所有数据和内容(包括但不限于文件、图片等)的知识产权归您所有。我们不会对您的数据和内容进行使用、复制、修改等行为。 在线服务中其他用户的数据和内容的知识产权归原用户所有,未经原用户许可,您不得进行使用、复制、修改等行为。 第7条 其他条款 +如本协议中部分条款因违反法律法规而被视为无效,不影响其他条款的效力。 本公司保留对本协议及隐私政策的最终解释权。如您对本协议或隐私政策有任何疑问,请联系我们:yujinlong@sealos.io。隐私政策https://doc.tryfastgpt.ai/docs/agreement/privacy/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/agreement/privacy/最后更新时间:2024年3月3日 +我们非常重视您的隐私保护,在您使用FastGPT云服务时(以下简称为“本服务”),我们将按照以下政策收集、使用、披露和保护您的个人信息。请您仔细阅读并充分理解本隐私政策。 +我们可能需要收集的信息 +在您注册或使用本服务时,我们可能收集您的姓名、电话号码、电子邮件地址、地址等个人信息。 在您使用本服务过程中产生的信息,如操作日志、访问IP地址、设备型号等。 我们可能会通过 Cookies 或其他技术收集和存储您访问本服务的相关信息,以便为您提供更好的用户体验。 我们如何使用收集的信息? +我们会根据法律法规规定以及与用户之间的约定来处理用户的个人信息。 我们可能会将收集到的信息用于改进服务质量、开发新产品或功能等目的。 我们可能会将收集到的信息用于向您推送与本服务相关的通知或广告。 信息披露 +我们不会向任何第三方披露您的个人信息,除非: +您事先同意; 法律法规要求; 为维护我们或其他用户的合法权益。 我们可能与关联公司、合作伙伴分享您的个人信息,但我们会采取相应的保密措施,确保信息安全。 +信息保护 +我们采取各种安全措施,包括加密、访问控制等技术手段,以保护您的个人信息免受未经授权的访问、使用或泄露。 我们会定期对收集、存储和处理的个人信息进行安全评估,以确保个人信息安全。 在发生个人信息泄露等安全事件时,我们会立即启动应急预案,并在法律法规规定的范围内向您及时告知。 我们不会使用您的数据进行额外的备份存储或用于模型训练。 您在本服务进行的数据删除均为物理删除,不可恢复。如有非物理删除的操作,我们会在服务中特别指出。 用户权利 +您有权随时查阅、更正或删除您的个人信息。 您有权拒绝我们收集您的个人信息,但这可能导致您无法使用本服务的部分功能。 您有权要求我们停止处理您的个人信息,但这可能导致您无法继续使用本服务。 隐私政策更新 +我们可能会对本隐私政策进行修改。如本隐私政策发生变更,我们将在本服务页面上发布修改后的隐私政策。如您继续使用本服务,则视为同意修改后的隐私政策。 我们鼓励您定期查阅本隐私政策,以了解我们如何保护您的个人信息。 未成年人保护 +我们非常重视对未成年人个人信息的保护,如您为未成年人,请在监护人指导下使用本服务,并请监护人帮助您在使用本服务过程中正确处理个人信息。 +跨境数据传输 +由于我们的服务器可能位于不同国家或地区,您同意我们可能需要将您的个人信息传输至其他国家或地区,并在该等国家或地区存储和处理以向您提供服务。我们会采取适当措施确保跨境传输的数据仍然受到适当保护。 +联系我们 +如您对本隐私政策有任何疑问、建议或投诉,请通过以下方式与我们联系:yujinlong@sealos.io。 我们将尽快回复并解决您提出的问题。 \ No newline at end of file diff --git a/docs/agreement/open-source/index.html b/docs/agreement/open-source/index.html new file mode 100644 index 000000000000..c33f52f28043 --- /dev/null +++ b/docs/agreement/open-source/index.html @@ -0,0 +1,44 @@ +开源协议 | FastGPT
+
开源协议
verified_user

开源协议

FastGPT 开源许可证

FastGPT 项目在 Apache License 2.0 许可下开源,同时包含以下附加条件:

  • FastGPT 允许被用于商业化,例如作为其他应用的“后端即服务”使用,或者作为应用开发平台提供给企业。然而,当满足以下条件时,必须联系作者获得商业许可:

    • 多租户 SaaS 服务:除非获得 FastGPT 的明确书面授权,否则不得使用 tryfastgpt.ai 的源码来运营与 tryfastgpt.ai 服务类似的多租户 SaaS 服务。
    • LOGO 及版权信息:在使用 FastGPT 的过程中,不得移除或修改 FastGPT 控制台内的 LOGO 或版权信息。

    请通过电子邮件 yujinlong@sealos.io 联系我们咨询许可事宜。

  • 作为贡献者,你必须同意将你贡献的代码用于以下用途:

    • 生产者有权将开源协议调整为更严格或更宽松的形式。
    • 可用于商业目的,例如 FastGPT 的云服务。

除此之外,所有其他权利和限制均遵循 Apache License 2.0。如果你需要更多详细信息,可以参考 Apache License 2.0 的完整版本。本产品的交互设计受到外观专利保护。© 2023 Sealos.

+ + + + \ No newline at end of file diff --git a/docs/agreement/privacy/index.html b/docs/agreement/privacy/index.html new file mode 100644 index 000000000000..3cef92c495da --- /dev/null +++ b/docs/agreement/privacy/index.html @@ -0,0 +1,44 @@ +隐私政策 | FastGPT
+
隐私政策
gavel

隐私政策

FastGPT 隐私政策

最后更新时间:2024年3月3日

我们非常重视您的隐私保护,在您使用FastGPT云服务时(以下简称为“本服务”),我们将按照以下政策收集、使用、披露和保护您的个人信息。请您仔细阅读并充分理解本隐私政策。

我们可能需要收集的信息

  1. 在您注册或使用本服务时,我们可能收集您的姓名、电话号码、电子邮件地址、地址等个人信息。
  2. 在您使用本服务过程中产生的信息,如操作日志、访问IP地址、设备型号等。
  3. 我们可能会通过 Cookies 或其他技术收集和存储您访问本服务的相关信息,以便为您提供更好的用户体验。

我们如何使用收集的信息?

  1. 我们会根据法律法规规定以及与用户之间的约定来处理用户的个人信息。
  2. 我们可能会将收集到的信息用于改进服务质量、开发新产品或功能等目的。
  3. 我们可能会将收集到的信息用于向您推送与本服务相关的通知或广告。

信息披露

  1. 我们不会向任何第三方披露您的个人信息,除非:

    1. 您事先同意;
    2. 法律法规要求;
    3. 为维护我们或其他用户的合法权益。
  2. 我们可能与关联公司、合作伙伴分享您的个人信息,但我们会采取相应的保密措施,确保信息安全。

信息保护

  1. 我们采取各种安全措施,包括加密、访问控制等技术手段,以保护您的个人信息免受未经授权的访问、使用或泄露。
  2. 我们会定期对收集、存储和处理的个人信息进行安全评估,以确保个人信息安全。
  3. 在发生个人信息泄露等安全事件时,我们会立即启动应急预案,并在法律法规规定的范围内向您及时告知。
  4. 我们不会使用您的数据进行额外的备份存储或用于模型训练。
  5. 您在本服务进行的数据删除均为物理删除,不可恢复。如有非物理删除的操作,我们会在服务中特别指出。

用户权利

  1. 您有权随时查阅、更正或删除您的个人信息。
  2. 您有权拒绝我们收集您的个人信息,但这可能导致您无法使用本服务的部分功能。
  3. 您有权要求我们停止处理您的个人信息,但这可能导致您无法继续使用本服务。

隐私政策更新

  1. 我们可能会对本隐私政策进行修改。如本隐私政策发生变更,我们将在本服务页面上发布修改后的隐私政策。如您继续使用本服务,则视为同意修改后的隐私政策。
  2. 我们鼓励您定期查阅本隐私政策,以了解我们如何保护您的个人信息。

未成年人保护

我们非常重视对未成年人个人信息的保护,如您为未成年人,请在监护人指导下使用本服务,并请监护人帮助您在使用本服务过程中正确处理个人信息。

跨境数据传输

由于我们的服务器可能位于不同国家或地区,您同意我们可能需要将您的个人信息传输至其他国家或地区,并在该等国家或地区存储和处理以向您提供服务。我们会采取适当措施确保跨境传输的数据仍然受到适当保护。

联系我们

  1. 如您对本隐私政策有任何疑问、建议或投诉,请通过以下方式与我们联系:yujinlong@sealos.io。
  2. 我们将尽快回复并解决您提出的问题。
+ + + + \ No newline at end of file diff --git a/docs/agreement/terms/index.html b/docs/agreement/terms/index.html new file mode 100644 index 000000000000..6a0a82579601 --- /dev/null +++ b/docs/agreement/terms/index.html @@ -0,0 +1,44 @@ +服务协议 | FastGPT
+
服务协议
gavel

服务协议

FastGPT 服务协议

最后更新时间:2024年3月3日

FastGPT 服务协议是您与珠海环界云计算有限公司(以下简称“我们”或“本公司”)之间就FastGPT云服务(以下简称“本服务”)的使用等相关事项所订立的协议。请您仔细阅读并充分理解本协议各条款,特别是免除或者限制我们责任的条款、对您权益的限制条款、争议解决和法律适用条款等。如您不同意本协议任一内容,请勿注册或使用本服务。

第1条 服务内容

  1. 我们将向您提供存储、计算、网络传输等基于互联网的信息技术服务。
  2. 我们将不定期向您通过站内信、电子邮件或短信等形式向您推送最新的动态。
  3. 我们将为您提供相关技术支持和客户服务,帮助您更好地使用本服务。
  4. 我们将为您提供稳定的在线服务,保证每月服务可用性不低于99%。

第2条 用户注册与账户管理

  1. 您在使用本服务前需要注册一个账户。您保证在注册时提供的信息真实、准确、完整,并及时更新。
  2. 您应妥善保管账户名和密码,对由此产生的全部行为负责。如发现他人使用您的账户,请及时修改账号密码或与我们进行联系。
  3. 我们有权对您的账户进行审查,如发现您的账户存在异常或违法情况,我们有权暂停或终止向您提供服务。

第3条 使用规则

  1. 您不得利用本服务从事任何违法活动或侵犯他人合法权益的行为,包括但不限于侵犯知识产权、泄露他人商业机密等。
  2. 您不得通过任何手段恶意注册账户,包括但不限于以牟利、炒作、套现等目的。
  3. 您不得利用本服务传播任何违法、有害、恶意软件等信息。
  4. 您应遵守相关法律法规及本协议的规定,对在本服务中发布的信息及使用本服务所产生的结果承担全部责任。
  5. 我们禁止使用我们对接的模型服务生成可能对个人或社会造成伤害的内容。保障平台的安全性,是长期稳定运营的关键。如发现任何利用平台接入模型能力进行违规内容生成和使用,将立即封号,账号余额不退。违规内容包括但不限于:
    • 剥削和虐待
      • 禁止描述、展示或宣扬儿童性剥削或性虐待的内容,无论法律是否禁止。这包括涉及儿童或使儿童色情的内容。
      • 禁止描述或用于培养儿童的内容。修饰是成年人以剥削,特别是性剥削为目的与儿童建立关系的行为。这包括以性剥削、贩运或其他形式剥削为目的与儿童交流。
    • 未经同意的私密内容
      • 服务禁止描述、提供或宣传未经同意的亲密活动的内容。
    • 禁止描述、提供特征或宣传或用于招揽商业性活动和性服务的内容。这包括鼓励和协调真正的性活动。
    • 禁止描述或用于人口贩运目的的内容。这包括招募人员、便利交通、支付和助长对人的剥削,如强迫劳动、家庭奴役、役、强迫婚姻和强迫医疗程序。
    • 自杀和自残,禁止描述、赞美、支持、促进、美化、鼓励和/或指导个人自残或自杀的内容。
    • 暴力内容和行为
      • 禁止描述、展示或宣扬血腥暴力或血腥的内容。
      • 禁止描绘恐怖主义行为的内容;赞扬或支持恐怖组织、恐怖行为者或暴力恐怖意识形态;鼓励恐怖活动;向恐怖组织或恐怖事业提供援助;或协助恐怖组织招募成员。
      • 禁止通过暴力威胁或煽动来鼓吹或宣扬对他人的暴力行为的内容。
    • 仇恨言论和歧视
      • 禁止基于实际或感知的种族、民族、国籍、性别、性别认同、性取向、宗教信仰、年龄、残疾状况、种姓或与系统性偏见或边缘化相关的任何其他特征等特征攻击、诋毁、恐吓、降级、针对或排斥个人或群体的内容。
      • 禁止针对个人或群体进行威胁、恐吓、侮辱、贬低或贬低的语言或图像、宣扬身体伤害或其他虐待行为(如跟踪)的内容。
    • 禁止故意欺骗并可能对公共利益产生不利影响的内容,包括与健康、安全、选举诚信或公民参与相关的欺骗性或不真实内容。
    • 直接支持非法主动攻击或造成技术危害的恶意软件活动的内容,例如提供恶意可执行文件、组织拒绝服务攻击或管理命令和控制服务器。

第4条 费用及支付

  1. 您同意支付与本服务相关的费用,具体费用标准以我们公布的价格为准。
  2. 我们可能会根据运营成本和市场情况调整费用标准。最新价格以您付款时刻的价格为准。

第5条 服务免责与责任限制

  1. 本服务按照现有技术和条件所能达到的水平提供。我们不能保证本服务完全无故障或满足您的所有需求。
  2. 对于因您自身误操作导致的数据丢失、损坏等情况,我们不承担责任。
  3. 由于生成式 AI 的特性,其在不同国家的管控措施也会有所不同,请所有使用者务必遵守所在地的相关法律。如果您以任何违反 FastGPT 可接受使用政策的方式使用,包括但不限于法律、法规、政府命令或法令禁止的任何用途,或任何侵犯他人权利的使用;由使用者自行承担。我们对由客户使用产生的问题概不负责。下面是各国对生成式AI的管控条例的链接:

中国生成式人工智能服务管理办法(征求意见稿)

第6条 知识产权

  1. 我们对本服务及相关软件、技术、文档等拥有全部知识产权,除非经我们明确许可,您不得进行复制、分发、出租、反向工程等行为。
  2. 您在使用本服务过程中产生的所有数据和内容(包括但不限于文件、图片等)的知识产权归您所有。我们不会对您的数据和内容进行使用、复制、修改等行为。
  3. 在线服务中其他用户的数据和内容的知识产权归原用户所有,未经原用户许可,您不得进行使用、复制、修改等行为。

第7条 其他条款

  1. 如本协议中部分条款因违反法律法规而被视为无效,不影响其他条款的效力。
  2. 本公司保留对本协议及隐私政策的最终解释权。如您对本协议或隐私政策有任何疑问,请联系我们:yujinlong@sealos.io。
+ + + + \ No newline at end of file diff --git a/docs/browserconfig.xml b/docs/browserconfig.xml new file mode 100644 index 000000000000..b3930d0f0471 --- /dev/null +++ b/docs/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/docs/community/index.html b/docs/community/index.html new file mode 100644 index 000000000000..985985266558 --- /dev/null +++ b/docs/community/index.html @@ -0,0 +1,44 @@ +加入社区 | FastGPT
+
加入社区
forum

加入社区

加入 FastGPT 开发者社区和我们一起成长

FastGPT 是一个由用户和贡献者参与推动的开源项目,如果您对产品使用存在疑问和建议,可尝试以下方式寻求支持。我们的团队与社区会竭尽所能为您提供帮助。

  • 📱 扫码加入社区微信交流群👇

  • 🐞 请将任何 FastGPT 的 Bug、问题和需求提交到 GitHub Issue

+ + + + \ No newline at end of file diff --git a/docs/development/configuration/index.html b/docs/development/configuration/index.html new file mode 100644 index 000000000000..fa43c8fd6f4f --- /dev/null +++ b/docs/development/configuration/index.html @@ -0,0 +1,241 @@ +配置文件介绍 | FastGPT
+
settings

配置文件介绍

FastGPT 配置参数介绍

由于环境变量不利于配置复杂的内容,新版 FastGPT 采用了 ConfigMap 的形式挂载配置文件,你可以在 projects/app/data/config.json 看到默认的配置文件。可以参考 docker-compose 快速部署 来挂载配置文件。

开发环境下,你需要将示例配置文件 config.json 复制成 config.local.json 文件才会生效。

这个配置文件中包含了系统参数和各个模型配置:

4.6.8+ 版本新配置文件示例

+  {
+  "feConfigs": {
+    "lafEnv": "https://laf.dev" // laf环境。 https://laf.run (杭州阿里云) ,或者私有化的laf环境。如果使用 Laf openapi 功能,需要最新版的 laf 。
+  },
+  "systemEnv": {
+    "vectorMaxProcess": 15, // 向量处理线程数量
+    "qaMaxProcess": 15, // 问答拆分线程数量
+    "tokenWorkers": 50, // Token 计算线程保持数,会持续占用内存,不能设置太大。
+    "pgHNSWEfSearch": 100 // 向量搜索参数。越大,搜索越精确,但是速度越慢。设置为100,有99%+精度。
+  },
+  "llmModels": [
+    {
+      "provider": "OpenAI", // 模型提供商,主要用于分类展示,目前已经内置提供商包括:https://github.com/labring/FastGPT/blob/main/packages/global/core/ai/provider.ts, 可 pr 提供新的提供商,或直接填写 Other
+      "model": "gpt-4o-mini", // 模型名(对应OneAPI中渠道的模型名)
+      "name": "gpt-4o-mini", // 模型别名
+      "maxContext": 125000, // 最大上下文
+      "maxResponse": 16000, // 最大回复
+      "quoteMaxToken": 120000, // 最大引用内容
+      "maxTemperature": 1.2, // 最大温度
+      "charsPointsPrice": 0, // n积分/1k token(商业版)
+      "censor": false, // 是否开启敏感校验(商业版)
+      "vision": true, // 是否支持图片输入
+      "datasetProcess": true, // 是否设置为文本理解模型(QA),务必保证至少有一个为true,否则知识库会报错
+      "usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true)
+      "usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true)
+      "usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true)
+      "usedInQueryExtension": true, // 是否用于问题优化(务必保证至少有一个为true)
+      "toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。)
+      "functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式)
+      "customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
+      "customExtractPrompt": "", // 自定义内容提取提示词
+      "defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
+      "defaultConfig": {}, // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
+      "fieldMap": {} // 字段映射(o1 模型需要把 max_tokens 映射为 max_completion_tokens)
+    },
+    {
+      "provider": "OpenAI",
+      "model": "gpt-4o",
+      "name": "gpt-4o",
+      "maxContext": 125000,
+      "maxResponse": 4000,
+      "quoteMaxToken": 120000,
+      "maxTemperature": 1.2,
+      "charsPointsPrice": 0,
+      "censor": false,
+      "vision": true,
+      "datasetProcess": true,
+      "usedInClassify": true,
+      "usedInExtractFields": true,
+      "usedInToolCall": true,
+      "usedInQueryExtension": true,
+      "toolChoice": true,
+      "functionCall": false,
+      "customCQPrompt": "",
+      "customExtractPrompt": "",
+      "defaultSystemChatPrompt": "",
+      "defaultConfig": {},
+      "fieldMap": {}
+    },
+    {
+      "provider": "OpenAI",
+      "model": "o1-mini",
+      "name": "o1-mini",
+      "maxContext": 125000,
+      "maxResponse": 65000,
+      "quoteMaxToken": 120000,
+      "maxTemperature": 1.2,
+      "charsPointsPrice": 0,
+      "censor": false,
+      "vision": false,
+      "datasetProcess": true,
+      "usedInClassify": true,
+      "usedInExtractFields": true,
+      "usedInToolCall": true,
+      "usedInQueryExtension": true,
+      "toolChoice": false,
+      "functionCall": false,
+      "customCQPrompt": "",
+      "customExtractPrompt": "",
+      "defaultSystemChatPrompt": "",
+      "defaultConfig": {
+        "temperature": 1,
+        "max_tokens": null,
+        "stream": false
+      }
+    },
+    {
+      "provider": "OpenAI",
+      "model": "o1-preview",
+      "name": "o1-preview",
+      "maxContext": 125000,
+      "maxResponse": 32000,
+      "quoteMaxToken": 120000,
+      "maxTemperature": 1.2,
+      "charsPointsPrice": 0,
+      "censor": false,
+      "vision": false,
+      "datasetProcess": true,
+      "usedInClassify": true,
+      "usedInExtractFields": true,
+      "usedInToolCall": true,
+      "usedInQueryExtension": true,
+      "toolChoice": false,
+      "functionCall": false,
+      "customCQPrompt": "",
+      "customExtractPrompt": "",
+      "defaultSystemChatPrompt": "",
+      "defaultConfig": {
+         "temperature": 1,
+        "max_tokens": null,
+        "stream": false
+      }
+    }
+  ],
+  "vectorModels": [
+    {
+      "provider": "OpenAI",
+      "model": "text-embedding-3-small",
+      "name": "text-embedding-3-small",
+      "charsPointsPrice": 0,
+      "defaultToken": 512,
+      "maxToken": 3000,
+      "weight": 100
+    },
+    {
+      "provider": "OpenAI",
+      "model": "text-embedding-3-large",
+      "name": "text-embedding-3-large",
+      "charsPointsPrice": 0,
+      "defaultToken": 512,
+      "maxToken": 3000,
+      "weight": 100,
+      "defaultConfig": {
+        "dimensions": 1024
+      }
+    },
+    {
+      "provider": "OpenAI",
+      "model": "text-embedding-ada-002", // 模型名(与OneAPI对应)
+      "name": "Embedding-2", // 模型展示名
+      "charsPointsPrice": 0, // n积分/1k token
+      "defaultToken": 700, // 默认文本分割时候的 token
+      "maxToken": 3000, // 最大 token
+      "weight": 100, // 优先训练权重
+      "defaultConfig": {}, // 自定义额外参数。例如,如果希望使用 embedding3-large 的话,可以传入 dimensions:1024,来返回1024维度的向量。(目前必须小于1536维度)
+      "dbConfig": {}, // 存储时的额外参数(非对称向量模型时候需要用到)
+      "queryConfig": {} // 参训时的额外参数
+    }
+  ],
+  "reRankModels": [],
+  "audioSpeechModels": [
+    {
+      "provider": "OpenAI",
+      "model": "tts-1",
+      "name": "OpenAI TTS1",
+      "charsPointsPrice": 0,
+      "voices": [
+        { "label": "Alloy", "value": "alloy", "bufferId": "openai-Alloy" },
+        { "label": "Echo", "value": "echo", "bufferId": "openai-Echo" },
+        { "label": "Fable", "value": "fable", "bufferId": "openai-Fable" },
+        { "label": "Onyx", "value": "onyx", "bufferId": "openai-Onyx" },
+        { "label": "Nova", "value": "nova", "bufferId": "openai-Nova" },
+        { "label": "Shimmer", "value": "shimmer", "bufferId": "openai-Shimmer" }
+      ]
+    }
+  ],
+  "whisperModel": {
+    "provider": "OpenAI",
+    "model": "whisper-1",
+    "name": "Whisper1",
+    "charsPointsPrice": 0
+  }
+}
+  

内置的模型提供商ID

为了方便模型分类展示,FastGPT 内置了部分模型提供商的名字和 Logo。如果你期望补充提供商,可提交 Issue,并提供几个信息:

  1. 厂商官网地址
  2. 厂商 SVG logo,建议是正方形图片。

目前已支持的提供商, 复制 “-” 之前的字符串,作为 provider 的值。

  • OpenAI
  • Claude
  • Gemini
  • Meta
  • MistralAI
  • AliCloud - 阿里云
  • Qwen - 通义千问
  • Doubao - 豆包
  • ChatGLM - 智谱
  • DeepSeek - 深度求索
  • Moonshot - 月之暗面
  • MiniMax
  • SparkDesk - 讯飞星火
  • Hunyuan - 腾讯混元
  • Baichuan - 百川
  • Yi - 零一万物
  • Ernie - 文心一言
  • StepFun - 阶跃星辰
  • Ollama
  • BAAI - 智源研究院
  • FishAudio
  • Other - 其他

ReRank 模型接入

由于 OneAPI 不支持 Rerank 模型,所以需要单独配置接入,这里

使用硅基流动的在线模型

有免费的 bge-reranker-v2-m3 模型可以使用。

  1. 点击注册硅基流动账号
  2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak
  3. 修改 FastGPT 配置文件
+  {
+    "reRankModels": [
+        {
+            "model": "BAAI/bge-reranker-v2-m3", // 这里的model需要对应 siliconflow 的模型名
+            "name": "BAAI/bge-reranker-v2-m3",
+            "requestUrl": "https://api.siliconflow.cn/v1/rerank",
+            "requestAuth": "siliconflow 上申请的 key"
+        }
+    ]
+}
+  

私有部署模型

请使用 4.6.6-alpha 以上版本,配置文件中的 reRankModels 为重排模型,虽然是数组,不过目前仅有第1个生效。

  1. 部署 ReRank 模型
  2. 找到 FastGPT 的配置文件中的 reRankModels, 4.6.6 以前是 ReRankModels
  3. 修改对应的值:
+  {
+    "reRankModels": [
+        {
+            "model": "bge-reranker-base", // 随意
+            "name": "检索重排-base", // 随意
+            "charsPointsPrice": 0,
+            "requestUrl": "{{host}}/v1/rerank",
+            "requestAuth": "安全凭证,已自动补 Bearer"
+        }
+    ]
+}
+  
+ + + + \ No newline at end of file diff --git a/docs/development/custom-models/bge-rerank/index.html b/docs/development/custom-models/bge-rerank/index.html new file mode 100644 index 000000000000..d4378374f204 --- /dev/null +++ b/docs/development/custom-models/bge-rerank/index.html @@ -0,0 +1,84 @@ +接入 bge-rerank 重排模型 | FastGPT
+
sort

接入 bge-rerank 重排模型

接入 bge-rerank 重排模型

不同模型推荐配置

推荐配置如下:

模型名内存显存硬盘空间启动命令
bge-reranker-base>=4GB>=4GB>=8GBpython app.py
bge-reranker-large>=8GB>=8GB>=8GBpython app.py
bge-reranker-v2-m3>=8GB>=8GB>=8GBpython app.py

源码部署

1. 安装环境

  • Python 3.9, 3.10
  • CUDA 11.7
  • 科学上网环境

2. 下载代码

3 个模型代码分别为:

  1. https://github.com/labring/FastGPT/tree/main/python/bge-rerank/bge-reranker-base
  2. https://github.com/labring/FastGPT/tree/main/python/bge-rerank/bge-reranker-large
  3. https://github.com/labring/FastGPT/tree/main/python/bge-rerank/bge-reranker-v2-m3

3. 安装依赖

+  pip install -r requirements.txt
+  

4. 下载模型

3个模型的 huggingface 仓库地址如下:

  1. https://huggingface.co/BAAI/bge-reranker-base
  2. https://huggingface.co/BAAI/bge-reranker-large
  3. https://huggingface.co/BAAI/bge-reranker-v2-m3

在对应代码目录下 clone 模型。目录结构:

+  bge-reranker-base/
+app.py
+Dockerfile
+requirements.txt
+  

5. 运行代码

+  python app.py
+  

启动成功后应该会显示如下地址:

这里的 http://0.0.0.0:6006 就是连接地址。

docker 部署

镜像名分别为:

  1. registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1 (4 GB+)
  2. registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-large:v0.1 (5 GB+)
  3. registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-v2-m3:v0.1 (5 GB+)

端口

6006

环境变量

+  ACCESS_TOKEN=访问安全凭证,请求时,Authorization: Bearer ${ACCESS_TOKEN}
+  

运行命令示例

+  # auth token 为mytoken
+docker run -d --name reranker -p 6006:6006 -e ACCESS_TOKEN=mytoken --gpus all registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1
+  

docker-compose.yml示例

+  version: "3"
+services:
+  reranker:
+    image: registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1
+    container_name: reranker
+    # GPU运行环境,如果宿主机未安装,将deploy配置隐藏即可
+    deploy:
+      resources:
+        reservations:
+          devices:
+          - driver: nvidia
+            count: all
+            capabilities: [gpu]
+    ports:
+      - 6006:6006
+    environment:
+      - ACCESS_TOKEN=mytoken
+  

接入 FastGPT

参考 ReRank模型接入,host 变量为部署的域名。

QA

Docker 运行提示 Bus error (core dumped)

尝试增加 docker-compose.yml 配置项 shm_size ,以增加容器中的共享内存目录大小。

+  ...
+services:
+  reranker:
+    ...
+    container_name: reranker
+    shm_size: '2gb'
+    ...
+  
+ + + + \ No newline at end of file diff --git a/docs/development/custom-models/chatglm2-m3e/index.html b/docs/development/custom-models/chatglm2-m3e/index.html new file mode 100644 index 000000000000..a4594ca90dc7 --- /dev/null +++ b/docs/development/custom-models/chatglm2-m3e/index.html @@ -0,0 +1,94 @@ +接入 ChatGLM2-m3e 模型 | FastGPT
+
model_training

接入 ChatGLM2-m3e 模型

将 FastGPT 接入私有化模型 ChatGLM2和m3e-large

前言

FastGPT 默认使用了 OpenAI 的 LLM 模型和向量模型,如果想要私有化部署的话,可以使用 ChatGLM2 和 m3e-large 模型。以下是由用户@不做了睡大觉 提供的接入方法。该镜像直接集成了 M3E-Large 和 ChatGLM2-6B 模型,可以直接使用。

部署镜像

  • 镜像名: stawky/chatglm2-m3e:latest
  • 国内镜像名: registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/chatglm2-m3e:latest
  • 端口号: 6006
+  # 设置安全凭证(即oneapi中的渠道密钥)
+默认值:sk-aaabbbcccdddeeefffggghhhiiijjjkkk
+也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。
+  

接入 One API

为 chatglm2 和 m3e-large 各添加一个渠道,参数如下:

这里我填入 m3e 作为向量模型,chatglm2 作为语言模型

测试

curl 例子:

+  curl --location --request POST 'https://domain/v1/embeddings' \
+--header 'Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+  "model": "m3e",
+  "input": ["laf是什么"]
+}'
+  
+  curl --location --request POST 'https://domain/v1/chat/completions' \
+--header 'Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+  "model": "chatglm2",
+  "messages": [{"role": "user", "content": "Hello!"}]
+}'
+  

Authorization 为 sk-aaabbbcccdddeeefffggghhhiiijjjkkk。model 为刚刚在 One API 填写的自定义模型。

接入 FastGPT

修改 config.json 配置文件,在 llmModels 中加入 chatglm2, 在 vectorModels 中加入 M3E 模型:

+  "llmModels": [
+  //其他对话模型
+  {
+    "model": "chatglm2",
+    "name": "chatglm2",
+    "maxToken": 8000,
+    "price": 0,
+    "quoteMaxToken": 4000,
+    "maxTemperature": 1.2,
+    "defaultSystemChatPrompt": ""
+  }
+],
+"vectorModels": [
+    {
+      "model": "text-embedding-ada-002",
+      "name": "Embedding-2",
+      "price": 0.2,
+      "defaultToken": 500,
+      "maxToken": 3000
+    },
+    {
+      "model": "m3e",
+      "name": "M3E(测试使用)",
+      "price": 0.1,
+      "defaultToken": 500,
+      "maxToken": 1800
+    }
+],
+  

测试使用

M3E 模型的使用方法如下:

  1. 创建知识库时候选择 M3E 模型。

    注意,一旦选择后,知识库将无法修改向量模型。

  2. 导入数据

  3. 搜索测试

  4. 应用绑定知识库

    注意,应用只能绑定同一个向量模型的知识库,不能跨模型绑定。并且,需要注意调整相似度,不同向量模型的相似度(距离)会有所区别,需要自行测试实验。

chatglm2 模型的使用方法如下: +模型选择 chatglm2 即可

+ + + + \ No newline at end of file diff --git a/docs/development/custom-models/chatglm2/index.html b/docs/development/custom-models/chatglm2/index.html new file mode 100644 index 000000000000..bfe279b02faa --- /dev/null +++ b/docs/development/custom-models/chatglm2/index.html @@ -0,0 +1,70 @@ +接入 ChatGLM2-6B | FastGPT
+
model_training

接入 ChatGLM2-6B

将 FastGPT 接入私有化模型 ChatGLM2-6B

前言

FastGPT 允许你使用自己的 OpenAI API KEY 来快速调用 OpenAI 接口,目前集成了 GPT-3.5, GPT-4 和 embedding,可构建自己的知识库。但考虑到数据安全的问题,我们并不能将所有的数据都交付给云端大模型。

那么如何在 FastGPT 上接入私有化模型呢?本文就以清华的 ChatGLM2 为例,为各位讲解如何在 FastGPT 中接入私有化模型。

ChatGLM2-6B 简介

ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,具体介绍可参阅 ChatGLM2-6B 项目主页

推荐配置

依据官方数据,同样是生成 8192 长度,量化等级为 FP16 要占用 12.8GB 显存、int8 为 8.1GB 显存、int4 为 5.1GB 显存,量化后会稍微影响性能,但不多。

因此推荐配置如下:

类型内存显存硬盘空间启动命令
fp16>=16GB>=16GB>=25GBpython openai_api.py 16
int8>=16GB>=9GB>=25GBpython openai_api.py 8
int4>=16GB>=6GB>=25GBpython openai_api.py 4

部署

环境要求

  • Python 3.8.10
  • CUDA 11.8
  • 科学上网环境

源码部署

  1. 根据上面的环境配置配置好环境,具体教程自行 GPT;
  2. 下载 python 文件
  3. 在命令行输入命令 pip install -r requirements.txt
  4. 打开你需要启动的 py 文件,在代码的 verify_token 方法中配置 token,这里的 token 只是加一层验证,防止接口被人盗用;
  5. 执行命令 python openai_api.py --model_name 16。这里的数字根据上面的配置进行选择。

然后等待模型下载,直到模型加载完毕为止。如果出现报错先问 GPT。

启动成功后应该会显示如下地址:

这里的 http://0.0.0.0:6006 就是连接地址。

docker 部署

镜像和端口

  • 镜像名: stawky/chatglm2:latest
  • 国内镜像名: registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/chatglm2:latest
  • 端口号: 6006
+  # 设置安全凭证(即oneapi中的渠道密钥)
+默认值:sk-aaabbbcccdddeeefffggghhhiiijjjkkk
+也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。
+  

接入 One API

为 chatglm2 添加一个渠道,参数如下:

这里我填入 chatglm2 作为语言模型

测试

curl 例子:

+  curl --location --request POST 'https://domain/v1/chat/completions' \
+--header 'Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+  "model": "chatglm2",
+  "messages": [{"role": "user", "content": "Hello!"}]
+}'
+  

Authorization 为 sk-aaabbbcccdddeeefffggghhhiiijjjkkk。model 为刚刚在 One API 填写的自定义模型。

接入 FastGPT

修改 config.json 配置文件,在 llmModels 中加入 chatglm2 模型:

+  "llmModels": [
+  //已有模型
+  {
+    "model": "chatglm2",
+    "name": "chatglm2",
+    "maxContext": 4000,
+    "maxResponse": 4000,
+    "quoteMaxToken": 2000,
+    "maxTemperature": 1,
+    "vision": false, 
+    "defaultSystemChatPrompt": ""
+  }
+]
+  

测试使用

chatglm2 模型的使用方法如下:

模型选择 chatglm2 即可

+ + + + \ No newline at end of file diff --git a/docs/development/custom-models/index.html b/docs/development/custom-models/index.html new file mode 100644 index 000000000000..aee29515a73f --- /dev/null +++ b/docs/development/custom-models/index.html @@ -0,0 +1,44 @@ +本地模型使用 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/development/custom-models/index.xml b/docs/development/custom-models/index.xml new file mode 100644 index 000000000000..b9411af4530c --- /dev/null +++ b/docs/development/custom-models/index.xml @@ -0,0 +1,44 @@ +本地模型使用 on FastGPThttps://doc.tryfastgpt.ai/docs/development/custom-models/Recent content in 本地模型使用 on FastGPTHugo -- gohugo.iozh-cn接入 Marker PDF 文档解析https://doc.tryfastgpt.ai/docs/development/custom-models/marker/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/marker/背景 linkPDF 是一个相对复杂的文件格式,在 FastGPT 内置的 pdf 解析器中,依赖的是 pdfjs 库解析,该库基于逻辑解析,无法有效的理解复杂的 pdf 文件。所以我们在解析 pdf 时候,如果遇到图片、表格、公式等非简单文本内容,会发现解析效果不佳。 +市面上目前有多种解析 PDF 的方法,比如使用 Marker,该项目使用了 Surya 模型,基于视觉解析,可以有效提取图片、表格、公式等复杂内容。为了可以让 Marker 快速接入 FastGPT,我们做了一个自定义解析的拓展 Demo。 +在 FastGPT 4.8.15 版本中,你可以通过增加一个环境变量,来替换掉 FastGPT 系统内置解析器,实现自定义的文档解析服务。该功能只是 Demo 阶段,后期配置模式和交互规则会发生改动。 +使用教程 link1. 按照 Marker link参考文档 Marker 安装教程,安装 Marker 模型。封装的 API 已经适配了 FastGPT 自定义解析服务。 +这里介绍快速 Docker 安装的方法: +docker pull crpi-h3snc261q1dosroc.cn-hangzhou.personal.cr.aliyuncs.com/marker11/marker_images:latest docker run --gpus all -itd -p 7231:7231 --name model_pdf_v1 crpi-h3snc261q1dosroc.cn-hangzhou.personal.cr.aliyuncs.com/marker11/marker_images:latest 2. 添加 FastGPT 环境变量 link CUSTOM_READ_FILE_URL=http://xxxx.com/v1/parse/file CUSTOM_READ_FILE_EXTENSION=pdf CUSTOM_READ_FILE_URL - 自定义解析服务的地址, host改成解析服务的访问地址,path 不能变动。 CUSTOM_READ_FILE_EXTENSION - 支持的文件后缀,多个文件类型,可用逗号隔开。 3.使用 Xinference 接入本地模型https://doc.tryfastgpt.ai/docs/development/custom-models/xinference/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/xinference/Xinference 是一款开源模型推理平台,除了支持 LLM,它还可以部署 Embedding 和 ReRank 模型,这在企业级 RAG 构建中非常关键。同时,Xinference 还提供 Function Calling 等高级功能。还支持分布式部署,也就是说,随着未来应用调用量的增长,它可以进行水平扩展。 +安装 Xinference linkXinference 支持多种推理引擎作为后端,以满足不同场景下部署大模型的需要,下面会分使用场景来介绍一下这三种推理后端,以及他们的使用方法。 +1. 服务器 link如果你的目标是在一台 Linux 或者 Window 服务器上部署大模型,可以选择 Transformers 或 vLLM 作为 Xinference 的推理后端: +Transformers:通过集成 Huggingface 的 Transformers 库作为后端,Xinference 可以最快地 集成当今自然语言处理(NLP)领域的最前沿模型(自然也包括 LLM)。 vLLM: vLLM 是由加州大学伯克利分校开发的一个开源库,专为高效服务大型语言模型(LLM)而设计。它引入了 PagedAttention 算法, 通过有效管理注意力键和值来改善内存管理,吞吐量能够达到 Transformers 的 24 倍,因此 vLLM 适合在生产环境中使用,应对高并发的用户访问。 假设你服务器配备 NVIDIA 显卡,可以参考这篇文章中的指令来安装 CUDA,从而让 Xinference 最大限度地利用显卡的加速功能。 +Docker 部署 link你可以使用 Xinference 官方的 Docker 镜像来一键安装和启动 Xinference 服务(确保你的机器上已经安装了 Docker),命令如下: +docker run -p 9997:9997 --gpus all xprobe/xinference:latest xinference-local -H 0.接入 bge-rerank 重排模型https://doc.tryfastgpt.ai/docs/development/custom-models/bge-rerank/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/bge-rerank/不同模型推荐配置 link推荐配置如下: +模型名 内存 显存 硬盘空间 启动命令 bge-reranker-base >=4GB >=4GB >=8GB python app.py bge-reranker-large >=8GB >=8GB >=8GB python app.py bge-reranker-v2-m3 >=8GB >=8GB >=8GB python app.py 源码部署 link1. 安装环境 link Python 3.9, 3.10 CUDA 11.7 科学上网环境 2. 下载代码 link3 个模型代码分别为: +https://github.com/labring/FastGPT/tree/main/python/bge-rerank/bge-reranker-base https://github.com/labring/FastGPT/tree/main/python/bge-rerank/bge-reranker-large https://github.com/labring/FastGPT/tree/main/python/bge-rerank/bge-reranker-v2-m3 3. 安装依赖 link pip install -r requirements.txt 4. 下载模型 link3个模型的 huggingface 仓库地址如下: +https://huggingface.co/BAAI/bge-reranker-base https://huggingface.co/BAAI/bge-reranker-large https://huggingface.co/BAAI/bge-reranker-v2-m3 在对应代码目录下 clone 模型。目录结构: +bge-reranker-base/ app.py Dockerfile requirements.txt 5. 运行代码 link python app.py 启动成功后应该会显示如下地址:接入 ChatGLM2-6Bhttps://doc.tryfastgpt.ai/docs/development/custom-models/chatglm2/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/chatglm2/前言 linkFastGPT 允许你使用自己的 OpenAI API KEY 来快速调用 OpenAI 接口,目前集成了 GPT-3.5, GPT-4 和 embedding,可构建自己的知识库。但考虑到数据安全的问题,我们并不能将所有的数据都交付给云端大模型。 +那么如何在 FastGPT 上接入私有化模型呢?本文就以清华的 ChatGLM2 为例,为各位讲解如何在 FastGPT 中接入私有化模型。 +ChatGLM2-6B 简介 linkChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,具体介绍可参阅 ChatGLM2-6B 项目主页。 +warning 注意,ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。本教程只是介绍了一种用法,无权给予任何授权! +推荐配置 link依据官方数据,同样是生成 8192 长度,量化等级为 FP16 要占用 12.8GB 显存、int8 为 8.1GB 显存、int4 为 5.1GB 显存,量化后会稍微影响性能,但不多。 +因此推荐配置如下: +类型 内存 显存 硬盘空间 启动命令 fp16 >=16GB >=16GB >=25GB python openai_api.py 16 int8 >=16GB >=9GB >=25GB python openai_api.py 8 int4 >=16GB >=6GB >=25GB python openai_api.接入 M3E 向量模型https://doc.tryfastgpt.ai/docs/development/custom-models/m3e/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/m3e/前言 linkFastGPT 默认使用了 openai 的 embedding 向量模型,如果你想私有部署的话,可以使用 M3E 向量模型进行替换。M3E 向量模型属于小模型,资源使用不高,CPU 也可以运行。下面教程是基于 “睡大觉” 同学提供的一个的镜像。 +部署镜像 link镜像名: stawky/m3e-large-api:latest +国内镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api:latest 端口号: 6008 环境变量: +# 设置安全凭证(即oneapi中的渠道密钥) 默认值:sk-aaabbbcccdddeeefffggghhhiiijjjkkk 也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。 接入 One API link添加一个渠道,参数如下: +测试 linkcurl 例子: +curl --location --request POST 'https://domain/v1/embeddings' \ --header 'Authorization: Bearer xxxx' \ --header 'Content-Type: application/json' \ --data-raw '{ "model": "m3e", "input": ["laf是什么"] }' Authorization 为 sk-key。model 为刚刚在 One API 填写的自定义模型。 +接入 FastGPT link修改 config.json 配置文件,在 vectorModels 中加入 M3E 模型:接入 ChatGLM2-m3e 模型https://doc.tryfastgpt.ai/docs/development/custom-models/chatglm2-m3e/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/chatglm2-m3e/前言 linkFastGPT 默认使用了 OpenAI 的 LLM 模型和向量模型,如果想要私有化部署的话,可以使用 ChatGLM2 和 m3e-large 模型。以下是由用户@不做了睡大觉 提供的接入方法。该镜像直接集成了 M3E-Large 和 ChatGLM2-6B 模型,可以直接使用。 +部署镜像 link 镜像名: stawky/chatglm2-m3e:latest 国内镜像名: registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/chatglm2-m3e:latest 端口号: 6006 # 设置安全凭证(即oneapi中的渠道密钥) +默认值:sk-aaabbbcccdddeeefffggghhhiiijjjkkk +也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。 接入 One API link为 chatglm2 和 m3e-large 各添加一个渠道,参数如下: +这里我填入 m3e 作为向量模型,chatglm2 作为语言模型 +测试 linkcurl 例子: +curl --location --request POST 'https://domain/v1/embeddings' \ +--header 'Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk' \ +--header 'Content-Type: application/json' \ +--data-raw '{ +"model": "m3e", +"input": ["laf是什么"] +}' curl --location --request POST 'https://domain/v1/chat/completions' \ +--header 'Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk' \ +--header 'Content-Type: application/json' \ +--data-raw '{ +"model": "chatglm2", +"messages": [{"role": "user", "content": "Hello! \ No newline at end of file diff --git a/docs/development/custom-models/m3e/index.html b/docs/development/custom-models/m3e/index.html new file mode 100644 index 000000000000..f962a20dd88e --- /dev/null +++ b/docs/development/custom-models/m3e/index.html @@ -0,0 +1,75 @@ +接入 M3E 向量模型 | FastGPT
+
model_training

接入 M3E 向量模型

将 FastGPT 接入私有化模型 M3E

前言

FastGPT 默认使用了 openai 的 embedding 向量模型,如果你想私有部署的话,可以使用 M3E 向量模型进行替换。M3E 向量模型属于小模型,资源使用不高,CPU 也可以运行。下面教程是基于 “睡大觉” 同学提供的一个的镜像。

部署镜像

镜像名: stawky/m3e-large-api:latest
国内镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api:latest +端口号: 6008 +环境变量:

+  # 设置安全凭证(即oneapi中的渠道密钥)
+默认值:sk-aaabbbcccdddeeefffggghhhiiijjjkkk
+也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。
+  

接入 One API

添加一个渠道,参数如下:

测试

curl 例子:

+  curl --location --request POST 'https://domain/v1/embeddings' \
+--header 'Authorization: Bearer xxxx' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+  "model": "m3e",
+  "input": ["laf是什么"]
+}'
+  

Authorization 为 sk-key。model 为刚刚在 One API 填写的自定义模型。

接入 FastGPT

修改 config.json 配置文件,在 vectorModels 中加入 M3E 模型:

+  "vectorModels": [
+    {
+      "model": "text-embedding-ada-002",
+      "name": "Embedding-2",
+      "price": 0.2,
+      "defaultToken": 500,
+      "maxToken": 3000
+    },
+    {
+      "model": "m3e",
+      "name": "M3E(测试使用)",
+      "price": 0.1,
+      "defaultToken": 500,
+      "maxToken": 1800
+    }
+]
+  

测试使用

  1. 创建知识库时候选择 M3E 模型。

    注意,一旦选择后,知识库将无法修改向量模型。

  2. 导入数据

  3. 搜索测试

  4. 应用绑定知识库

    注意,应用只能绑定同一个向量模型的知识库,不能跨模型绑定。并且,需要注意调整相似度,不同向量模型的相似度(距离)会有所区别,需要自行测试实验。

+ + + + \ No newline at end of file diff --git a/docs/development/custom-models/marker/index.html b/docs/development/custom-models/marker/index.html new file mode 100644 index 000000000000..7e87ea5c3ff1 --- /dev/null +++ b/docs/development/custom-models/marker/index.html @@ -0,0 +1,53 @@ +接入 Marker PDF 文档解析 | FastGPT
+
api

接入 Marker PDF 文档解析

使用 Marker 解析 PDF 文档,可实现图片提取和布局识别

背景

PDF 是一个相对复杂的文件格式,在 FastGPT 内置的 pdf 解析器中,依赖的是 pdfjs 库解析,该库基于逻辑解析,无法有效的理解复杂的 pdf 文件。所以我们在解析 pdf 时候,如果遇到图片、表格、公式等非简单文本内容,会发现解析效果不佳。

市面上目前有多种解析 PDF 的方法,比如使用 Marker,该项目使用了 Surya 模型,基于视觉解析,可以有效提取图片、表格、公式等复杂内容。为了可以让 Marker 快速接入 FastGPT,我们做了一个自定义解析的拓展 Demo。

在 FastGPT 4.8.15 版本中,你可以通过增加一个环境变量,来替换掉 FastGPT 系统内置解析器,实现自定义的文档解析服务。该功能只是 Demo 阶段,后期配置模式和交互规则会发生改动。

使用教程

1. 按照 Marker

参考文档 Marker 安装教程,安装 Marker 模型。封装的 API 已经适配了 FastGPT 自定义解析服务。

这里介绍快速 Docker 安装的方法:

+  docker pull crpi-h3snc261q1dosroc.cn-hangzhou.personal.cr.aliyuncs.com/marker11/marker_images:latest
+docker run --gpus all -itd -p 7231:7231 --name model_pdf_v1 crpi-h3snc261q1dosroc.cn-hangzhou.personal.cr.aliyuncs.com/marker11/marker_images:latest
+  

2. 添加 FastGPT 环境变量

+  CUSTOM_READ_FILE_URL=http://xxxx.com/v1/parse/file
+CUSTOM_READ_FILE_EXTENSION=pdf
+  
  • CUSTOM_READ_FILE_URL - 自定义解析服务的地址, host改成解析服务的访问地址,path 不能变动。
  • CUSTOM_READ_FILE_EXTENSION - 支持的文件后缀,多个文件类型,可用逗号隔开。

3. 测试效果

通过知识库上传一个 pdf 文件,并确认上传,可以在日志中看到 LOG (LOG_LEVEL需要设置 info 或者 debug):

+  [Info] 2024-12-05 15:04:42 Parsing files from an external service 
+[Info] 2024-12-05 15:07:08 Custom file parsing is complete, time: 1316ms 
+  

然后你就可以发现,通过 Marker 解析出来的 pdf 会携带图片链接:

alt text

效果展示

以清华的 ChatDev Communicative Agents for Software Develop.pdf 为例,展示 Marker 解析的效果:

alt textalt textalt text
alt textalt textalt text

上图是分块后的结果,下图是 pdf 原文。整体图片、公式、表格都可以提取出来,效果还是杠杠的。

不过要注意的是,Marker 的协议是GPL-3.0 license,请在遵守协议的前提下使用。

+ + + + \ No newline at end of file diff --git a/docs/development/custom-models/xinference/index.html b/docs/development/custom-models/xinference/index.html new file mode 100644 index 000000000000..38f9f1ec86b3 --- /dev/null +++ b/docs/development/custom-models/xinference/index.html @@ -0,0 +1,96 @@ +使用 Xinference 接入本地模型 | FastGPT
+
api

使用 Xinference 接入本地模型

一站式本地 LLM 私有化部署

Xinference 是一款开源模型推理平台,除了支持 LLM,它还可以部署 Embedding 和 ReRank 模型,这在企业级 RAG 构建中非常关键。同时,Xinference 还提供 Function Calling 等高级功能。还支持分布式部署,也就是说,随着未来应用调用量的增长,它可以进行水平扩展。

安装 Xinference

Xinference 支持多种推理引擎作为后端,以满足不同场景下部署大模型的需要,下面会分使用场景来介绍一下这三种推理后端,以及他们的使用方法。

1. 服务器

如果你的目标是在一台 Linux 或者 Window 服务器上部署大模型,可以选择 Transformers 或 vLLM 作为 Xinference 的推理后端:

  • Transformers:通过集成 Huggingface 的 Transformers 库作为后端,Xinference 可以最快地 集成当今自然语言处理(NLP)领域的最前沿模型(自然也包括 LLM)。
  • vLLM: vLLM 是由加州大学伯克利分校开发的一个开源库,专为高效服务大型语言模型(LLM)而设计。它引入了 PagedAttention 算法, 通过有效管理注意力键和值来改善内存管理,吞吐量能够达到 Transformers 的 24 倍,因此 vLLM 适合在生产环境中使用,应对高并发的用户访问。

假设你服务器配备 NVIDIA 显卡,可以参考这篇文章中的指令来安装 CUDA,从而让 Xinference 最大限度地利用显卡的加速功能。

Docker 部署

你可以使用 Xinference 官方的 Docker 镜像来一键安装和启动 Xinference 服务(确保你的机器上已经安装了 Docker),命令如下:

+  docker run  -p 9997:9997 --gpus all xprobe/xinference:latest xinference-local -H 0.0.0.0
+  

直接部署

首先我们需要准备一个 3.9 以上的 Python 环境运行来 Xinference,建议先根据 conda 官网文档安装 conda。 然后使用以下命令来创建 3.11 的 Python 环境:

+  conda create --name py311 python=3.11
+conda activate py311
+  

以下两条命令在安装 Xinference 时,将安装 Transformers 和 vLLM 作为 Xinference 的推理引擎后端:

+  pip install "xinference[transformers]"
+pip install "xinference[vllm]"
+pip install "xinference[transformers,vllm]" # 同时安装
+  

PyPi 在 安装 Transformers 和 vLLM 时会自动安装 PyTorch,但自动安装的 CUDA 版本可能与你的环境不匹配,此时你可以根据 PyTorch 官网中的安装指南来手动安装。

只需要输入如下命令,就可以在服务上启动 Xinference 服务:

+  xinference-local -H 0.0.0.0
+  

Xinference 默认会在本地启动服务,端口默认为 9997。因为这里配置了-H 0.0.0.0参数,非本地客户端也可以通过机器的 IP 地址来访问 Xinference 服务。

2. 个人设备

如果你想在自己的 Macbook 或者个人电脑上部署大模型,推荐安装 CTransformers 作为 Xinference 的推理后端。CTransformers 是用 GGML 实现的 C++ 版本 Transformers。

GGML 是一个能让大语言模型在消费级硬件上运行的 C++ 库。 GGML 最大的特色在于模型量化。量化一个大语言模型其实就是降低权重表示精度的过程,从而减少使用模型所需的资源。 例如,表示一个高精度浮点数(例如 0.0001)比表示一个低精度浮点数(例如 0.1)需要更多空间。由于 LLM 在推理时需要加载到内存中的,因此你需要花费硬盘空间来存储它们,并且在执行期间有足够大的 RAM 来加载它们,GGML 支持许多不同的量化策略,每种策略在效率和性能之间提供不同的权衡。

通过以下命令来安装 CTransformers 作为 Xinference 的推理后端:

+  pip install xinference
+pip install ctransformers
+  

因为 GGML 是一个 C++ 库,Xinference 通过 llama-cpp-python 这个库来实现语言绑定。对于不同的硬件平台,我们需要使用不同的编译参数来安装:

  • Apple Metal(MPS):CMAKE_ARGS="-DLLAMA_METAL=on" pip install llama-cpp-python
  • Nvidia GPU:CMAKE_ARGS="-DLLAMA_CUBLAS=on" pip install llama-cpp-python
  • AMD GPU:CMAKE_ARGS="-DLLAMA_HIPBLAS=on" pip install llama-cpp-python

安装后只需要输入 xinference-local,就可以在你的 Mac 上启动 Xinference 服务。

创建并部署模型(以 Qwen-14B 模型为例)

1. WebUI 方式启动模型

Xinference 启动之后,在浏览器中输入: http://127.0.0.1:9997,我们可以访问到本地 Xinference 的 Web UI。

打开“Launch Model”标签,搜索到 qwen-chat,选择模型启动的相关参数,然后点击模型卡片左下方的小火箭🚀按钮,就可以部署该模型到 Xinference。 默认 Model UID 是 qwen-chat(后续通过将通过这个 ID 来访问模型)。

当你第一次启动 Qwen 模型时,Xinference 会从 HuggingFace 下载模型参数,大概需要几分钟的时间。Xinference 将模型文件缓存在本地,这样之后启动时就不需要重新下载了。 Xinference 还支持从其他模型站点下载模型文件,例如 modelscope

2. 命令行方式启动模型

我们也可以使用 Xinference 的命令行工具来启动模型,默认 Model UID 是 qwen-chat(后续通过将通过这个 ID 来访问模型)。

+  xinference launch -n qwen-chat -s 14 -f pytorch
+  

除了 WebUI 和命令行工具, Xinference 还提供了 Python SDK 和 RESTful API 等多种交互方式, 更多用法可以参考 Xinference 官方文档

将本地模型接入 One API

One API 的部署和接入请参考这里

为 qwen1.5-chat 添加一个渠道,这里的 Base URL 需要填 Xinference 服务的端点,并且注册 qwen-chat (模型的 UID) 。

可以使用以下命令进行测试:

+  curl --location --request POST 'https://<oneapi_url>/v1/chat/completions' \
+--header 'Authorization: Bearer <oneapi_token>' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+  "model": "qwen-chat",
+  "messages": [{"role": "user", "content": "Hello!"}]
+}'
+  

将 <oneapi_url> 替换为你的 One API 地址,<oneapi_token> 替换为你的 One API 令牌。model 为刚刚在 One API 填写的自定义模型。

将本地模型接入 FastGPT

修改 FastGPT 的 config.json 配置文件的 llmModels 部分加入 qwen-chat 模型:

+  ...
+  "llmModels": [
+    {
+      "model": "qwen-chat", // 模型名(对应OneAPI中渠道的模型名)
+      "name": "Qwen", // 模型别名
+      "avatar": "/imgs/model/Qwen.svg", // 模型的logo
+      "maxContext": 125000, // 最大上下文
+      "maxResponse": 4000, // 最大回复
+      "quoteMaxToken": 120000, // 最大引用内容
+      "maxTemperature": 1.2, // 最大温度
+      "charsPointsPrice": 0, // n积分/1k token(商业版)
+      "censor": false, // 是否开启敏感校验(商业版)
+      "vision": true, // 是否支持图片输入
+      "datasetProcess": true, // 是否设置为知识库处理模型(QA),务必保证至少有一个为true,否则知识库会报错
+      "usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true)
+      "usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true)
+      "usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true)
+      "usedInQueryExtension": true, // 是否用于问题优化(务必保证至少有一个为true)
+      "toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。)
+      "functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式)
+      "customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
+      "customExtractPrompt": "", // 自定义内容提取提示词
+      "defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
+      "defaultConfig": {} // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
+    }
+  ],
+...
+  

然后重启 FastGPT 就可以在应用配置中选择 Qwen 模型进行对话:


+ + + + \ No newline at end of file diff --git a/docs/development/design/dataset/index.html b/docs/development/design/dataset/index.html new file mode 100644 index 000000000000..cbdb5fa383ce --- /dev/null +++ b/docs/development/design/dataset/index.html @@ -0,0 +1,44 @@ +数据集 | FastGPT
+
dataset

数据集

FastGPT 数据集中文件与数据的设计方案

文件与数据的关系

在 FastGPT 中,文件会通过 MongoDB 的 FS 存储,而具体的数据会通过 PostgreSQL 存储,PG 中的数据会有一列 file_id,关联对应的文件。考虑到旧版本的兼容,以及手动输入、标注数据等,我们给 file_id 增加了一些特殊的值,如下:

  • manual: 手动输入
  • mark: 手动标注的数据

注意,file_id 仅在插入数据时会写入,变更时无法修改。

文件导入流程

  1. 上传文件到 MongoDB 的 FS 中,获取 file_id,此时文件标记为 unused 状态
  2. 浏览器解析文件,获取对应的文本和 chunk
  3. 给每个 chunk 打上 file_id
  4. 点击上传数据:将文件的状态改为 used,并将数据推送到 mongo training 表中等待训练
  5. 由训练线程从 mongo 中取数据,并在获取向量后插入到 pg。
+ + + + \ No newline at end of file diff --git a/docs/development/design/index.html b/docs/development/design/index.html new file mode 100644 index 000000000000..4fe121816f8a --- /dev/null +++ b/docs/development/design/index.html @@ -0,0 +1,44 @@ +设计方案 | FastGPT
+
设计方案
public

设计方案

FastGPT 部分设计方案


+ + + + \ No newline at end of file diff --git a/docs/development/design/index.xml b/docs/development/design/index.xml new file mode 100644 index 000000000000..6290a72c7783 --- /dev/null +++ b/docs/development/design/index.xml @@ -0,0 +1,3 @@ +设计方案 on FastGPThttps://doc.tryfastgpt.ai/docs/development/design/Recent content in 设计方案 on FastGPTHugo -- gohugo.iozh-cn数据集https://doc.tryfastgpt.ai/docs/development/design/dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/design/dataset/文件与数据的关系 link在 FastGPT 中,文件会通过 MongoDB 的 FS 存储,而具体的数据会通过 PostgreSQL 存储,PG 中的数据会有一列 file_id,关联对应的文件。考虑到旧版本的兼容,以及手动输入、标注数据等,我们给 file_id 增加了一些特殊的值,如下: +manual: 手动输入 mark: 手动标注的数据 注意,file_id 仅在插入数据时会写入,变更时无法修改。 +文件导入流程 link 上传文件到 MongoDB 的 FS 中,获取 file_id,此时文件标记为 unused 状态 浏览器解析文件,获取对应的文本和 chunk 给每个 chunk 打上 file_id 点击上传数据:将文件的状态改为 used,并将数据推送到 mongo training 表中等待训练 由训练线程从 mongo 中取数据,并在获取向量后插入到 pg。 \ No newline at end of file diff --git a/docs/development/docker/index.html b/docs/development/docker/index.html new file mode 100644 index 000000000000..65251864290d --- /dev/null +++ b/docs/development/docker/index.html @@ -0,0 +1,133 @@ +Docker Compose 快速部署 | FastGPT
+
article

Docker Compose 快速部署

使用 Docker Compose 快速部署 FastGPT

部署架构图

推荐配置

PgVector版本

体验测试首选

环境最低配置(单节点)推荐配置
测试2c2g2c4g
100w 组向量4c8g 50GB4c16g 50GB
500w 组向量8c32g 200GB16c64g 200GB

Milvus版本

生产部署首选,对于千万级以上向量性能更优秀。

点击查看 Milvus 官方推荐配置

环境最低配置(单节点)推荐配置
测试2c8g4c16g
100w 组向量未测试
500w 组向量

zilliz cloud版本

Milvus 的全托管服务,性能优于 Milvus 并提供 SLA,点击使用 Zilliz Cloud

由于向量库使用了 Cloud,无需占用本地资源,无需太关注。

前置工作

1. 确保网络环境

如果使用OpenAI等国外模型接口,请确保可以正常访问,否则会报错:Connection error 等。 方案可以参考:代理方案

2. 准备 Docker 环境

开始部署

1. 下载 docker-compose.yml

非 Linux 环境或无法访问外网环境,可手动创建一个目录,并下载配置文件和对应版本的docker-compose.yml,在这个文件夹中依据下载的配置文件运行docker,若作为本地开发使用推荐docker-compose-pgvector版本,并且自行拉取并运行sandboxfastgpt,并在docker配置文件中注释掉sandboxfastgpt的部分

Linux 快速脚本

+  mkdir fastgpt
+cd fastgpt
+curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
+
+# pgvector 版本(测试推荐,简单快捷)
+curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-pgvector.yml
+# milvus 版本
+# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml
+# zilliz 版本
+# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml
+  

2. 修改环境变量

找到 yml 文件中,fastgpt 容器的环境变量进行下面操作:

3. 启动容器

在 docker-compose.yml 同级目录下执行。请确保docker-compose版本最好在2.17以上,否则可能无法执行自动化命令。

+  # 启动容器
+docker-compose up -d
+# 等待10s,OneAPI第一次总是要重启几次才能连上Mysql
+sleep 10
+# 重启一次oneapi(由于OneAPI的默认Key有点问题,不重启的话会提示找不到渠道,临时手动重启一次解决,等待作者修复)
+docker restart oneapi
+  

4. 打开 OneAPI 添加模型

可以通过ip:3001访问OneAPI,默认账号为root密码为123456

在OneApi中添加合适的AI模型渠道。点击查看相关教程

5. 访问 FastGPT

目前可以通过 ip:3000 直接访问(注意防火墙)。登录用户名为 root,密码为docker-compose.yml环境变量里设置的 DEFAULT_ROOT_PSW

如果需要域名访问,请自行安装并配置 Nginx。

首次运行,会自动初始化 root 用户,密码为 1234(与环境变量中的DEFAULT_ROOT_PSW一致),日志里会提示一次MongoServerError: Unable to read from a snapshot due to pending collection catalog changes;可忽略。

FAQ

Mongo 副本集自动初始化失败

最新的 docker-compose 示例优化 Mongo 副本集初始化,实现了全自动。目前在 unbuntu20,22 centos7, wsl2, mac, window 均通过测试。仍无法正常启动,大部分是因为 cpu 不支持 AVX 指令集,可以切换 Mongo4.x 版本。

如果是由于,无法自动初始化副本集合,可以手动初始化副本集:

  1. 终端中执行下面命令,创建mongo密钥:
+  openssl rand -base64 756 > ./mongodb.key
+chmod 600 ./mongodb.key
+# 修改密钥权限,部分系统是admin,部分是root
+chown 999:root ./mongodb.key
+  
  1. 修改 docker-compose.yml,挂载密钥
+  mongo:
+  #  image: mongo:5.0.18
+  # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
+  container_name: mongo
+  ports:
+    - 27017:27017
+  networks:
+    - fastgpt
+  command: mongod --keyFile /data/mongodb.key --replSet rs0
+  environment:
+    # 默认的用户名和密码,只有首次允许有效
+    - MONGO_INITDB_ROOT_USERNAME=myusername
+    - MONGO_INITDB_ROOT_PASSWORD=mypassword
+  volumes:
+    - ./mongo/data:/data/db
+    - ./mongodb.key:/data/mongodb.key
+  
  1. 重启服务
+  docker-compose down
+docker-compose up -d
+  
  1. 进入容器执行副本集合初始化
+  # 查看 mongo 容器是否正常运行
+docker ps 
+# 进入容器
+docker exec -it mongo bash
+
+# 连接数据库(这里要填Mongo的用户名和密码)
+mongo -u myusername -p mypassword --authenticationDatabase admin
+
+# 初始化副本集。如果需要外网访问,mongo:27017 。如果需要外网访问,需要增加Mongo连接参数:directConnection=true
+rs.initiate({
+  _id: "rs0",
+  members: [
+    { _id: 0, host: "mongo:27017" }
+  ]
+})
+# 检查状态。如果提示 rs0 状态,则代表运行成功
+rs.status()
+  

如何修改API地址和密钥

默认是写了OneAPi的连接地址和密钥,可以通过修改docker-compose.yml中,fastgpt容器的环境变量实现。

OPENAI_BASE_URL(API 接口的地址,需要加/v1) +CHAT_API_KEY(API 接口的凭证)。

修改完后重启:

+  docker-compose down
+docker-compose up -d
+  

如何更新版本?

  1. 查看更新文档,确认要升级的版本,避免跨版本升级。

  2. 修改镜像 tag 到指定版本

  3. 执行下面命令会自动拉取镜像:

    +  docker-compose pull
    +docker-compose up -d
    +  
  4. 执行初始化脚本(如果有)

如何自定义配置文件?

修改config.json文件,并执行docker-compose down再执行docker-compose up -d重起容器。具体配置,参考配置详解

如何检查自定义配置文件是否挂载

  1. docker logs fastgpt 可以查看日志,在启动容器后,第一次请求网页,会进行配置文件读取,可以看看有没有读取成功以及有无错误日志。
  2. docker exec -it fastgpt sh 进入 FastGPT 容器,可以通过ls data查看目录下是否成功挂载config.json文件。可通过cat data/config.json查看配置文件。

可能不生效的原因

  1. 挂载目录不正确
  2. 配置文件不正确,日志中会提示invalid json,配置文件需要是标准的 JSON 文件。
  3. 修改后,没有docker-compose downdocker-compose up -d,restart是不会重新挂载文件的。

如何检查环境变量是否正常加载

  1. docker exec -it fastgpt sh 进入 FastGPT 容器。
  2. 直接输入env命令查看所有环境变量。

为什么无法连接本地模型镜像

docker-compose.yml中使用了桥接的模式建立了fastgpt网络,如想通过0.0.0.0或镜像名访问其它镜像,需将其它镜像也加入到网络中。

端口冲突怎么解决?

docker-compose 端口定义为:映射端口:运行端口

桥接模式下,容器运行端口不会有冲突,但是会有映射端口冲突,只需将映射端口修改成不同端口即可。

如果容器1需要连接容器2,使用容器2:运行端口来进行连接即可。

(自行补习 docker 基本知识)

relation “modeldata” does not exist

PG 数据库没有连接上/初始化失败,可以查看日志。FastGPT 会在每次连接上 PG 时进行表初始化,如果报错会有对应日志。

  1. 检查数据库容器是否正常启动
  2. 非 docker 部署的,需要手动安装 pg vector 插件
  3. 查看 fastgpt 日志,有没有相关报错

Illegal instruction

可能原因:

  1. arm架构。需要使用 Mongo 官方镜像: mongo:5.0.18
  2. cpu 不支持 AVX,无法用 mongo5,需要换成 mongo4.x。把 mongo 的 image 换成: mongo:4.4.29

Operation auth_codes.findOne() buffering timed out after 10000ms

mongo连接失败,查看mongo的运行状态对应日志

可能原因:

  1. mongo 服务有没有起来(有些 cpu 不支持 AVX,无法用 mongo5,需要换成 mongo4.x,可以docker hub找个最新的4.x,修改镜像版本,重新运行)
  2. 连接数据库的环境变量填写错误(账号密码,注意host和port,非容器网络连接,需要用公网ip并加上 directConnection=true)
  3. 副本集启动失败。导致容器一直重启。
  4. Illegal instruction.... Waiting for MongoDB to start: cpu 不支持 AVX,无法用 mongo5,需要换成 mongo4.x

首次部署,root用户提示未注册

日志会有错误提示。大概率是没有启动 Mongo 副本集模式。

无法导出知识库、无法使用语音输入/播报

没配置 SSL 证书,无权使用部分功能。

登录提示 Network Error

由于服务初始化错误,系统重启导致。

  • 90%是由于配置文件写不对,导致 JSON 解析报错
  • 剩下的基本是因为向量数据库连不上

如何修改密码

修改docker-compose.yml文件中DEFAULT_ROOT_PSW并重启即可,密码会自动更新。

+ + + + \ No newline at end of file diff --git a/docs/development/faq/index.html b/docs/development/faq/index.html new file mode 100644 index 000000000000..336fd808c805 --- /dev/null +++ b/docs/development/faq/index.html @@ -0,0 +1,191 @@ +私有部署常见问题 | FastGPT
+
upgrade

私有部署常见问题

FastGPT 私有部署常见问题

一、错误排查方式

遇到问题先按下面方式排查。

  1. docker ps -a 查看所有容器运行状态,检查是否全部 running,如有异常,尝试docker logs 容器名查看对应日志。
  2. 容器都运行正常的,docker logs 容器名 查看报错日志
  3. 带有requestId的,都是 OneAPI 提示错误,大部分都是因为模型接口报错。
  4. 无法解决时,可以找找Issue,或新提 Issue,私有部署错误,务必提供详细的日志,否则很难排查。

二、通用问题

本地部署的限制

具体内容参考https://fael3z0zfze.feishu.cn/wiki/OFpAw8XzAi36Guk8dfucrCKUnjg。

能否纯本地运行

可以。需要准备好向量模型和LLM模型。

其他模型没法进行问题分类/内容提取

  1. 看日志。如果提示 JSON invalid,not support tool 之类的,说明该模型不支持工具调用或函数调用,需要设置toolChoice=falsefunctionCall=false,就会默认走提示词模式。目前内置提示词仅针对了商业模型API进行测试。问题分类基本可用,内容提取不太行。
  2. 如果已经配置正常,并且没有错误日志,则说明可能提示词不太适合该模型,可以通过修改customCQPrompt来自定义提示词。

页面崩溃

  1. 关闭翻译
  2. 检查配置文件是否正常加载,如果没有正常加载会导致缺失系统信息,在某些操作下会导致空指针。
  • 95%情况是配置文件不对。会提示 xxx undefined
  • 提示URI malformed,请 Issue 反馈具体操作和页面,这是由于特殊字符串编码解析报错。
  1. 某些api不兼容问题(较少)

开启内容补全后,响应速度变慢

  1. 问题补全需要经过一轮AI生成。
  2. 会进行3~5轮的查询,如果数据库性能不足,会有明显影响。

对话接口报错或返回为空(core.chat.Chat API is error or undefined)

  1. 检查 AI 的 key 问题:通过 curl 请求看是否正常。务必用 stream=true 模式。并且 maxToken 等相关参数尽量一致。
  2. 如果是国内模型,可能是命中风控了。
  3. 查看模型请求日志,检查出入参数是否异常。
+  # curl 例子。
+curl --location --request POST 'https://xxx.cn/v1/chat/completions' \
+--header 'Authorization: Bearer sk-xxxx' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+  "model": "gpt-3.5-turbo",
+  "stream": true,
+  "temperature": 1,
+  "max_tokens": 3000,
+  "messages": [
+    {
+      "role": "user",
+      "content": "你是谁"
+    }
+  ]
+}'
+  

页面中可以正常回复,API 报错

页面中是用 stream=true 模式,所以API也需要设置 stream=true 来进行测试。部分模型接口(国产居多)非 Stream 的兼容有点垃圾。 +和上一个问题一样,curl 测试。

知识库索引没有进度/索引很慢

先看日志报错信息。有以下几种情况:

  1. 可以对话,但是索引没有进度:没有配置向量模型(vectorModels)
  2. 不能对话,也不能索引:API调用失败。可能是没连上OneAPI或OpenAI
  3. 有进度,但是非常慢:api key不行,OpenAI的免费号,一分钟只有3次还是60次。一天上限200次。

Connection error

网络异常。国内服务器无法请求OpenAI,自行检查与AI模型的连接是否正常。

或者是FastGPT请求不到 OneAPI(没放同一个网络)

修改了 vectorModels 但是没有生效

  1. 重启容器,确保模型配置已经加载(可以在日志或者新建知识库时候看到新模型)
  2. 记得刷新一次浏览器。
  3. 如果是已经创建的知识库,需要删除重建。向量模型是创建时候绑定的,不会动态更新。

三、常见的 OneAPI 错误

带有 requestId 的都是 OneAPI 的报错。

insufficient_user_quota user quota is not enough

OneAPI 账号的余额不足,默认 root 用户只有 200 刀,可以手动修改。

路径:打开OneAPI -> 用户 -> root用户右边的编辑 -> 剩余余额调大

xxx渠道找不到

FastGPT 模型配置文件中的 model 必须与 OneAPI 渠道中的模型对应上,否则就会提示这个错误。可检查下面内容:

  1. OneAPI 中没有配置该模型渠道,或者被禁用了。
  2. FastGPT 配置文件有 OneAPI 没有配置的模型。如果 OneAPI 没有配置对应模型的,配置文件中也不要写。
  3. 使用旧的向量模型创建了知识库,后又更新了向量模型。这时候需要删除以前的知识库,重建。

如果OneAPI中,没有配置对应的模型,config.json中也不要配置,否则容易报错。

Incorrect API key provided: sk-xxxx.You can find your api Key at xxx

OneAPI 的 API Key 配置错误,需要修改OPENAI_API_KEY环境变量,并重启容器(先 docker-compose down 然后再 docker-compose up -d 运行一次)。

可以exec进入容器,env查看环境变量是否生效。

bad_response_status_code bad response status code 503

  1. 模型服务不可用
  2. 模型接口参数异常(温度、max token等可能不适配)
  3. ….

四、常见模型问题

报错 - 模型响应为空/模型报错

该错误是由于 stream 模式下,oneapi 直接结束了流请求,并且未返回任何内容导致。

4.8.10 版本新增了错误日志,报错时,会在日志中打印出实际发送的 Body 参数,可以复制该参数后,通过 curl 向 oneapi 发起请求测试。

由于 oneapi 在 stream 模式下,无法正确捕获错误,有时候可以设置成 stream=false 来获取到精确的错误。

可能的报错问题:

  1. 国内模型命中风控
  2. 不支持的模型参数:只保留 messages 和必要参数来测试,删除其他参数测试。
  3. 参数不符合模型要求:例如有的模型 temperature 不支持 0,有些不支持两位小数。max_tokens 超出,上下文超长等。
  4. 模型部署有问题,stream 模式不兼容。

测试示例如下,可复制报错日志中的请求体进行测试:

+  curl --location --request POST 'https://api.openai.com/v1/chat/completions' \
+--header 'Authorization: Bearer sk-xxxx' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+  "model": "xxx",
+  "temperature": 0.01,
+  "max_tokens": 1000,
+  "stream": true,
+  "messages": [
+    {
+      "role": "user",
+      "content": " 你是饿"
+    }
+  ]
+}'
+  

如何测试模型是否支持工具调用

需要模型提供商和 oneapi 同时支持工具调用才可使用,测试方法如下:

  1. 通过 curloneapi 发起第一轮 stream 模式的 tool 测试。
+  curl --location --request POST 'https://oneapi.xxx/v1/chat/completions' \
+--header 'Authorization: Bearer sk-xxxx' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+  "model": "gpt-4o-mini",
+  "temperature": 0.01,
+  "max_tokens": 8000,
+  "stream": true,
+  "messages": [
+    {
+      "role": "user",
+      "content": "几点了"
+    }
+  ],
+  "tools": [
+    {
+      "type": "function",
+      "function": {
+        "name": "hCVbIY",
+        "description": "获取用户当前时区的时间。",
+        "parameters": {
+          "type": "object",
+          "properties": {},
+          "required": []
+        }
+      }
+    }
+  ],
+  "tool_choice": "auto"
+}'
+  
  1. 检查响应参数

如果能正常调用工具,会返回对应 tool_calls 参数。

+  {
+    "id": "chatcmpl-A7kwo1rZ3OHYSeIFgfWYxu8X2koN3",
+    "object": "chat.completion.chunk",
+    "created": 1726412126,
+    "model": "gpt-4o-mini-2024-07-18",
+    "system_fingerprint": "fp_483d39d857",
+    "choices": [
+        {
+            "index": 0,
+            "delta": {
+                "role": "assistant",
+                "content": null,
+                "tool_calls": [
+                    {
+                        "index": 0,
+                        "id": "call_0n24eiFk8OUyIyrdEbLdirU7",
+                        "type": "function",
+                        "function": {
+                            "name": "mEYIcFl84rYC",
+                            "arguments": ""
+                        }
+                    }
+                ],
+                "refusal": null
+            },
+            "logprobs": null,
+            "finish_reason": null
+        }
+    ],
+    "usage": null
+}
+  
  1. 通过 curloneapi 发起第二轮 stream 模式的 tool 测试。

第二轮请求是把工具结果发送给模型。发起后会得到模型回答的结果。

+  curl --location --request POST 'https://oneapi.xxxx/v1/chat/completions' \
+--header 'Authorization: Bearer sk-xxx' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+  "model": "gpt-4o-mini",
+  "temperature": 0.01,
+  "max_tokens": 8000,
+  "stream": true,
+  "messages": [
+    {
+      "role": "user",
+      "content": "几点了"
+    },
+    {
+      "role": "assistant",
+      "tool_calls": [
+        {
+          "id": "kDia9S19c4RO",
+          "type": "function",
+          "function": {
+            "name": "hCVbIY",
+            "arguments": "{}"
+          }
+        }
+      ]
+    },
+    {
+      "tool_call_id": "kDia9S19c4RO",
+      "role": "tool",
+      "name": "hCVbIY",
+      "content": "{\n  \"time\": \"2024-09-14 22:59:21 Sunday\"\n}"
+    }
+  ],
+  "tools": [
+    {
+      "type": "function",
+      "function": {
+        "name": "hCVbIY",
+        "description": "获取用户当前时区的时间。",
+        "parameters": {
+          "type": "object",
+          "properties": {},
+          "required": []
+        }
+      }
+    }
+  ],
+  "tool_choice": "auto"
+}'
+  
+ + + + \ No newline at end of file diff --git a/docs/development/index.html b/docs/development/index.html new file mode 100644 index 000000000000..743ed49427b8 --- /dev/null +++ b/docs/development/index.html @@ -0,0 +1,51 @@ +开发与部署指南 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/development/index.xml b/docs/development/index.xml new file mode 100644 index 000000000000..ba22fb9593f5 --- /dev/null +++ b/docs/development/index.xml @@ -0,0 +1,37 @@ +开发与部署指南 on FastGPThttps://doc.tryfastgpt.ai/docs/development/Recent content in 开发与部署指南 on FastGPTHugo -- gohugo.iozh-cn快速开始本地开发https://doc.tryfastgpt.ai/docs/development/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/intro/本文档介绍了如何设置开发环境以构建和测试 FastGPT,。 +前置依赖项 link您需要在计算机上安装和配置以下依赖项才能构建 FastGPT: +Git Docker(构建镜像) Node.js v18.17 / v20.x(版本尽量一样,可以使用nvm管理node版本) pnpm 版本 8.6.0 (目前官方的开发环境) make命令: 根据不同平台,百度安装 (官方是GNU Make 4.3) 开始本地开发 link check_circle 用户默认的时区为 Asia/Shanghai,非 linux 环境时候,获取系统时间会异常,本地开发时候,可以将用户的时区调整成 UTC(+0)。 建议先服务器装好数据库,再进行本地开发。 1. Fork 存储库 link您需要 Fork 存储库。 +2. 克隆存储库 link克隆您在 GitHub 上 Fork 的存储库: +git clone git@github.com:&lt;github_username&gt;/FastGPT.git 目录简要说明 +projects 目录下为 FastGPT 应用代码。其中 app 为 FastGPT 核心应用。(后续可能会引入其他应用) NextJS 框架前后端放在一起,API 服务位于 src/pages/api 目录内。 packages 目录为共用代码,通过 workspace 被注入到 projects 中,已配置 monorepo 自动注入,无需额外打包。 3. 安装数据库 link第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践,或者新建文件夹并配置相关文件用以运行docker。数据库部署教程:Docker 快速部署。部署完了,可以本地访问其数据库。Sealos 一键部署https://doc.tryfastgpt.ai/docs/development/sealos/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/sealos/部署架构图 link 多模型支持 linkFastGPT 使用了 one-api 项目来管理模型池,其可以兼容 OpenAI 、Azure 、国内主流模型和本地模型等。 +可参考:Sealos 快速部署 OneAPI +一键部署 link使用 Sealos 服务,无需采购服务器、无需域名,支持高并发 &amp; 动态伸缩,并且数据库应用采用 kubeblocks 的数据库,在 IO 性能方面,远超于简单的 Docker 容器部署。可以根据需求,再下面两个区域选择部署。 +新加坡区 link新加披区的服务器在国外,可以直接访问 OpenAI,但国内用户需要梯子才可以正常访问新加坡区。国际区价格稍贵,点击下面按键即可部署👇 +北京区 link北京区服务提供商为火山云,国内用户可以稳定访问,但无法访问 OpenAI 等境外服务,价格约为新加坡区的 1/4。点击下面按键即可部署👇 +开始部署 link由于需要部署数据库,部署完后需要等待 2~4 分钟才能正常访问。默认用了最低配置,首次访问时会有些慢。 +根据提示,输入root_password,和 openai/oneapi 的地址和密钥。 +点击部署后,会跳转到应用管理页面。可以点击fastgpt主应用右侧的详情按键(名字为 fastgpt-xxxx), 如下图所示。 +点击详情后,会跳转到 fastgpt 的部署管理页面,点击外网访问地址中的链接,即可打开 fastgpt 服务。 +如需绑定自定义域名、修改部署参数,可以点击右上角变更,根据 sealos 的指引完成。 +登录 link用户名:root +密码是刚刚一键部署时设置的root_password +修改配置文件和环境变量 link在 Sealos 中,你可以打开应用管理(App Launchpad)看到部署的 FastGPT,可以打开数据库(Database)看到对应的数据库。 +在应用管理中,选中 FastGPT,点击变更,可以看到对应的环境变量和配置文件。 +🤖 +在 Sealos 上,FastGPT 一共运行了 1 个服务和 2 个数据库,如暂停和删除请注意数据库一同操作。(你可以白天启动,晚上暂停它们,省钱大法)Docker Compose 快速部署https://doc.tryfastgpt.ai/docs/development/docker/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/docker/部署架构图 link 🤖 +MongoDB:用于存储除了向量外的各类数据 +PostgreSQL/Milvus:存储向量数据 +OneAPI: 聚合各类 AI API,支持多模型调用 (任何模型问题,先自行通过 OneAPI 测试校验) +推荐配置 linkPgVector版本 link体验测试首选 +环境 最低配置(单节点) 推荐配置 测试 2c2g 2c4g 100w 组向量 4c8g 50GB 4c16g 50GB 500w 组向量 8c32g 200GB 16c64g 200GB Milvus版本 link生产部署首选,对于千万级以上向量性能更优秀。 +点击查看 Milvus 官方推荐配置 +环境 最低配置(单节点) 推荐配置 测试 2c8g 4c16g 100w 组向量 未测试 500w 组向量 zilliz cloud版本 linkMilvus 的全托管服务,性能优于 Milvus 并提供 SLA,点击使用 Zilliz Cloud。 +由于向量库使用了 Cloud,无需占用本地资源,无需太关注。 +前置工作 link1. 确保网络环境 link如果使用OpenAI等国外模型接口,请确保可以正常访问,否则会报错:Connection error 等。 方案可以参考:代理方案 +2. 准备 Docker 环境 link Linux MacOS Windows # 安装 Docker curl -fsSL https://get.配置文件介绍https://doc.tryfastgpt.ai/docs/development/configuration/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/configuration/由于环境变量不利于配置复杂的内容,新版 FastGPT 采用了 ConfigMap 的形式挂载配置文件,你可以在 projects/app/data/config.json 看到默认的配置文件。可以参考 docker-compose 快速部署 来挂载配置文件。 +开发环境下,你需要将示例配置文件 config.json 复制成 config.local.json 文件才会生效。 +这个配置文件中包含了系统参数和各个模型配置: +4.6.8+ 版本新配置文件示例 link { &#34;feConfigs&#34;: { &#34;lafEnv&#34;: &#34;https://laf.dev&#34; // laf环境。 https://laf.run (杭州阿里云) ,或者私有化的laf环境。如果使用 Laf openapi 功能,需要最新版的 laf 。 }, &#34;systemEnv&#34;: { &#34;vectorMaxProcess&#34;: 15, // 向量处理线程数量 &#34;qaMaxProcess&#34;: 15, // 问答拆分线程数量 &#34;tokenWorkers&#34;: 50, // Token 计算线程保持数,会持续占用内存,不能设置太大。 &#34;pgHNSWEfSearch&#34;: 100 // 向量搜索参数。越大,搜索越精确,但是速度越慢。设置为100,有99%&#43;精度。 }, &#34;llmModels&#34;: [ { &#34;provider&#34;: &#34;OpenAI&#34;, // 模型提供商,主要用于分类展示,目前已经内置提供商包括:https://github.com/labring/FastGPT/blob/main/packages/global/core/ai/provider.ts, 可 pr 提供新的提供商,或直接填写 Other &#34;model&#34;: &#34;gpt-4o-mini&#34;, // 模型名(对应OneAPI中渠道的模型名) &#34;name&#34;: &#34;gpt-4o-mini&#34;, // 模型别名 &#34;maxContext&#34;: 125000, // 最大上下文 &#34;maxResponse&#34;: 16000, // 最大回复 &#34;quoteMaxToken&#34;: 120000, // 最大引用内容 &#34;maxTemperature&#34;: 1.私有部署常见问题https://doc.tryfastgpt.ai/docs/development/faq/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/faq/一、错误排查方式 link遇到问题先按下面方式排查。 +docker ps -a 查看所有容器运行状态,检查是否全部 running,如有异常,尝试docker logs 容器名查看对应日志。 容器都运行正常的,docker logs 容器名 查看报错日志 带有requestId的,都是 OneAPI 提示错误,大部分都是因为模型接口报错。 无法解决时,可以找找Issue,或新提 Issue,私有部署错误,务必提供详细的日志,否则很难排查。 二、通用问题 link本地部署的限制 link具体内容参考https://fael3z0zfze.feishu.cn/wiki/OFpAw8XzAi36Guk8dfucrCKUnjg。 +能否纯本地运行 link可以。需要准备好向量模型和LLM模型。 +其他模型没法进行问题分类/内容提取 link 看日志。如果提示 JSON invalid,not support tool 之类的,说明该模型不支持工具调用或函数调用,需要设置toolChoice=false和functionCall=false,就会默认走提示词模式。目前内置提示词仅针对了商业模型API进行测试。问题分类基本可用,内容提取不太行。 如果已经配置正常,并且没有错误日志,则说明可能提示词不太适合该模型,可以通过修改customCQPrompt来自定义提示词。 页面崩溃 link 关闭翻译 检查配置文件是否正常加载,如果没有正常加载会导致缺失系统信息,在某些操作下会导致空指针。 95%情况是配置文件不对。会提示 xxx undefined 提示URI malformed,请 Issue 反馈具体操作和页面,这是由于特殊字符串编码解析报错。 某些api不兼容问题(较少) 开启内容补全后,响应速度变慢 link 问题补全需要经过一轮AI生成。 会进行3~5轮的查询,如果数据库性能不足,会有明显影响。 对话接口报错或返回为空(core.chat.Chat API is error or undefined) link 检查 AI 的 key 问题:通过 curl 请求看是否正常。务必用 stream=true 模式。并且 maxToken 等相关参数尽量一致。 如果是国内模型,可能是命中风控了。 查看模型请求日志,检查出入参数是否异常。 # curl 例子。 curl --location --request POST &#39;https://xxx. \ No newline at end of file diff --git a/docs/development/intro/index.html b/docs/development/intro/index.html new file mode 100644 index 000000000000..2d1cdf53dd27 --- /dev/null +++ b/docs/development/intro/index.html @@ -0,0 +1,97 @@ +快速开始本地开发 | FastGPT
+
developer_guide

快速开始本地开发

对 FastGPT 进行开发调试

本文档介绍了如何设置开发环境以构建和测试 FastGPT,。

前置依赖项

您需要在计算机上安装和配置以下依赖项才能构建 FastGPT

  • Git
  • Docker(构建镜像)
  • Node.js v18.17 / v20.x(版本尽量一样,可以使用nvm管理node版本)
  • pnpm 版本 8.6.0 (目前官方的开发环境)
  • make命令: 根据不同平台,百度安装 (官方是GNU Make 4.3)

开始本地开发

1. Fork 存储库

您需要 Fork 存储库

2. 克隆存储库

克隆您在 GitHub 上 Fork 的存储库:

+  git clone git@github.com:<github_username>/FastGPT.git
+  

目录简要说明

  1. projects 目录下为 FastGPT 应用代码。其中 app 为 FastGPT 核心应用。(后续可能会引入其他应用)
  2. NextJS 框架前后端放在一起,API 服务位于 src/pages/api 目录内。
  3. packages 目录为共用代码,通过 workspace 被注入到 projects 中,已配置 monorepo 自动注入,无需额外打包。

3. 安装数据库

第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践,或者新建文件夹并配置相关文件用以运行docker。数据库部署教程:Docker 快速部署。部署完了,可以本地访问其数据库。

4. 初始配置

以下文件均在 projects/app 路径下。

1. 环境变量

复制.env.template文件,在同级目录下生成一个.env.local 文件,修改.env.local 里内容才是有效的变量。变量说明见 .env.template,主要需要修改API_KEY和数据库的地址与端口以及数据库账号的用户名和密码,具体配置需要和docker配置文件相同,其中用户名和密码如需修改需要修改docker配置文件、数据库和.env.local文件,不能只改一处。

2. config 配置文件

复制 data/config.json 文件,生成一个 data/config.local.json 配置文件,具体配置参数说明,可参考 config 配置说明

注意:json 配置文件不能包含注释,介绍中为了方便看才加入的注释

这个文件大部分时候不需要修改。只需要关注 systemEnv 里的参数:

  • vectorMaxProcess: 向量生成最大进程,根据数据库和 key 的并发数来决定,通常单个 120 号,2c4g 服务器设置 10~15。
  • qaMaxProcess: QA 生成最大进程
  • pgHNSWEfSearch: PostgreSQL vector 索引参数,越大搜索精度越高但是速度越慢,具体可看 pgvector 官方说明。

5. 运行

可参考项目根目录下的 dev.md,第一次编译运行可能会有点慢,需要点耐心哦

+  # 给自动化脚本代码执行权限(非 linux 系统, 可以手动执行里面的 postinstall.sh 文件内容)
+chmod -R +x ./scripts/
+# 代码根目录下执行,会安装根 package、projects 和 packages 内所有依赖
+# 如果提示 isolate-vm 安装失败,可以参考:https://github.com/laverdet/isolated-vm?tab=readme-ov-file#requirements
+pnpm i
+
+# 非 Make 运行
+cd projects/app
+pnpm dev
+
+# Make 运行
+make dev name=app
+  

6. 部署打包

+  # Docker cmd: Build image, not proxy
+docker build -f ./projects/app/Dockerfile -t registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 . --build-arg name=app
+# Make cmd: Build image, not proxy
+make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1
+
+# Docker cmd: Build image with proxy
+docker build -f ./projects/app/Dockerfile -t registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 . --build-arg name=app --build-arg proxy=taobao
+# Make cmd: Build image with proxy
+make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 proxy=taobao
+  

如果不使用 docker 打包,需要手动把 Dockerfile 里 run 阶段的内容全部手动执行一遍(非常不推荐)。

提交代码至开源仓库

  1. 确保你的代码是 Fork FastGPT 仓库
  2. 尽可能少量的提交代码,每次提交仅解决一个问题。
  3. 向 FastGPT 的 main 分支提交一个 PR,提交请求后,FastGPT 团队/社区的其他人将与您一起审查它。

如果遇到问题,比如合并冲突或不知道如何打开拉取请求,请查看 GitHub 的拉取请求教程,了解如何解决合并冲突和其他问题。一旦您的 PR 被合并,您将自豪地被列为贡献者表中的一员。

QA

本地数据库无法连接

  1. 如果你是连接远程的数据库,先检查对应的端口是否开放。
  2. 如果是本地运行的数据库,可尝试host改成localhost127.0.0.1
  3. 本地连接远程的 Mongo,需要增加 directConnection=true 参数,才能连接上副本集的数据库。
  4. mongo使用mongocompass客户端进行连接测试和可视化管理。
  5. pg使用navicat进行连接和管理。

sh ./scripts/postinstall.sh 没权限

FastGPT 在pnpm i后会执行postinstall脚本,用于自动生成ChakraUIType。如果没有权限,可以先执行chmod -R +x ./scripts/,再执行pnpm i

仍不可行的话,可以手动执行./scripts/postinstall.sh里的内容。 +如果是Windows下的话,可以使用git bash给postinstall脚本添加执行权限并执行sh脚本

TypeError: Cannot read properties of null (reading ‘useMemo’ )

删除所有的node_modules,用 Node18 重新 install 试试,可能最新的 Node 有问题。 本地开发流程:

  1. 根目录: pnpm i
  2. 复制 config.json -> config.local.json
  3. 复制 .env.template -> .env.local
  4. cd projects/app
  5. pnpm dev

Error response from daemon: error while creating mount source path ‘XXX’: mkdir XXX: file exists

这个错误可能是之前停止容器时有文件残留导致的,首先需要确认相关镜像都全部关闭,然后手动删除相关文件或者重启docker即可

加入社区

遇到困难了吗?有任何问题吗? 加入飞书群与开发者和用户保持沟通。

代码结构说明

nextjs

FastGPT 使用了 nextjs 的 page route 作为框架。为了区分好前后端代码,在目录分配上会分成 global, service, web 3个自目录,分别对应着 前后端共用后端专用前端专用的代码。

monorepo

FastGPT 采用 pnpm workspace 方式构建 monorepo 项目,主要分为两个部分:

  • projects/app - FastGPT 主项目
  • packages/ - 子模块
    • global - 共用代码,通常是放一些前后端都能执行的函数、类型声明、常量。
    • service - 服务端代码
    • web - 前端代码
    • plugin - 工作流自定义插件的代码

领域驱动模式(DDD)

FastGPT 在代码模块划分时,按DDD的思想进行划分,主要分为以下几个领域:

core - 核心功能(知识库,工作流,应用,对话) +support - 支撑功能(用户体系,计费,鉴权等) +common - 基础功能(日志管理,文件读写等)

代码结构说明
.
+├── .github                      // github 相关配置
+├── .husky                       // 格式化配置
+├── docSite                      // 文档
+├── files                        // 一些外部文件,例如 docker-compose, helm
+├── packages                     // 子包
+│   ├── global                   // 前后端通用子包
+│   ├── plugins                  // 工作流插件(需要自定义包时候使用到)
+│   ├── service                  // 后端子包
+│   └── web                      // 前端子包
+├── projects
+│   └── app                      // FastGPT 主项目
+├── python                       // 存放一些模型代码,和 FastGPT 本身无关
+└── scripts                      // 一些自动化脚本
+    ├── icon                     // icon预览脚本,可以在顶层 pnpm initIcon(把svg写入到代码中), pnpm previewIcon(预览icon)
+    └── postinstall.sh           // chakraUI自定义theme初始化 ts 类型
+├── package.json                 // 顶层monorepo
+├── pnpm-lock.yaml
+├── pnpm-workspace.yaml          // monorepo 声明
+├── Dockerfile
+├── LICENSE
+├── README.md
+├── README_en.md
+├── README_ja.md
+├── dev.md
+
+ + + + \ No newline at end of file diff --git a/docs/development/migration/docker_db/index.html b/docs/development/migration/docker_db/index.html new file mode 100644 index 000000000000..66e7b19dd864 --- /dev/null +++ b/docs/development/migration/docker_db/index.html @@ -0,0 +1,45 @@ +Docker 数据库迁移(无脑操作) | FastGPT
+
Docker 数据库迁移(无脑操作)
database

Docker 数据库迁移(无脑操作)

FastGPT Docker 数据库备份和迁移

Copy文件

Docker 部署数据库都会通过 volume 挂载本地的目录进入容器,如果要迁移,直接复制这些目录即可。

PG 数据: pg/data +Mongo 数据: mongo/data

+ + + + \ No newline at end of file diff --git a/docs/development/migration/docker_mongo/index.html b/docs/development/migration/docker_mongo/index.html new file mode 100644 index 000000000000..1fb3db936e24 --- /dev/null +++ b/docs/development/migration/docker_mongo/index.html @@ -0,0 +1,132 @@ +Docker Mongo迁移(dump模式) | FastGPT
+
database

Docker Mongo迁移(dump模式)

FastGPT Docker Mongo迁移

作者

https://github.com/samqin123

相关PR。有问题可打开这里与作者交流

介绍

如何使用Mongodump来完成从A环境到B环境的Fastgpt的mongodb迁移

前提说明:

A环境:我在阿里云上部署的fastgpt,现在需要迁移到B环境。 +B环境:是新环境比如腾讯云新部署的fastgpt,更特殊一点的是,NAS(群晖或者QNAP)部署了fastgpt,mongo必须改成4.2或者4.4版本(其实云端更方便,支持fastgpt mongo默认版本) +C环境:妥善考虑,用本地电脑作为C环境过渡,保存相关文件并分离操作 +‍

1. 环境准备:进入 docker mongo 【A环境】

+  docker exec -it mongo sh
+mongo -u 'username' -p 'password'
+>> show dbs
+  

看到fastgpt数据库,以及其它几个,确定下导出数据库名称 +准备: +检查数据库,容器和宿主机都创建一下 backup 目录 【A环境 + C环境】

准备:

检查数据库,容器和宿主机都创建一下“数据导出导入”临时目录 ,比如data/backup 【A环境建目录 + C环境建目录用于同步到容器中】

先在【A环境】创建文件目录,用于dump导出操作

容器:(先进入fastgpt docker容器)

+  docker exec -it fastgpt sh
+mkdir -p /data/backup
+  

建好后,未来导出mongo的数据,会在A环境本地fastgpt的安装目录/Data/下看到自动同步好的目录,数据会在data\backup中,然后可以衔接后续的压缩和下载转移动作。如果没有同步到本地,也可以手动建一下,配合docker cp 把文件拷到本地用(基本不会发生)

然后,【C环境】宿主机目录类似操作,用于把上传的文件自动同步到C环境部署的fastgpt容器里。

到fastgpt目录,进入mongo目录,有data目录,下面建backup

+  mkdir -p /fastgpt/data/backup
+  

准备好后,后续上传

+  ### 新fastgpt环境【B】中也需要建一个,比如/fastgpt/mongobackup目录,注意不要在fastgpt/data目录下建立目录
+  

mkdir -p /fastgpt/mongobackup

+  
+###2. 正题开始,从fastgpt老环境【A】中导出数据
+进入A环境,使用mongodump 导出mongo数据库。
+
+#### 2.1 导出 
+可以使用mongodump在源头容器中导出数据文件, 导出路径为上面指定临时目录,即"data\backup"
+
+[导出的文件在代码中指定为/data/backup,因为fastgpt配置文件已经建立了data的持久化,所以会同步到容器所在环境本地fast/mongo/data应该就能看到这个导出的目录:backup,里面有文件]
+
+一行指令导出代码,在服务器本地环境运行,不需要进入容器。
+  

docker exec -it mongo bash -c “mongodump –db fastgpt -u ‘username’ -p ‘password’ –authenticationDatabase admin –out /data/backup”

+  
+也可以进入环境,熟手可以结合建目录,一次性完成建导出目录,以及使用mongodump导出数据到该目录
+  

1.docker exec -it fastgpt sh

2.mkdir -p /data/backup

  1. mongodump –host 127.0.0.1:27017 –db fastgpt -u “username” -p “password” –authenticationDatabase admin –out /data/backup +‍
补充:万一没自动同步,也可以将mongodump导出的文件,手工导出到宿主机【A环境】,备用指令如下:
+  docker cp mongo:/data/backup   <A环境本地fastgpt目录>:/fastgpt/data/backup>
+‍``` 
+
+2.2  对新手,建议稳妥起见,压缩这个文件目录,并将压缩文件下载到本地过渡环境【A环境 -> C环境】;原因是因为留存一份,并且检查文件数量是否一致。
+
+        熟手可以直接复制到新部署服务器(腾讯云或者NAS)【A环境-> B环境】
+
+
+2.2.1 先进入  【A环境】源头系统的本地环境 fastgpt/mongo/data 目录
+  

cd /usr/fastgpt/mongo/data

+  
+#执行,压缩文件命令
+  

tar -czvf ../fastgpt-mongo-backup-$(date +%Y-%m-%d).tar.gz ./ 【A环境】

+  #接下来,把压缩包下载到本地 【A环境-> C环境】,以便于检查和留存版本。熟手,直接将该压缩包同步到B环境中新fastgpt目录data目录下备用。
+  

scp -i /Users/path/<user.pem换成你自己的pem文件链接> root@<fastgpt所在云服务器地址>:/usr/fastgpt/mongo/fastgptbackup-2024-05-03.tar.gz /<本地电脑路径>/Downloads/fastgpt

+  熟手直接换成新环境地址
+​
+  

scp -i /Users/path/<user.pem换成你自己的pem文件链接> root@<老环境fastgpt服务器地址>:/usr/fastgpt/mongo/fastgptbackup-2024-05-03.tar.gz root@<新环境fastgpt服务器地址>:/Downloads/fastgpt2

+  
+2.2 【C环境】检查压缩文件是否完整,如果不完整,重新导出。事实上,我也出现过问题,因为跨环境scp会出现丢数据的情况。
+
+压缩数据包导入到C环境本地后,可以考虑在宿主机目录解压缩,放在一个自定义目录比如. < user/fastgpt/mongobackup/data>
+  

tar -xvzf fastgptbackup-2024-05-03.tar.gz -C user/fastgpt/mongobackup/data

+  解压缩后里面是bson文件,这里可以检查下,压缩文件数量是否一致。如果不一致,后续启动新环境的fastgpt容器,也不会有任何数据。
+​
+<img width="1561" alt="image" src="https://github.com/labring/FastGPT/assets/103937568/cbb8a93c-5834-4a0d-be6c-c45c701f593e">
+
+
+如果没问题,准备进入下一步,将压缩包文件上传到B环境,也就是新fastgpt环境里的指定目录,比如/fastgpt/mongobackup, 注意不要放到fastgpt/data目录下,因为下面会先清空一次这个目录,否则导入会报错。
+  

scp -rfv <本地电脑路径>/Downloads/fastgpt/fastgptbackup-2024-05-03.tar.gz root@<新环境fastgpt服务器地址>:/Downloads/fastgpt/backup

+  
+## 3 导入恢复:    实际恢复和导入步骤
+
+### 3.1. 进入新fastgpt本地环境的安装目录后,找到迁移的压缩文件包fastgptbackup-2024-05-03.tar.gz,解压缩到指定目录
+  

tar -xvzf fastgptbackup-2024-05-03.tar.gz -C user/fastgpt/mongobackup/data

+  再次核对文件数量,和上面对比一下。
+
+熟手可以用tar指令检查文件完整性,上面是给新手准备的,便于比对核查。
+
+
+### 3.2 手动上传新fastgpt docker容器里备用 【C环境】
+说明:因为没有放在data里,所以不会自动同步到容器里。而且要确保容器的data目录被清理干净,否则导入时会报错。
+  

docker cp user/fastgpt/mongobackup/data mongo:/tmp/backup +‍```

3.3 建议初始化一次docker compose ,运行后建立新的 mongo/data 持久化目录

如果不是初始化的 mongo/db 目录, mongorestore 导入可能会报错。如果报错,建议尝试初始化mongo。

操作指令

+  cd /fastgpt安装目录/mongo/data
+rm -rf *
+  

4.恢复: mongorestore 恢复 [C环境】 +简单一点,退回到本地环境,用 docker 命令一键导入,当然你也可以在容器里操作

+  docker exec -it mongo mongorestore -u "username" -p "password" --authenticationDatabase admin /tmp/backup/ --db fastgpt
+  
image +注意:导入文件数量量级太少,大概率是没导入成功的表现。如果导入不成功,新环境fastgpt可以登入,但是一片空白。

5.重启容器 【C环境】

+  docker compose restart
+docker logs -f mongo  **强烈建议先检查mongo运行情况,在去做登录动作,如果mongo报错,访问web也会报错”
+  

如果mongo启动正常,显示的是类似这样的,而不是 “mongo is restarting”,后者就是错误 +iShot_2024-05-09_19 21 26

报错情况 +iShot_2024-05-09_19 23 13

  1. 启动fastgpt容器服务后,登录新fastgpt web,能看到原来的数据库内容完整显示,说明已经导入系统了。 +iShot_2024-05-09_19 23 51
+ + + + \ No newline at end of file diff --git a/docs/development/migration/index.html b/docs/development/migration/index.html new file mode 100644 index 000000000000..bf0bbd1189ff --- /dev/null +++ b/docs/development/migration/index.html @@ -0,0 +1,44 @@ +迁移&备份 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/development/migration/index.xml b/docs/development/migration/index.xml new file mode 100644 index 000000000000..385bfeca4d97 --- /dev/null +++ b/docs/development/migration/index.xml @@ -0,0 +1,14 @@ +迁移&备份 on FastGPThttps://doc.tryfastgpt.ai/docs/development/migration/Recent content in 迁移&备份 on FastGPTHugo -- gohugo.iozh-cnDocker Mongo迁移(dump模式)https://doc.tryfastgpt.ai/docs/development/migration/docker_mongo/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/migration/docker_mongo/作者 linkhttps://github.com/samqin123 +相关PR。有问题可打开这里与作者交流 +介绍 link如何使用Mongodump来完成从A环境到B环境的Fastgpt的mongodb迁移 +前提说明: +A环境:我在阿里云上部署的fastgpt,现在需要迁移到B环境。 B环境:是新环境比如腾讯云新部署的fastgpt,更特殊一点的是,NAS(群晖或者QNAP)部署了fastgpt,mongo必须改成4.2或者4.4版本(其实云端更方便,支持fastgpt mongo默认版本) C环境:妥善考虑,用本地电脑作为C环境过渡,保存相关文件并分离操作 ‍ +1. 环境准备:进入 docker mongo 【A环境】 link docker exec -it mongo sh mongo -u &#39;username&#39; -p &#39;password&#39; &gt;&gt; show dbs 看到fastgpt数据库,以及其它几个,确定下导出数据库名称 准备: 检查数据库,容器和宿主机都创建一下 backup 目录 【A环境 + C环境】 +准备: link检查数据库,容器和宿主机都创建一下“数据导出导入”临时目录 ,比如data/backup 【A环境建目录 + C环境建目录用于同步到容器中】 +先在【A环境】创建文件目录,用于dump导出操作 link容器:(先进入fastgpt docker容器) +docker exec -it fastgpt sh mkdir -p /data/backup 建好后,未来导出mongo的数据,会在A环境本地fastgpt的安装目录/Data/下看到自动同步好的目录,数据会在data\backup中,然后可以衔接后续的压缩和下载转移动作。如果没有同步到本地,也可以手动建一下,配合docker cp 把文件拷到本地用(基本不会发生) +然后,【C环境】宿主机目录类似操作,用于把上传的文件自动同步到C环境部署的fastgpt容器里。 link到fastgpt目录,进入mongo目录,有data目录,下面建backup +mkdir -p /fastgpt/data/backup 准备好后,后续上传 +### 新fastgpt环境【B】中也需要建一个,比如/fastgpt/mongobackup目录,注意不要在fastgpt/data目录下建立目录 mkdir -p /fastgpt/mongobackup +###2. 正题开始,从fastgpt老环境【A】中导出数据 进入A环境,使用mongodump 导出mongo数据库。 #### 2.Docker 数据库迁移(无脑操作)https://doc.tryfastgpt.ai/docs/development/migration/docker_db/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/migration/docker_db/Copy文件 linkDocker 部署数据库都会通过 volume 挂载本地的目录进入容器,如果要迁移,直接复制这些目录即可。 +PG 数据: pg/data Mongo 数据: mongo/data \ No newline at end of file diff --git a/docs/development/modelconfig/index.html b/docs/development/modelconfig/index.html new file mode 100644 index 000000000000..26cc7e9cff47 --- /dev/null +++ b/docs/development/modelconfig/index.html @@ -0,0 +1,44 @@ +模型配置方案 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/development/modelconfig/index.xml b/docs/development/modelconfig/index.xml new file mode 100644 index 000000000000..5204adc4de64 --- /dev/null +++ b/docs/development/modelconfig/index.xml @@ -0,0 +1,11 @@ +模型配置方案 on FastGPThttps://doc.tryfastgpt.ai/docs/development/modelconfig/Recent content in 模型配置方案 on FastGPTHugo -- gohugo.iozh-cn通过 OneAPI 接入模型https://doc.tryfastgpt.ai/docs/development/modelconfig/one-api/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/modelconfig/one-api/FastGPT 目前采用模型分离的部署方案,FastGPT 中只兼容 OpenAI 的模型规范(OpenAI 不存在的模型采用一个较为通用的规范),并通过 One API 来实现对不同模型接口的统一。 +One API 是一个 OpenAI 接口管理 &amp; 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。 +FastGPT 与 One API 关系 link可以把 One API 当做一个网关,FastGPT 与 One API 关系: +部署 linkDocker 版本 linkdocker-compose.yml 文件已加入了 OneAPI 配置,可直接使用。默认暴露在 3001 端口。 +Sealos 版本 link 北京区: 点击部署 OneAPI 新加坡区(可用 GPT) 点击部署 OneAPI 部署完后,可以打开 OneAPI 访问链接,进行下一步操作。 +OneAPI 基础教程 link概念 link 渠道: OneApi 中一个渠道对应一个 Api Key,这个 Api Key 可以是GPT、微软、ChatGLM、文心一言的。一个Api Key通常可以调用同一个厂商的多个模型。 One API 会根据请求传入的模型来决定使用哪一个渠道,如果一个模型对应了多个渠道,则会随机调用。 令牌:访问 One API 所需的凭证,只需要这1个凭证即可访问One API上配置的模型。因此FastGPT中,只需要配置One API的baseurl和令牌即可。令牌不要设置任何的模型范围权限,否则容易报错。 大致工作流程 link 客户端请求 One API 根据请求中的 model 参数,匹配对应的渠道(根据渠道里的模型进行匹配,必须完全一致)。如果匹配到多个渠道,则随机选择一个(同优先级)。 One API 向真正的地址发出请求。 One API 将结果返回给客户端。 1.通过 SiliconCloud 体验开源模型https://doc.tryfastgpt.ai/docs/development/modelconfig/siliconcloud/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/modelconfig/siliconcloud/SiliconCloud(硅基流动) 是一个以提供开源模型调用为主的平台,并拥有自己的加速引擎。帮助用户低成本、快速的进行开源模型的测试和使用。实际体验下来,他们家模型的速度和稳定性都非常不错,并且种类丰富,覆盖语言、向量、重排、TTS、STT、绘图、视频生成模型,可以满足 FastGPT 中所有模型需求。 +如果你想部分模型使用 SiliconCloud 的模型,可额外参考OneAPI接入硅基流动。 +本文会介绍完全使用 SiliconCloud 模型来部署 FastGPT 的方案。 +1. 注册 SiliconCloud 账号 link 点击注册硅基流动账号 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak 2. 修改 FastGPT 环境变量 link OPENAI_BASE_URL=https://api.siliconflow.cn/v1 # 填写 SiliconCloud 控制台提供的 Api Key CHAT_API_KEY=sk-xxxxxx 3. 修改 FastGPT 配置文件 link我们选取 SiliconCloud 中的模型作为 FastGPT 配置。这里配置了 Qwen2.5 72b 的纯语言和视觉模型;选择 bge-m3 作为向量模型;选择 bge-reranker-v2-m3 作为重排模型。选择 fish-speech-1.5 作为语音模型;选择 SenseVoiceSmall 作为语音输入模型。 +注意:ReRank 模型仍需配置一次 Api Key +{ &#34;llmModels&#34;: [ { &#34;provider&#34;: &#34;Other&#34;, // 模型提供商,主要用于分类展示,目前已经内置提供商包括:https://github.com/labring/FastGPT/blob/main/packages/global/core/ai/provider.ts, 可 pr 提供新的提供商,或直接填写 Other &#34;model&#34;: &#34;Qwen/Qwen2. \ No newline at end of file diff --git a/docs/development/modelconfig/one-api/index.html b/docs/development/modelconfig/one-api/index.html new file mode 100644 index 000000000000..7d6ca29ce964 --- /dev/null +++ b/docs/development/modelconfig/one-api/index.html @@ -0,0 +1,91 @@ +通过 OneAPI 接入模型 | FastGPT
+
api

通过 OneAPI 接入模型

通过 OneAPI 接入模型

FastGPT 目前采用模型分离的部署方案,FastGPT 中只兼容 OpenAI 的模型规范(OpenAI 不存在的模型采用一个较为通用的规范),并通过 One API 来实现对不同模型接口的统一。

One API 是一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。

FastGPT 与 One API 关系

可以把 One API 当做一个网关,FastGPT 与 One API 关系:

部署

Docker 版本

docker-compose.yml 文件已加入了 OneAPI 配置,可直接使用。默认暴露在 3001 端口。

Sealos 版本

alt text

部署完后,可以打开 OneAPI 访问链接,进行下一步操作。

OneAPI 基础教程

概念

  1. 渠道:
    1. OneApi 中一个渠道对应一个 Api Key,这个 Api Key 可以是GPT、微软、ChatGLM、文心一言的。一个Api Key通常可以调用同一个厂商的多个模型。
    2. One API 会根据请求传入的模型来决定使用哪一个渠道,如果一个模型对应了多个渠道,则会随机调用。
  2. 令牌:访问 One API 所需的凭证,只需要这1个凭证即可访问One API上配置的模型。因此FastGPT中,只需要配置One APIbaseurl令牌即可。令牌不要设置任何的模型范围权限,否则容易报错。

alt text

大致工作流程

  1. 客户端请求 One API
  2. 根据请求中的 model 参数,匹配对应的渠道(根据渠道里的模型进行匹配,必须完全一致)。如果匹配到多个渠道,则随机选择一个(同优先级)。
  3. One API 向真正的地址发出请求。
  4. One API 将结果返回给客户端。

1. 登录 One API

step5

2. 创建渠道

在 One API 中添加对应渠道,直接点击 【添加基础模型】,不要遗漏了向量模型(Embedding)

step6

3. 创建令牌

step7alt text

4. 修改账号余额

One API 默认 root 用户只有 200刀,可以自行修改编辑。

alt text

5. 修改 FastGPT 的环境变量

有了 One API 令牌后,FastGPT 可以通过修改 baseurlkey 去请求到 One API,再由 One API 去请求不同的模型。修改下面两个环境变量:

+  # 务必写上 v1。如果在同一个网络内,可改成内网地址。
+OPENAI_BASE_URL=https://xxxx.cloud.sealos.io/v1
+# 下面的 key 是由 One API 提供的令牌
+CHAT_API_KEY=sk-xxxxxx
+  

接入其他模型

以添加文心一言为例:

1. OneAPI 新增模型渠道

类型选择百度文心千帆。

2. 修改 FastGPT 配置文件

可以在 /projects/app/src/data/config.json 里找到配置文件(本地开发需要复制成 config.local.json),按下面内容修改配置文件,最新/更具体的配置说明,可查看FastGPT 配置文件说明

配置模型关键点在于model 需要与 OneAPI 渠道中的模型一致。

+  {
+  "llmModels": [ // 语言模型配置
+    {
+      "model": "ERNIE-Bot", // 这里的模型需要对应 One API 的模型
+      "name": "文心一言", // 对外展示的名称
+      "avatar": "/imgs/model/openai.svg", // 模型的logo
+      "maxContext": 16000, // 最大上下文
+      "maxResponse": 4000, // 最大回复
+      "quoteMaxToken": 13000, // 最大引用内容
+      "maxTemperature": 1.2, // 最大温度
+      "charsPointsPrice": 0, 
+      "censor": false,
+      "vision": false, // 是否支持图片输入
+      "datasetProcess": true, // 是否设置为知识库处理模型
+      "usedInClassify": true, // 是否用于问题分类
+      "usedInExtractFields": true, // 是否用于字段提取
+      "usedInToolCall": true, // 是否用于工具调用
+      "usedInQueryExtension": true, // 是否用于问题优化
+      "toolChoice": true, // 是否支持工具选择
+      "functionCall": false, // 是否支持函数调用
+      "customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
+      "customExtractPrompt": "", // 自定义内容提取提示词
+      "defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
+      "defaultConfig":{}  // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
+    }
+  ],
+  "vectorModels": [ // 向量模型配置
+    {
+      "model": "text-embedding-ada-002",
+      "name": "Embedding-2",
+      "avatar": "/imgs/model/openai.svg",
+      "charsPointsPrice": 0,
+      "defaultToken": 700,
+      "maxToken": 3000,
+      "weight": 100
+    },
+  ]
+}
+  

3. 重启 FastGPT

Docker 版本

+  docker-compose down
+docker-compose up -d
+  

Sealos 版本

直接找到 FastGPT 服务,点击重启即可。

其他服务商接入参考

这章介绍一些提供商接入 OneAPI 的教程,配置后不要忘记修改 FastGPT 配置文件。

阿里通义千问

千问目前已经兼容 GPT 格式,可以直接选择 OpenAI 类型来接入即可。如下图,选择类型为OpenAI,代理填写阿里云的代理地址。

目前可以直接使用阿里云的语言模型和 text-embedding-v3 向量模型(实测已经归一化,可直接使用)

alt text

硅基流动 —— 开源模型大合集

硅基流动 是一个专门提供开源模型调用平台,并拥有自己的加速引擎。模型覆盖面广,非常适合低成本来测试开源模型。接入教程:

  1. 点击注册硅基流动账号
  2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak
  3. 新增 OneAPI 渠道,选择OpenAI类型,代理填写:https://api.siliconflow.cn,密钥是第二步创建的密钥。

alt text

由于 OneAPI 未内置 硅基流动 的模型名,可以通过自定义模型名称来填入,下面是获取模型名称的教程:

  1. 打开硅基流动模型列表
  2. 单击模型后,会打开模型详情。
  3. 复制模型名到 OneAPI 中。
alt textalt textalt text
+ + + + \ No newline at end of file diff --git a/docs/development/modelconfig/siliconcloud/index.html b/docs/development/modelconfig/siliconcloud/index.html new file mode 100644 index 000000000000..556100ca642a --- /dev/null +++ b/docs/development/modelconfig/siliconcloud/index.html @@ -0,0 +1,172 @@ +通过 SiliconCloud 体验开源模型 | FastGPT
+
api

通过 SiliconCloud 体验开源模型

通过 SiliconCloud 体验开源模型

SiliconCloud(硅基流动) 是一个以提供开源模型调用为主的平台,并拥有自己的加速引擎。帮助用户低成本、快速的进行开源模型的测试和使用。实际体验下来,他们家模型的速度和稳定性都非常不错,并且种类丰富,覆盖语言、向量、重排、TTS、STT、绘图、视频生成模型,可以满足 FastGPT 中所有模型需求。

如果你想部分模型使用 SiliconCloud 的模型,可额外参考OneAPI接入硅基流动

本文会介绍完全使用 SiliconCloud 模型来部署 FastGPT 的方案。

1. 注册 SiliconCloud 账号

  1. 点击注册硅基流动账号
  2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak

2. 修改 FastGPT 环境变量

+  OPENAI_BASE_URL=https://api.siliconflow.cn/v1
+# 填写 SiliconCloud 控制台提供的 Api Key
+CHAT_API_KEY=sk-xxxxxx
+  

3. 修改 FastGPT 配置文件

我们选取 SiliconCloud 中的模型作为 FastGPT 配置。这里配置了 Qwen2.5 72b 的纯语言和视觉模型;选择 bge-m3 作为向量模型;选择 bge-reranker-v2-m3 作为重排模型。选择 fish-speech-1.5 作为语音模型;选择 SenseVoiceSmall 作为语音输入模型。

注意:ReRank 模型仍需配置一次 Api Key

+  {
+    "llmModels": [
+    {
+      "provider": "Other", // 模型提供商,主要用于分类展示,目前已经内置提供商包括:https://github.com/labring/FastGPT/blob/main/packages/global/core/ai/provider.ts, 可 pr 提供新的提供商,或直接填写 Other
+      "model": "Qwen/Qwen2.5-72B-Instruct", // 模型名(对应OneAPI中渠道的模型名)
+      "name": "Qwen2.5-72B-Instruct", // 模型别名
+      "maxContext": 32000, // 最大上下文
+      "maxResponse": 4000, // 最大回复
+      "quoteMaxToken": 30000, // 最大引用内容
+      "maxTemperature": 1, // 最大温度
+      "charsPointsPrice": 0, // n积分/1k token(商业版)
+      "censor": false, // 是否开启敏感校验(商业版)
+      "vision": false, // 是否支持图片输入
+      "datasetProcess": true, // 是否设置为文本理解模型(QA),务必保证至少有一个为true,否则知识库会报错
+      "usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true)
+      "usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true)
+      "usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true)
+      "usedInQueryExtension": true, // 是否用于问题优化(务必保证至少有一个为true)
+      "toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。)
+      "functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式)
+      "customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
+      "customExtractPrompt": "", // 自定义内容提取提示词
+      "defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
+      "defaultConfig": {}, // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
+      "fieldMap": {} // 字段映射(o1 模型需要把 max_tokens 映射为 max_completion_tokens)
+    },
+    {
+      "provider": "Other",
+      "model": "Qwen/Qwen2-VL-72B-Instruct",
+      "name": "Qwen2-VL-72B-Instruct",
+      "maxContext": 32000,
+      "maxResponse": 4000,
+      "quoteMaxToken": 30000,
+      "maxTemperature": 1,
+      "charsPointsPrice": 0,
+      "censor": false,
+      "vision": true,
+      "datasetProcess": false,
+      "usedInClassify": false,
+      "usedInExtractFields": false,
+      "usedInToolCall": false,
+      "usedInQueryExtension": false,
+      "toolChoice": false,
+      "functionCall": false,
+      "customCQPrompt": "",
+      "customExtractPrompt": "",
+      "defaultSystemChatPrompt": "",
+      "defaultConfig": {}
+    }
+  ],
+  "vectorModels": [
+    {
+      "provider": "Other",
+      "model": "Pro/BAAI/bge-m3",
+      "name": "Pro/BAAI/bge-m3",
+      "charsPointsPrice": 0,
+      "defaultToken": 512,
+      "maxToken": 5000,
+      "weight": 100
+    }
+  ],
+  "reRankModels": [
+    {
+        "model": "BAAI/bge-reranker-v2-m3", // 这里的model需要对应 siliconflow 的模型名
+        "name": "BAAI/bge-reranker-v2-m3",
+        "requestUrl": "https://api.siliconflow.cn/v1/rerank",
+        "requestAuth": "siliconflow 上申请的 key"
+    }
+  ],
+  "audioSpeechModels": [
+    {
+        "model": "fishaudio/fish-speech-1.5",
+        "name": "fish-speech-1.5",
+        "voices": [
+            {
+                "label": "fish-alex",
+                "value": "fishaudio/fish-speech-1.5:alex",
+                "bufferId": "fish-alex"
+            },
+            {
+                "label": "fish-anna",
+                "value": "fishaudio/fish-speech-1.5:anna",
+                "bufferId": "fish-anna"
+            },
+            {
+                "label": "fish-bella",
+                "value": "fishaudio/fish-speech-1.5:bella",
+                "bufferId": "fish-bella"
+            },
+            {
+                "label": "fish-benjamin",
+                "value": "fishaudio/fish-speech-1.5:benjamin",
+                "bufferId": "fish-benjamin"
+            },
+            {
+                "label": "fish-charles",
+                "value": "fishaudio/fish-speech-1.5:charles",
+                "bufferId": "fish-charles"
+            },
+            {
+                "label": "fish-claire",
+                "value": "fishaudio/fish-speech-1.5:claire",
+                "bufferId": "fish-claire"
+            },
+            {
+                "label": "fish-david",
+                "value": "fishaudio/fish-speech-1.5:david",
+                "bufferId": "fish-david"
+            },
+            {
+                "label": "fish-diana",
+                "value": "fishaudio/fish-speech-1.5:diana",
+                "bufferId": "fish-diana"
+            }
+        ]
+    }
+  ],
+  "whisperModel": {
+    "model": "FunAudioLLM/SenseVoiceSmall",
+    "name": "SenseVoiceSmall",
+    "charsPointsPrice": 0
+  }
+}
+  

4. 重启 FastGPT

5. 体验测试

测试对话和图片识别

随便新建一个简易应用,选择对应模型,并开启图片上传后进行测试:

alt textalt text

可以看到,72B 的模型,性能还是非常快的,这要是本地没几个 4090,不说配置环境,输出怕都要 30s 了。

测试知识库导入和知识库问答

新建一个知识库(由于只配置了一个向量模型,页面上不会展示向量模型选择)

alt textalt text

导入本地文件,直接选择文件,然后一路下一步即可。79 个索引,大概花了 20s 的时间就完成了。现在我们去测试一下知识库问答。

首先回到我们刚创建的应用,选择知识库,调整一下参数后即可开始对话:

alt textalt textalt text

对话完成后,点击底部的引用,可以查看引用详情,同时可以看到具体的检索和重排得分:

alt textalt text

测试语音播放

继续在刚刚的应用中,左侧配置中找到语音播放,点击后可以从弹窗中选择语音模型,并进行试听:

alt text

测试语言输入

继续在刚刚的应用中,左侧配置中找到语音输入,点击后可以从弹窗中开启语言输入

alt text

开启后,对话输入框中,会增加一个话筒的图标,点击可进行语音输入:

alt textalt text

总结

如果你想快速的体验开源模型或者快速的使用 FastGPT,不想在不同服务商申请各类 Api Key,那么可以选择 SiliconCloud 的模型先进行快速体验。

如果你决定未来私有化部署模型和 FastGPT,前期可通过 SiliconCloud 进行测试验证,后期再进行硬件采购,减少 POC 时间和成本。

+ + + + \ No newline at end of file diff --git a/docs/development/openapi/auth/index.html b/docs/development/openapi/auth/index.html new file mode 100644 index 000000000000..b4d77ede82d2 --- /dev/null +++ b/docs/development/openapi/auth/index.html @@ -0,0 +1,64 @@ +Api Key 使用与鉴权 | FastGPT
+
key

Api Key 使用与鉴权

FastGPT Api Key 使用与鉴权

使用说明

FasGPT OpenAPI 接口允许你使用 Api Key 进行鉴权,从而操作 FastGPT 上的相关服务和资源,例如:调用应用对话接口、上传知识库数据、搜索测试等等。出于兼容性和安全考虑,并不是所有的接口都允许通过 Api Key 访问。

如何查看 BaseURL

注意:BaseURL 不是接口地址,而是所有接口的根地址,直接请求 BaseURL 是没有用的。

如何获取 Api Key

FastGPT 的 API Key 有 2 类,一类是全局通用的 key (无法直接调用应用对话);一类是携带了 AppId 也就是有应用标记的 key (可直接调用应用对话)。

我们建议,仅操作应用或者对话的相关接口使用 应用特定key,其他接口使用 通用key

通用key应用特定 key

基本配置

OpenAPI 中,所有的接口都通过 Header.Authorization 进行鉴权。

+  baseUrl: "https://api.fastgpt.in/api"
+headers: {
+    Authorization: "Bearer {{apikey}}"
+}
+  

发起应用对话示例

+  curl --location --request POST 'https://api.fastgpt.in/api/v1/chat/completions' \
+--header 'Authorization: Bearer fastgpt-xxxxxx' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+    "chatId": "111",
+    "stream": false,
+    "detail": false,
+    "messages": [
+        {
+            "content": "导演是谁",
+            "role": "user"
+        }
+    ]
+}'
+  
+ + + + \ No newline at end of file diff --git a/docs/development/openapi/chat/index.html b/docs/development/openapi/chat/index.html new file mode 100644 index 000000000000..c010514de0fb --- /dev/null +++ b/docs/development/openapi/chat/index.html @@ -0,0 +1,849 @@ +对话接口 | FastGPT
+
chat

对话接口

FastGPT OpenAPI 对话接口

发起对话

请求简易应用和工作流

对话接口兼容GPT的接口!如果你的项目使用的是标准的GPT官方接口,可以直接通过修改BaseUrlAuthorization来访问 FastGpt 应用,不过需要注意下面几个规则:

请求

响应

交互节点响应

如果工作流中包含交互节点,依然是调用该 API 接口,需要设置detail=true,并可以从event=interactive的数据中获取交互节点的配置信息。如果是stream=false,则可以从 choice 中获取type=interactive的元素,获取交互节点的选择信息。

当你调用一个带交互节点的工作流时,如果工作流遇到了交互节点,那么会直接返回,你可以得到下面的信息:

交互节点继续运行

紧接着上一节,当你接收到交互节点信息后,可以根据这些数据进行 UI 渲染,引导用户输入或选择相关信息。然后需要再次发起对话,来继续工作流。调用的接口与仍是该接口,你需要按以下格式来发起请求:

请求插件

插件的接口与对话接口一致,仅请求参数略有区别,有以下规定:

  • 调用插件类型的应用时,接口默认为detail模式。
  • 无需传入 chatId,因为插件只能运行一轮。
  • 无需传入messages
  • 通过传递variables来代表插件的输入。
  • 通过获取pluginData来获取插件输出。

请求示例

+  curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \
+--header 'Authorization: Bearer test-xxxxx' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+    "stream": false,
+    "chatId": "test",
+    "variables": {
+        "query":"你好" # 我的插件输入有一个参数,变量名叫 query
+    }
+}'
+  

响应示例

对话 CRUD

重要字段

  • chatId - 指一个应用下,某一个对话窗口的 ID
  • dataId - 指一个对话窗口下,某一个对话记录的 ID

历史记录

获取某个应用历史记录

修改某个对话的标题

置顶 / 取消置顶

删除某个历史记录

清空所有历史记录

仅会情况通过 API Key 创建的对话历史记录,不会清空在线使用、分享链接等其他来源的对话历史记录。

对话记录

指的是某个 chatId 下的对话记录操作。

获取单个对话初始化信息

获取对话记录列表

获取单个对话记录运行详情

删除对话记录

点赞 / 取消点赞

点踩 / 取消点踩

猜你想问

4.8.16 后新版接口

新版猜你想问,必须包含 appId 和 chatId 的参数才可以进行使用。会自动根据 chatId 去拉取最近 6 轮对话记录作为上下文来引导回答。


4.8.16 前旧版接口:

+ + + + \ No newline at end of file diff --git a/docs/development/openapi/dataset/index.html b/docs/development/openapi/dataset/index.html new file mode 100644 index 000000000000..0e4ef2a9dd71 --- /dev/null +++ b/docs/development/openapi/dataset/index.html @@ -0,0 +1,733 @@ +知识库接口 | FastGPT
+
dataset

知识库接口

FastGPT OpenAPI 知识库接口

如何获取知识库ID(datasetId)如何获取文件集合ID(collection_id)

创建训练订单

知识库

创建一个知识库

获取知识库列表

获取知识库详情

删除一个知识库

集合

通用创建参数说明

入参

参数说明必填
datasetId知识库ID
parentId:父级ID,不填则默认为根目录
trainingType训练模式。chunk: 按文本长度进行分割;qa: QA拆分;auto: 增强训练
chunkSize预估块大小
chunkSplitter自定义最高优先分割符号
qaPromptqa拆分提示词
tags集合标签(字符串数组)
createTime文件创建时间(Date / String)

出参

  • collectionId - 新建的集合ID
  • insertLen:插入的块数量

创建一个空的集合

创建一个纯文本集合

传入一段文字,创建一个集合,会根据传入的文字进行分割。

创建一个链接集合

传入一个网络链接,创建一个集合,会先去对应网页抓取内容,再抓取的文字进行分割。

创建一个文件集合

传入一个文件,创建一个集合,会读取文件内容进行分割。目前支持:pdf, docx, md, txt, html, csv。

创建一个API集合

传入一个文件的 id,创建一个集合,会读取文件内容进行分割。目前支持:pdf, docx, md, txt, html, csv。

创建一个外部文件库集合(商业版)

获取集合列表

获取集合详情

修改集合信息

删除一个集合

数据

数据的结构

Data结构

字段类型说明必填
teamIdString团队ID
tmbIdString成员ID
datasetIdString知识库ID
collectionIdString集合ID
qString主要数据
aString辅助数据
fullTextTokenString分词
indexesIndex[]向量索引
updateTimeDate更新时间
chunkIndexNumber分块下表

Index结构

每组数据的自定义索引最多5个

字段类型说明必填
defaultIndexBoolean是否为默认索引
dataIdString关联的向量ID
textString文本内容

为集合批量添加添加数据

注意,每次最多推送 200 组数据。

获取集合的数据列表

获取单条数据详情

修改单条数据

删除单条数据

搜索测试

+ + + + \ No newline at end of file diff --git a/docs/development/openapi/index.html b/docs/development/openapi/index.html new file mode 100644 index 000000000000..b8f2f13bc51e --- /dev/null +++ b/docs/development/openapi/index.html @@ -0,0 +1,44 @@ +OpenAPI 接口文档 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/development/openapi/index.xml b/docs/development/openapi/index.xml new file mode 100644 index 000000000000..c084d24e5acc --- /dev/null +++ b/docs/development/openapi/index.xml @@ -0,0 +1,28 @@ +OpenAPI 接口文档 on FastGPThttps://doc.tryfastgpt.ai/docs/development/openapi/Recent content in OpenAPI 接口文档 on FastGPTHugo -- gohugo.iozh-cnApi Key 使用与鉴权https://doc.tryfastgpt.ai/docs/development/openapi/auth/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/openapi/auth/使用说明 linkFasGPT OpenAPI 接口允许你使用 Api Key 进行鉴权,从而操作 FastGPT 上的相关服务和资源,例如:调用应用对话接口、上传知识库数据、搜索测试等等。出于兼容性和安全考虑,并不是所有的接口都允许通过 Api Key 访问。 +如何查看 BaseURL link注意:BaseURL 不是接口地址,而是所有接口的根地址,直接请求 BaseURL 是没有用的。 +如何获取 Api Key linkFastGPT 的 API Key 有 2 类,一类是全局通用的 key (无法直接调用应用对话);一类是携带了 AppId 也就是有应用标记的 key (可直接调用应用对话)。 +我们建议,仅操作应用或者对话的相关接口使用 应用特定key,其他接口使用 通用key。 +通用key 应用特定 key 基本配置 linkOpenAPI 中,所有的接口都通过 Header.Authorization 进行鉴权。 +baseUrl: &#34;https://api.fastgpt.in/api&#34; headers: { Authorization: &#34;Bearer {{apikey}}&#34; } 发起应用对话示例 +curl --location --request POST &#39;https://api.fastgpt.in/api/v1/chat/completions&#39; \ --header &#39;Authorization: Bearer fastgpt-xxxxxx&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;chatId&#34;: &#34;111&#34;, &#34;stream&#34;: false, &#34;detail&#34;: false, &#34;messages&#34;: [ { &#34;content&#34;: &#34;导演是谁&#34;, &#34;role&#34;: &#34;user&#34; } ] }&#39;对话接口https://doc.tryfastgpt.ai/docs/development/openapi/chat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/openapi/chat/发起对话 link 🤖 +该接口的 API Key 需使用应用特定的 key,否则会报错。 +有些包调用时,BaseUrl需要添加v1路径,有些不需要,如果出现404情况,可补充v1重试。 +请求简易应用和工作流 link对话接口兼容GPT的接口!如果你的项目使用的是标准的GPT官方接口,可以直接通过修改BaseUrl和 Authorization来访问 FastGpt 应用,不过需要注意下面几个规则: +🤖 +传入的model,temperature等参数字段均无效,这些字段由编排决定,不会根据 API 参数改变。 +不会返回实际消耗Token值,如果需要,可以设置detail=true,并手动计算 responseData 里的tokens值。 +请求 link 基础请求示例 图片/文件请求示例 参数说明 curl --location --request POST &#39;http://localhost:3000/api/v1/chat/completions&#39; \ --header &#39;Authorization: Bearer fastgpt-xxxxxx&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;chatId&#34;: &#34;my_chatId&#34;, &#34;stream&#34;: false, &#34;detail&#34;: false, &#34;responseChatItemId&#34;: &#34;my_responseChatItemId&#34;, &#34;variables&#34;: { &#34;uid&#34;: &#34;asdfadsfasfd2323&#34;, &#34;name&#34;: &#34;张三&#34; }, &#34;messages&#34;: [ { &#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;导演是谁&#34; } ] }&#39; 仅messages有部分区别,其他参数一致。 目前不支持上次文件,需上传到自己的对象存储中,获取对应的文件链接。 curl --location --request POST &#39;http://localhost:3000/api/v1/chat/completions&#39; \ --header &#39;Authorization: Bearer fastgpt-xxxxxx&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;chatId&#34;: &#34;abcd&#34;, &#34;stream&#34;: false, &#34;messages&#34;: [ { &#34;role&#34;: &#34;user&#34;, &#34;content&#34;: [ { &#34;type&#34;: &#34;text&#34;, &#34;text&#34;: &#34;导演是谁&#34; }, { &#34;type&#34;: &#34;image_url&#34;, &#34;image_url&#34;: { &#34;url&#34;: &#34;图片链接&#34; } }, { &#34;type&#34;: &#34;file_url&#34;, &#34;name&#34;: &#34;文件名&#34;, &#34;url&#34;: &#34;文档链接,支持 txt md html word pdf ppt csv excel&#34; } ] } ] }&#39; info headers.知识库接口https://doc.tryfastgpt.ai/docs/development/openapi/dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/openapi/dataset/如何获取知识库ID(datasetId) 如何获取文件集合ID(collection_id) 创建训练订单 link 请求示例 响应示例 新例子 +curl --location --request POST &#39;http://localhost:3000/api/support/wallet/usage/createTrainingUsage&#39; \ --header &#39;Authorization: Bearer {{apikey}}&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;datasetId&#34;: &#34;知识库 ID&#34;, &#34;name&#34;: &#34;可选,自定义订单名称,例如:文档训练-fastgpt.docx&#34; }&#39; data 为 billId,可用于添加知识库数据时进行账单聚合。 +{ &#34;code&#34;: 200, &#34;statusText&#34;: &#34;&#34;, &#34;message&#34;: &#34;&#34;, &#34;data&#34;: &#34;65112ab717c32018f4156361&#34; } 知识库 link创建一个知识库 link 请求示例 参数说明 响应示例 curl --location --request POST &#39;http://localhost:3000/api/core/dataset/create&#39; \ --header &#39;Authorization: Bearer {{authorization}}&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;parentId&#34;: null, &#34;type&#34;: &#34;dataset&#34;, &#34;name&#34;:&#34;测试&#34;, &#34;intro&#34;:&#34;介绍&#34;, &#34;avatar&#34;: &#34;&#34;, &#34;vectorModel&#34;: &#34;text-embedding-ada-002&#34;, &#34;agentModel&#34;: &#34;gpt-3.分享链接身份鉴权https://doc.tryfastgpt.ai/docs/development/openapi/share/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/openapi/share/介绍 link在 FastGPT V4.6.4 中,我们修改了分享链接的数据读取方式,为每个用户生成一个 localId,用于标识用户,从云端拉取对话记录。但是这种方式仅能保障用户在同一设备同一浏览器中使用,如果切换设备或者清空浏览器缓存则会丢失这些记录。这种方式存在一定的风险,因此我们仅允许用户拉取近30天的20条记录。 +分享链接身份鉴权设计的目的在于,将 FastGPT 的对话框快速、安全的接入到你现有的系统中,仅需 2 个接口即可实现。 +使用说明 link免登录链接配置中,你可以选择填写身份验证栏。这是一个POST请求的根地址。在填写该地址后,分享链接的初始化、开始对话以及对话结束都会向该地址的特定接口发送一条请求。下面以host来表示凭身份验证根地址。服务器接口仅需返回是否校验成功即可,不需要返回其他数据,格式如下: +接口统一响应格式 link { &#34;success&#34;: true, &#34;message&#34;: &#34;错误提示&#34;, &#34;msg&#34;: &#34;同message, 错误提示&#34;, &#34;data&#34;: { &#34;uid&#34;: &#34;用户唯一凭证&#34; } } FastGPT 将会判断success是否为true决定是允许用户继续操作。message与msg是等同的,你可以选择返回其中一个,当success不为true时,将会提示这个错误。 +uid是用户的唯一凭证,将会用于拉取对话记录以及保存对话记录。可参考下方实践案例。 +触发流程 link 配置教程 link1. 配置身份校验地址 link 配置校验地址后,在每次分享链接使用时,都会向对应的地址发起校验和上报请求。 +🤖 +这里仅需配置根地址,无需具体到完整请求路径。 +2. 分享链接中增加额外 query link在分享链接的地址中,增加一个额外的参数: authToken。例如: +原始的链接:https://share.tryfastgpt.ai/chat/share?shareId=648aaf5ae121349a16d62192 +完整链接: https://share.tryfastgpt.ai/chat/share?shareId=648aaf5ae121349a16d62192&amp;authToken=userid12345 +这个authToken通常是你系统生成的用户唯一凭证(Token之类的)。FastGPT 会在鉴权接口的body中携带 token={{authToken}} 的参数。 +3. 编写聊天初始化校验接口 link 请求示例 鉴权成功 鉴权失败 curl --location --request POST &#39;{{host}}/shareAuth/init&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;token&#34;: &#34;{{authToken}}&#34; }&#39; { &#34;success&#34;: true, &#34;data&#34;: { &#34;uid&#34;: &#34;用户唯一凭证&#34; } } 系统会拉取该分享链接下,uid 为 username123 的对话记录。 \ No newline at end of file diff --git a/docs/development/openapi/share/index.html b/docs/development/openapi/share/index.html new file mode 100644 index 000000000000..047e0c69c053 --- /dev/null +++ b/docs/development/openapi/share/index.html @@ -0,0 +1,258 @@ +分享链接身份鉴权 | FastGPT
+
share

分享链接身份鉴权

FastGPT 分享链接身份鉴权

介绍

在 FastGPT V4.6.4 中,我们修改了分享链接的数据读取方式,为每个用户生成一个 localId,用于标识用户,从云端拉取对话记录。但是这种方式仅能保障用户在同一设备同一浏览器中使用,如果切换设备或者清空浏览器缓存则会丢失这些记录。这种方式存在一定的风险,因此我们仅允许用户拉取近30天20条记录。

分享链接身份鉴权设计的目的在于,将 FastGPT 的对话框快速、安全的接入到你现有的系统中,仅需 2 个接口即可实现。

使用说明

免登录链接配置中,你可以选择填写身份验证栏。这是一个POST请求的根地址。在填写该地址后,分享链接的初始化、开始对话以及对话结束都会向该地址的特定接口发送一条请求。下面以host来表示凭身份验证根地址。服务器接口仅需返回是否校验成功即可,不需要返回其他数据,格式如下:

接口统一响应格式

+  {
+    "success": true,
+    "message": "错误提示",
+    "msg": "同message, 错误提示",
+    "data": {
+        "uid": "用户唯一凭证"
+    }
+}
+  

FastGPT 将会判断success是否为true决定是允许用户继续操作。messagemsg是等同的,你可以选择返回其中一个,当success不为true时,将会提示这个错误。

uid是用户的唯一凭证,将会用于拉取对话记录以及保存对话记录。可参考下方实践案例。

触发流程

配置教程

1. 配置身份校验地址

配置校验地址后,在每次分享链接使用时,都会向对应的地址发起校验和上报请求。

2. 分享链接中增加额外 query

在分享链接的地址中,增加一个额外的参数: authToken。例如:

原始的链接:https://share.tryfastgpt.ai/chat/share?shareId=648aaf5ae121349a16d62192

完整链接: https://share.tryfastgpt.ai/chat/share?shareId=648aaf5ae121349a16d62192&authToken=userid12345

这个authToken通常是你系统生成的用户唯一凭证(Token之类的)。FastGPT 会在鉴权接口的body中携带 token={{authToken}} 的参数。

3. 编写聊天初始化校验接口

4. 编写对话前校验接口

5. 编写对话结果上报接口(可选)

该接口无规定返回值。

响应值与chat 接口格式相同,仅多了一个token

重点关注:totalPoints(总消耗AI积分),token(Token消耗总数)

+  curl --location --request POST '{{host}}/shareAuth/finish' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+    "token": "{{authToken}}",
+    "responseData": [
+        {
+            "moduleName": "core.module.template.Dataset search",
+            "moduleType": "datasetSearchNode",
+            "totalPoints": 1.5278,
+            "query": "导演是谁\n《铃芽之旅》的导演是谁?\n这部电影的导演是谁?\n谁是《铃芽之旅》的导演?",
+            "model": "Embedding-2(旧版,不推荐使用)",
+            "tokens": 1524,
+            "similarity": 0.83,
+            "limit": 400,
+            "searchMode": "embedding",
+            "searchUsingReRank": false,
+            "extensionModel": "FastAI-4k",
+            "extensionResult": "《铃芽之旅》的导演是谁?\n这部电影的导演是谁?\n谁是《铃芽之旅》的导演?",
+            "runningTime": 2.15
+        },
+        {
+            "moduleName": "AI 对话",
+            "moduleType": "chatNode",
+            "totalPoints": 0.593,
+            "model": "FastAI-4k",
+            "tokens": 593,
+            "query": "导演是谁",
+            "maxToken": 2000,
+            "quoteList": [
+                {
+                    "id": "65bb346a53698398479a8854",
+                    "q": "导演是谁?",
+                    "a": "电影《铃芽之旅》的导演是新海诚。",
+                    "chunkIndex": 0,
+                    "datasetId": "65af9b947916ae0e47c834d2",
+                    "collectionId": "65bb345c53698398479a868f",
+                    "sourceName": "dataset - 2024-01-23T151114.198.csv",
+                    "sourceId": "65bb345b53698398479a868d",
+                    "score": [
+                        {
+                            "type": "embedding",
+                            "value": 0.9377183318138123,
+                            "index": 0
+                        },
+                        {
+                            "type": "rrf",
+                            "value": 0.06557377049180328,
+                            "index": 0
+                        }
+                    ]
+                }
+            ],
+            "historyPreview": [
+                {
+                    "obj": "Human",
+                    "value": "使用 <Data></Data> 标记中的内容作为本次对话的参考:\n\n<Data>\n导演是谁?\n电影《铃芽之旅》的导演是新海诚。\n------\n电影《铃芽之旅》的编剧是谁?22\n新海诚是本片的编剧。\n------\n电影《铃芽之旅》的女主角是谁?\n电影的女主角是铃芽。\n------\n电影《铃芽之旅》的制作团队中有哪位著名人士?2\n川村元气是本片的制作团队成员之一。\n------\n你是谁?\n我是电影《铃芽之旅》助手\n------\n电影《铃芽之旅》男主角是谁?\n电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。\n------\n电影《铃芽之旅》的作者新海诚写了一本小说,叫什么名字?\n小说名字叫《铃芽之旅》。\n------\n电影《铃芽之旅》的女主角是谁?\n电影《铃芽之旅》的女主角是岩户铃芽,由原菜乃华配音。\n------\n电影《铃芽之旅》的故事背景是什么?\n日本\n------\n谁担任电影《铃芽之旅》中岩户环的配音?\n深津绘里担任电影《铃芽之旅》中岩户环的配音。\n</Data>\n\n回答要求:\n- 如果你不清楚答案,你需要澄清。\n- 避免提及你是从 <Data></Data> 获取的知识。\n- 保持答案与 <Data></Data> 中描述的一致。\n- 使用 Markdown 语法优化回答格式。\n- 使用与问题相同的语言回答。\n\n问题:\"\"\"导演是谁\"\"\""
+                },
+                {
+                    "obj": "AI",
+                    "value": "电影《铃芽之旅》的导演是新海诚。"
+                }
+            ],
+            "contextTotalLen": 2,
+            "runningTime": 1.32
+        }
+    ]
+        
+    
+}'
+  

responseData 完整字段说明:

+  type ResponseType = {
+    moduleType: FlowNodeTypeEnum; // 模块类型
+    moduleName: string; // 模块名
+    moduleLogo?: string; // logo
+    runningTime?: number; // 运行时间
+    query?: string; // 用户问题/检索词
+    textOutput?: string; // 文本输出
+
+    tokens?: number; // 上下文总Tokens
+    model?: string; // 使用到的模型
+    contextTotalLen?: number; // 上下文总长度
+    totalPoints?: number; // 总消耗AI积分
+
+    temperature?: number; // 温度
+    maxToken?: number; // 模型的最大token
+    quoteList?: SearchDataResponseItemType[]; // 引用列表
+    historyPreview?: ChatItemType[]; // 上下文预览(历史记录会被裁剪)
+
+    similarity?: number; // 最低相关度
+    limit?: number; // 引用上限token
+    searchMode?: `${DatasetSearchModeEnum}`; // 搜索模式
+    searchUsingReRank?: boolean; // 是否使用rerank
+    extensionModel?: string; // 问题扩展模型
+    extensionResult?: string; // 问题扩展结果
+    extensionTokens?: number; // 问题扩展总字符长度
+
+    cqList?: ClassifyQuestionAgentItemType[]; // 分类问题列表
+    cqResult?: string; // 分类问题结果
+
+    extractDescription?: string; // 内容提取描述
+    extractResult?: Record<string, any>; // 内容提取结果
+
+    params?: Record<string, any>; // HTTP模块params
+    body?: Record<string, any>;  // HTTP模块body
+    headers?: Record<string, any>; // HTTP模块headers
+    httpResult?: Record<string, any>; // HTTP模块结果
+
+    pluginOutput?: Record<string, any>; // 插件输出
+    pluginDetail?: ChatHistoryItemResType[]; // 插件详情
+
+    isElseResult?: boolean; // 判断器结果
+}
+  

实践案例

我们以Laf作为服务器为例,简单展示这 3 个接口的使用方式。

1. 创建3个Laf接口

2. 配置校验地址

我们随便复制3个地址中一个接口: https://d8dns0.laf.dev/shareAuth/finish, 去除/shareAuth/finish后填入身份校验:https://d8dns0.laf.dev

3. 修改分享链接参数

源分享链接:https://share.tryfastgpt.ai/chat/share?shareId=64be36376a438af0311e599c

修改后:https://share.tryfastgpt.ai/chat/share?shareId=64be36376a438af0311e599c&authToken=fastgpt

4. 测试效果

  1. 打开源链接或者authToken不等于fastgpt的链接会提示身份错误。
  2. 发送内容中包含你字,会提示内容不合规。

使用场景

这个鉴权方式通常是帮助你直接嵌入分享链接到你的应用中,在你的应用打开分享链接前,应做authToken的拼接后再打开。

除了对接已有系统的用户外,你还可以对接余额功能,通过结果上报接口扣除用户余额,通过对话前校验接口检查用户的余额。

+ + + + \ No newline at end of file diff --git a/docs/development/proxy/cloudflare/index.html b/docs/development/proxy/cloudflare/index.html new file mode 100644 index 000000000000..a52a65796c68 --- /dev/null +++ b/docs/development/proxy/cloudflare/index.html @@ -0,0 +1,78 @@ +Cloudflare Worker 中转 | FastGPT
+
Cloudflare Worker 中转
foggy

Cloudflare Worker 中转

使用 Cloudflare Worker 实现中转

参考 “不做了睡觉” 的教程

workers 配置文件

+  const TELEGRAPH_URL = 'https://api.openai.com';
+
+addEventListener('fetch', (event) => {
+  event.respondWith(handleRequest(event.request));
+});
+
+async function handleRequest(request) {
+  // 安全校验
+  if (request.headers.get('auth') !== 'auth_code') {
+    return new Response('UnAuthorization', { status: 403 });
+  }
+
+  const url = new URL(request.url);
+  url.host = TELEGRAPH_URL.replace(/^https?:\/\//, '');
+
+  const modifiedRequest = new Request(url.toString(), {
+    headers: request.headers,
+    method: request.method,
+    body: request.body,
+    redirect: 'follow'
+  });
+
+  const response = await fetch(modifiedRequest);
+  const modifiedResponse = new Response(response.body, response);
+
+  // 添加允许跨域访问的响应头
+  modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
+
+  return modifiedResponse;
+}
+  

修改 FastGPT 的环境变量

务必别忘了填 v1!

+  OPENAI_BASE_URL=https://xxxxxx/v1
+OPENAI_BASE_URL_AUTH=auth_code
+  
+ + + + \ No newline at end of file diff --git a/docs/development/proxy/http_proxy/index.html b/docs/development/proxy/http_proxy/index.html new file mode 100644 index 000000000000..0a1018a3e46c --- /dev/null +++ b/docs/development/proxy/http_proxy/index.html @@ -0,0 +1,70 @@ +HTTP 代理中转 | FastGPT
+
HTTP 代理中转
http

HTTP 代理中转

使用 HTTP 代理实现中转

如果你有代理工具(例如 Clash 或者 sing-box),也可以使用 HTTP 代理来访问 OpenAI。只需要添加以下两个环境变量即可:

+  AXIOS_PROXY_HOST=
+AXIOS_PROXY_PORT=
+  

以 Clash 为例,建议指定 api.openai.com 走代理,其他请求都直连。示例配置如下:

+  mixed-port: 7890
+allow-lan: false
+bind-address: '*'
+mode: rule
+log-level: warning
+dns:  
+  enable: true  
+  ipv6: false  
+  nameserver:  
+    - 8.8.8.8
+    - 8.8.4.4 
+  cache-size: 400
+proxies:
+    - 
+proxy-groups:
+  - { name: '♻️ 自动选择', type: url-test,  proxies: [香港V01×1.5], url: 'https://api.openai.com', interval: 3600}
+rules:
+  - 'DOMAIN-SUFFIX,api.openai.com,♻️ 自动选择'
+  - 'MATCH,DIRECT'
+  

然后给 FastGPT 添加两个环境变量:

+  AXIOS_PROXY_HOST=127.0.0.1
+AXIOS_PROXY_PORT=7890
+  
+ + + + \ No newline at end of file diff --git a/docs/development/proxy/index.html b/docs/development/proxy/index.html new file mode 100644 index 000000000000..b3aa37d63669 --- /dev/null +++ b/docs/development/proxy/index.html @@ -0,0 +1,44 @@ +代理方案 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/development/proxy/index.xml b/docs/development/proxy/index.xml new file mode 100644 index 000000000000..7a34ba8b4290 --- /dev/null +++ b/docs/development/proxy/index.xml @@ -0,0 +1,10 @@ +代理方案 on FastGPThttps://doc.tryfastgpt.ai/docs/development/proxy/Recent content in 代理方案 on FastGPTHugo -- gohugo.iozh-cnNginx 中转https://doc.tryfastgpt.ai/docs/development/proxy/nginx/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/proxy/nginx/登录 Sealos linkSealos +创建应用 link打开 「应用管理」,点击「新建应用」: +填写基本配置 link务必开启外网访问,复制外网访问提供的地址。 +添加配置文件 link 复制下面这段配置文件,注意 server_name 后面的内容替换成第二步的外网访问地址。 +user nginx; worker_processes auto; worker_rlimit_nofile 51200; events { worker_connections 1024; } http { resolver 8.8.8.8; proxy_ssl_server_name on; access_log off; server_names_hash_bucket_size 512; client_header_buffer_size 64k; large_client_header_buffers 4 64k; client_max_body_size 50M; proxy_connect_timeout 240s; proxy_read_timeout 240s; proxy_buffer_size 128k; proxy_buffers 4 256k; server { listen 80; server_name tgohwtdlrmer.cloud.sealos.io; # 这个地方替换成 Sealos 提供的外网地址 location ~ /openai/(.*) { proxy_pass https://api.openai.com/$1$is_args$args; proxy_set_header Host api.openai.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 如果响应是流式的 proxy_set_header Connection &#39;&#39;; proxy_http_version 1.HTTP 代理中转https://doc.tryfastgpt.ai/docs/development/proxy/http_proxy/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/proxy/http_proxy/如果你有代理工具(例如 Clash 或者 sing-box),也可以使用 HTTP 代理来访问 OpenAI。只需要添加以下两个环境变量即可: +AXIOS_PROXY_HOST= AXIOS_PROXY_PORT= 以 Clash 为例,建议指定 api.openai.com 走代理,其他请求都直连。示例配置如下: +mixed-port: 7890 allow-lan: false bind-address: &#39;*&#39; mode: rule log-level: warning dns: enable: true ipv6: false nameserver: - 8.8.8.8 - 8.8.4.4 cache-size: 400 proxies: - proxy-groups: - { name: &#39;♻️ 自动选择&#39;, type: url-test, proxies: [香港V01×1.5], url: &#39;https://api.openai.com&#39;, interval: 3600} rules: - &#39;DOMAIN-SUFFIX,api.openai.com,♻️ 自动选择&#39; - &#39;MATCH,DIRECT&#39; 然后给 FastGPT 添加两个环境变量: +AXIOS_PROXY_HOST=127.0.0.1 AXIOS_PROXY_PORT=7890Cloudflare Worker 中转https://doc.tryfastgpt.ai/docs/development/proxy/cloudflare/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/proxy/cloudflare/参考 &ldquo;不做了睡觉&rdquo; 的教程 +workers 配置文件 +const TELEGRAPH_URL = &#39;https://api.openai.com&#39;; addEventListener(&#39;fetch&#39;, (event) =&gt; { event.respondWith(handleRequest(event.request)); }); async function handleRequest(request) { // 安全校验 if (request.headers.get(&#39;auth&#39;) !== &#39;auth_code&#39;) { return new Response(&#39;UnAuthorization&#39;, { status: 403 }); } const url = new URL(request.url); url.host = TELEGRAPH_URL.replace(/^https?:\/\//, &#39;&#39;); const modifiedRequest = new Request(url.toString(), { headers: request.headers, method: request.method, body: request.body, redirect: &#39;follow&#39; }); const response = await fetch(modifiedRequest); const modifiedResponse = new Response(response.body, response); // 添加允许跨域访问的响应头 modifiedResponse. \ No newline at end of file diff --git a/docs/development/proxy/nginx/index.html b/docs/development/proxy/nginx/index.html new file mode 100644 index 000000000000..571835e7c7ea --- /dev/null +++ b/docs/development/proxy/nginx/index.html @@ -0,0 +1,92 @@ +Nginx 中转 | FastGPT
+
cloud_sync

Nginx 中转

使用 Sealos 部署 Nginx 实现中转

登录 Sealos

Sealos

创建应用

打开 「应用管理」,点击「新建应用」:


填写基本配置

务必开启外网访问,复制外网访问提供的地址。

添加配置文件

  1. 复制下面这段配置文件,注意 server_name 后面的内容替换成第二步的外网访问地址。

    +  user nginx;
    +worker_processes auto;
    +worker_rlimit_nofile 51200;
    +
    +events {
    +    worker_connections 1024;
    +}
    +
    +http {
    +    resolver 8.8.8.8;
    +    proxy_ssl_server_name on;
    +
    +    access_log off;
    +    server_names_hash_bucket_size 512;
    +    client_header_buffer_size 64k;
    +    large_client_header_buffers 4 64k;
    +    client_max_body_size 50M;
    +
    +    proxy_connect_timeout       240s;
    +    proxy_read_timeout          240s;
    +    proxy_buffer_size 128k;
    +    proxy_buffers 4 256k;
    +
    +    server {
    +        listen 80;
    +        server_name tgohwtdlrmer.cloud.sealos.io; # 这个地方替换成 Sealos 提供的外网地址
    +
    +        location ~ /openai/(.*) {
    +            proxy_pass https://api.openai.com/$1$is_args$args;
    +            proxy_set_header Host api.openai.com;
    +            proxy_set_header X-Real-IP $remote_addr;
    +            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    +            # 如果响应是流式的
    +            proxy_set_header Connection '';
    +            proxy_http_version 1.1;
    +            chunked_transfer_encoding off;
    +            proxy_buffering off;
    +            proxy_cache off;
    +            # 如果响应是一般的
    +            proxy_buffer_size 128k;
    +            proxy_buffers 4 256k;
    +            proxy_busy_buffers_size 256k;
    +        }
    +    }
    +}
    +  
  2. 点开高级配置。

  3. 点击「新增配置文件」。

  4. 文件名写: /etc/nginx/nginx.conf

  5. 文件值为刚刚复制的那段代码。

  6. 点击确认。

部署应用

填写完毕后,点击右上角的「部署」,即可完成部署。

修改 FastGPT 环境变量

  1. 进入刚刚部署应用的详情,复制外网地址

    注意:这是个 API 地址,点击打开是无效的。如需验证,可以访问: *.cloud.sealos.io/openai/api,如果提示 Invalid URL (GET /api) 则代表成功。

  2. 修改环境变量(是 FastGPT 的环境变量,不是 Sealos 的):

    +  OPENAI_BASE_URL=https://tgohwtdlrmer.cloud.sealos.io/openai/v1
    +  

Done!

+ + + + \ No newline at end of file diff --git a/docs/development/sealos/index.html b/docs/development/sealos/index.html new file mode 100644 index 000000000000..6f45f53c7eef --- /dev/null +++ b/docs/development/sealos/index.html @@ -0,0 +1,57 @@ +Sealos 一键部署 | FastGPT
+
cloud

Sealos 一键部署

使用 Sealos 一键部署 FastGPT

部署架构图

多模型支持

FastGPT 使用了 one-api 项目来管理模型池,其可以兼容 OpenAI 、Azure 、国内主流模型和本地模型等。

可参考:Sealos 快速部署 OneAPI

一键部署

使用 Sealos 服务,无需采购服务器、无需域名,支持高并发 & 动态伸缩,并且数据库应用采用 kubeblocks 的数据库,在 IO 性能方面,远超于简单的 Docker 容器部署。可以根据需求,再下面两个区域选择部署。

新加坡区

新加披区的服务器在国外,可以直接访问 OpenAI,但国内用户需要梯子才可以正常访问新加坡区。国际区价格稍贵,点击下面按键即可部署👇

Deploy on Sealos

北京区

北京区服务提供商为火山云,国内用户可以稳定访问,但无法访问 OpenAI 等境外服务,价格约为新加坡区的 1/4。点击下面按键即可部署👇

Deploy on Sealos

开始部署

由于需要部署数据库,部署完后需要等待 2~4 分钟才能正常访问。默认用了最低配置,首次访问时会有些慢。

根据提示,输入root_password,和 openai/oneapi 的地址和密钥。

点击部署后,会跳转到应用管理页面。可以点击fastgpt主应用右侧的详情按键(名字为 fastgpt-xxxx), 如下图所示。

点击详情后,会跳转到 fastgpt 的部署管理页面,点击外网访问地址中的链接,即可打开 fastgpt 服务。

如需绑定自定义域名、修改部署参数,可以点击右上角变更,根据 sealos 的指引完成。

登录

用户名:root

密码是刚刚一键部署时设置的root_password

修改配置文件和环境变量

在 Sealos 中,你可以打开应用管理(App Launchpad)看到部署的 FastGPT,可以打开数据库(Database)看到对应的数据库。

应用管理中,选中 FastGPT,点击变更,可以看到对应的环境变量和配置文件。

更新

点击变更或重启会自动拉取镜像更新,请确保镜像tag正确。建议不要使用latest,改成固定版本号。

收费

Sealos 采用按量计费的方式,也就是申请了多少 cpu、内存、磁盘,就按该申请量进行计费。具体的计费标准,可以打开sealos控制面板中的费用中心进行查看。

Sealos 使用

简介

FastGPT 商业版共包含了2个应用(fastgpt, fastgpt-plus)和2个数据库,使用多 Api Key 时候需要安装 OneAPI(一个应用和一个数据库),总计3个应用和3个数据库。

点击右侧的详情,可以查看对应应用的详细信息。

如何更新/升级 FastGPT

升级脚本文档先看下文档,看下需要升级哪个版本。注意,不要跨版本升级!!!!!

例如,目前是4.5 版本,要升级到4.5.1,就先把镜像版本改成v4.5.1,执行一下升级脚本,等待完成后再继续升级。如果目标版本不需要执行初始化,则可以跳过。

升级步骤:

  1. 查看更新文档,确认要升级的版本,避免跨版本升级。
  2. 打开 sealos 的应用管理
  3. 有2个应用 fastgpt , fastgpt-pro
  4. 点击对应应用右边3个点,变更。或者点详情后右上角的变更。
  5. 修改镜像的版本号

  1. 点击变更/重启,会自动拉取最新镜像进行更新
  2. 执行对应版本的初始化脚本(如果有)

如何获取 FastGPT 访问链接

打开对应的应用,点击外网访问地址。

配置自定义域名

点击对应应用的变更->点击自定义域名->填写域名-> 操作域名 Cname -> 确认 -> 确认变。

如何修改配置文件

打开 Sealos 的应用管理 -> 找到对应的应用 -> 变更 -> 往下拉到高级配置,里面有个配置文件 -> 新增或点击对应的配置文件可以进行编辑 -> 点击右上角确认变。

配置文件参考

修改站点名称以及 favicon

修改应用的环境变量,增加

+  SYSTEM_NAME=FastGPT
+SYSTEM_DESCRIPTION=
+SYSTEM_FAVICON=/favicon.ico
+HOME_URL=/app/list
+  

SYSTEM_FAVICON 可以是一个网络地址

目前暂时无法 把浏览器上的logo替换。仅支持svg,待后续可视化做了后可以全部替换。 +新增一个挂载文件,文件名为:/app/projects/app/public/icon/logo.svg ,值为 svg 对应的值。

管理后台(已合并到plus)

商业版镜像配置文件

+  {
+  "license": "",
+  "system": {
+    "title": "" // 系统名称
+  }
+}
+  

One API 使用

参考 OneAPI 使用步骤

+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/40/index.html b/docs/development/upgrading/40/index.html new file mode 100644 index 000000000000..4cc94b394fd3 --- /dev/null +++ b/docs/development/upgrading/40/index.html @@ -0,0 +1,74 @@ +升级到 V4.0 | FastGPT
+
upgrade

升级到 V4.0

FastGPT 从旧版本升级到 V4.0 操作指南

如果您是从旧版本升级到 V4,由于新版 MongoDB 表变更比较大,需要按照本文档的说明执行一些初始化脚本。

重命名表名

需要连接上 MongoDB 数据库,执行两条命令:

+  db.models.renameCollection("apps")
+db.sharechats.renameCollection("outlinks")
+  

初始化几个表中的字段

依次执行下面 3 条命令,时间比较长,不成功可以重复执行(会跳过已经初始化的数据),直到所有数据更新完成。

+  db.chats.find({appId: {$exists: false}}).forEach(function(item){
+  db.chats.updateOne(
+    {
+      _id: item._id,
+    },
+    { "$set": {"appId":item.modelId}}
+  )
+})
+
+db.collections.find({appId: {$exists: false}}).forEach(function(item){
+  db.collections.updateOne(
+    {
+      _id: item._id,
+    },
+    { "$set": {"appId":item.modelId}}
+  )
+})
+
+db.outlinks.find({shareId: {$exists: false}}).forEach(function(item){
+   db.outlinks.updateOne(
+     {
+       _id: item._id,
+    },
+    { "$set": {"shareId":item._id.toString(),"appId":item.modelId}}
+   )
+})
+  

初始化 API

部署新版项目,并发起 3 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的)

  1. https://xxxxx/api/admin/initv4
  2. https://xxxxx/api/admin/initChat
  3. https://xxxxx/api/admin/initOutlink

1 和 2 有可能会因为内存不足挂掉,可以重复执行。

+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/41/index.html b/docs/development/upgrading/41/index.html new file mode 100644 index 000000000000..7de01741d5ce --- /dev/null +++ b/docs/development/upgrading/41/index.html @@ -0,0 +1,49 @@ +升级到 V4.1 | FastGPT
+
upgrade

升级到 V4.1

FastGPT 从旧版本升级到 V4.1 操作指南

如果您是从旧版本升级到 V4.1,由于新版重新设置了对话存储结构,需要初始化原来的存储内容。

更新环境变量

V4.1 优化了 PostgreSQL 和 MongoDB 的连接变量,只需要填 1 个 URL 即可:

注意:/fastgpt 和 /postgres 是指数据库名称,需要和旧版的变量对应。

+  # mongo 配置,不需要改. 如果连不上,可能需要去掉 ?authSource=admin
+- MONGODB_URI=mongodb://username:password@mongo:27017/fastgpt?authSource=admin
+# pg配置. 不需要改
+- PG_URL=postgresql://username:password@pg:5432/postgres
+  

初始化 API

部署新版项目,并发起 1 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的)

  • https://xxxxx/api/admin/initChatItem
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/42/index.html b/docs/development/upgrading/42/index.html new file mode 100644 index 000000000000..b827d76f4498 --- /dev/null +++ b/docs/development/upgrading/42/index.html @@ -0,0 +1,51 @@ +升级到 V4.2 | FastGPT
+
升级到 V4.2
upgrade

升级到 V4.2

FastGPT 从旧版本升级到 V4.2 操作指南

99.9%用户不影响,升级 4.2 主要是修改了配置文件中 QAModel 的格式。从原先的数组改成对象:

+  "QAModel": {
+    "model": "gpt-3.5-turbo-16k",
+    "name": "GPT35-16k",
+    "maxToken": 16000,
+    "price": 0
+}
+  

改动目的是,我们认为不需要留有选择余地,选择一个最合适的模型去进行任务即可。

+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/421/index.html b/docs/development/upgrading/421/index.html new file mode 100644 index 000000000000..8f1e6a0fccd9 --- /dev/null +++ b/docs/development/upgrading/421/index.html @@ -0,0 +1,54 @@ +升级到 V4.2.1 | FastGPT
+
升级到 V4.2.1
upgrade

升级到 V4.2.1

FastGPT 从旧版本升级到 V4.2.1 操作指南

私有部署,如果添加了配置文件,需要在配置文件中修改 VectorModels 字段。增加 defaultToken 和 maxToken,分别对应直接分段时的默认 token 数量和该模型支持的 token 上限 (通常不建议超过 3000)

+  "VectorModels": [
+    {
+      "model": "text-embedding-ada-002",
+      "name": "Embedding-2",
+      "price": 0,
+      "defaultToken": 500,
+      "maxToken": 3000
+    }
+]
+  

改动目的是,我们认为不需要留有选择余地,选择一个最合适的模型去进行任务即可。

+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/43/index.html b/docs/development/upgrading/43/index.html new file mode 100644 index 000000000000..d3281cfeb10b --- /dev/null +++ b/docs/development/upgrading/43/index.html @@ -0,0 +1,50 @@ +升级到 V4.3(包含升级脚本) | FastGPT
+
升级到 V4.3(包含升级脚本)
upgrade

升级到 V4.3(包含升级脚本)

FastGPT 从旧版本升级到 V4.3 操作指南

执行初始化 API

发起 1 个 HTTP 请求 (记得携带 headers.rootkey,这个值是环境变量里的)

  1. https://xxxxx/api/admin/initv43
+  curl --location --request POST 'https://{{host}}/api/admin/initv43' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会给 PG 数据库的 modeldata 表插入一个新列 file_id,用于存储文件 ID。

增加环境变量

增加一个 FILE_TOKEN_KEY 环境变量,用于生成文件预览链接,过期时间为 30 分钟。

+  FILE_TOKEN_KEY=filetokenkey
+  
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/44/index.html b/docs/development/upgrading/44/index.html new file mode 100644 index 000000000000..7bde55602f0e --- /dev/null +++ b/docs/development/upgrading/44/index.html @@ -0,0 +1,48 @@ +升级到 V4.4(包含升级脚本) | FastGPT
+
升级到 V4.4(包含升级脚本)
upgrade

升级到 V4.4(包含升级脚本)

FastGPT 从旧版本升级到 V4.4 操作指南

执行初始化 API

发起 1 个 HTTP 请求 (记得携带 headers.rootkey,这个值是环境变量里的)

  1. https://xxxxx/api/admin/initv44
+  curl --location --request POST 'https://{{host}}/api/admin/initv44' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会给初始化 Mongo 的部分字段。

+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/441/index.html b/docs/development/upgrading/441/index.html new file mode 100644 index 000000000000..a1a779b808d3 --- /dev/null +++ b/docs/development/upgrading/441/index.html @@ -0,0 +1,48 @@ +升级到 V4.4.1(包含升级脚本) | FastGPT
+
升级到 V4.4.1(包含升级脚本)
upgrade

升级到 V4.4.1(包含升级脚本)

FastGPT 从旧版本升级到 V4.4.1 操作指南

执行初始化 API

发起 1 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的)

  1. https://xxxxx/api/admin/initv441
+  curl --location --request POST 'https://{{host}}/api/admin/initv441' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会给初始化 Mongo 的 dataset.files,将所有数据设置为可用。

+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/442/index.html b/docs/development/upgrading/442/index.html new file mode 100644 index 000000000000..ec4f66a7cf81 --- /dev/null +++ b/docs/development/upgrading/442/index.html @@ -0,0 +1,48 @@ +升级到 V4.4.2(包含升级脚本) | FastGPT
+
升级到 V4.4.2(包含升级脚本)
upgrade

升级到 V4.4.2(包含升级脚本)

FastGPT 从旧版本升级到 V4.4.2 操作指南

执行初始化 API

发起 1 个 HTTP 请求 (记得携带 headers.rootkey,这个值是环境变量里的)

  1. https://xxxxx/api/admin/initv442
+  curl --location --request POST 'https://{{host}}/api/admin/initv442' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会给初始化 Mongo 的 Bill 表的索引,之前过期时间有误。

+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/445/index.html b/docs/development/upgrading/445/index.html new file mode 100644 index 000000000000..4aa9b7d89cbc --- /dev/null +++ b/docs/development/upgrading/445/index.html @@ -0,0 +1,48 @@ +V4.4.5(包含升级脚本) | FastGPT
+
upgrade

V4.4.5(包含升级脚本)

FastGPT V4.4.5 更新

执行初始化 API

发起 1 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的)

  1. https://xxxxx/api/admin/initv445
+  curl --location --request POST 'https://{{host}}/api/admin/initv445' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

初始化了 variable 模块,将其合并到用户引导模块中。

功能介绍

Fast GPT V4.4.5

  1. 新增 - 下一步指引选项,可以通过模型生成 3 个预测问题。
  2. 商业版新增 - 分享链接限制及 hook 身份校验(可对接已有的用户系统)。
  3. 商业版新增 - Api Key 使用。增加别名、额度限制和过期时间。自带 appId,无需额外连接。
  4. 优化 - 全局变量与开场白合并成同一模块。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/446/index.html b/docs/development/upgrading/446/index.html new file mode 100644 index 000000000000..f71ced1b6073 --- /dev/null +++ b/docs/development/upgrading/446/index.html @@ -0,0 +1,44 @@ +V4.4.6 | FastGPT
+
upgrade

V4.4.6

FastGPT V4.4.6 更新

功能介绍

  1. 高级编排新增模块 - 应用调用,可调用其他应用。
  2. 新增 - 必要连接校验
  3. 修复 - 下一步指引在免登录中身份问题。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/447/index.html b/docs/development/upgrading/447/index.html new file mode 100644 index 000000000000..56569b688f9d --- /dev/null +++ b/docs/development/upgrading/447/index.html @@ -0,0 +1,48 @@ +V4.4.7(需执行升级脚本) | FastGPT
+
V4.4.7(需执行升级脚本)
upgrade

V4.4.7(需执行升级脚本)

FastGPT V4.4.7 更新(需执行升级脚本)

执行初始化 API

发起 1 个 HTTP 请求({{rootkey}} 替换成环境变量里的rootkey,{{host}}替换成自己域名)

  1. https://xxxxx/api/admin/initv447
+  curl --location --request POST 'https://{{host}}/api/admin/initv447' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

初始化 pg 索引以及将 file_id 中空对象转成 manual 对象。如果数据多,可能需要较长时间,可以通过日志查看进度。

功能介绍

Fast GPT V4.4.7

  1. 优化了数据库文件 crud。
  2. 兼容链接读取,作为 source。
  3. 区分手动录入和标注,可追数据至某个文件。
  4. 升级 openai sdk。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/45/index.html b/docs/development/upgrading/45/index.html new file mode 100644 index 000000000000..742e30676568 --- /dev/null +++ b/docs/development/upgrading/45/index.html @@ -0,0 +1,79 @@ +V4.5(需进行较为复杂更新) | FastGPT
+
upgrade

V4.5(需进行较为复杂更新)

FastGPT V4.5 更新

FastGPT V4.5 引入 PgVector0.5 版本的 HNSW 索引,极大的提高了知识库检索的速度,比起IVFFlat索引大致有3~10倍的性能提升,可轻松实现百万数据毫秒级搜索。缺点在于构建索引的速度非常慢,4c16g 500w 组数据使用并行构建大约花了 48 小时。具体参数配置可参考 PgVector官方

下面需要对数据库进行一些操作升级:

PgVector升级:Sealos 部署方案

  1. 点击Sealos桌面的数据库应用。
  2. 点击【pg】数据库的详情。
  3. 点击右上角的重启,等待重启完成。
  4. 点击左侧的一键链接,等待打开 Terminal。
  5. 依次输入下方 sql 命令
+  -- 升级插件名
+ALTER EXTENSION vector UPDATE;
+-- 插件是否升级成功,成功的话,vector插件版本为 0.5.0,旧版的为 0.4.1
+\dx
+
+-- 下面两个语句会设置 pg 在构建索引时可用的内存大小,需根据自身的数据库规格来动态配置,可配置为 1/4 的内存大小
+alter system set maintenance_work_mem = '2400MB'; 
+select pg_reload_conf();
+
+-- 重构数据库索引和排序
+REINDEX DATABASE postgres;
+
+-- 开始构建索引,该索引构建时间非常久,直接点击右上角的叉,退出 Terminal 即可
+CREATE INDEX CONCURRENTLY vector_index ON modeldata USING hnsw (vector vector_ip_ops) WITH (m = 16, ef_construction = 64);
+-- 可以再次点击一键链接,进入 Terminal,输入下方命令,如果看到 "vector_index" hnsw (vector vector_ip_ops) WITH (m='16', ef_construction='64') 则代表构建完成(注意,后面没有 INVALID)
+\d modeldata
+  

PgVector升级:Docker-compose.yml 部署方案

下面的命令是基于给的 docker-compose 模板,如果数据库账号密码更换了,请自行调整。

  1. 修改 docker-compose.yml 中pg的镜像版本,改成 ankane/pgvector:v0.5.0registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.5.0
  2. 重启 pg 容器(docker-compose pull && docker-compose up -d),等待重启完成。
  3. 进入容器: docker exec -it pg bash
  4. 连接数据库: psql 'postgresql://username:password@localhost:5432/postgres'
  5. 执行下面 sql 命令
+  -- 升级插件名
+ALTER EXTENSION vector UPDATE;
+-- 插件是否升级成功,成功的话,vector插件版本为 0.5.0,旧版的为 0.4.2
+\dx
+
+-- 下面两个语句会设置 pg 在构建索引时可用的内存大小,需根据自身的数据库规格来动态配置,可配置为 1/4 的内存大小
+alter system set maintenance_work_mem = '2400MB'; 
+select pg_reload_conf();
+
+-- 重构数据库索引和排序
+REINDEX DATABASE postgres;
+ALTER DATABASE postgres REFRESH COLLATION VERSION;
+
+-- 开始构建索引,该索引构建时间非常久,直接关掉终端即可,不要使用 ctrl+c 关闭
+CREATE INDEX CONCURRENTLY vector_index ON modeldata USING hnsw (vector vector_ip_ops) WITH (m = 16, ef_construction = 64);
+-- 可以再次连接数据库,输入下方命令。如果看到 "vector_index" hnsw (vector vector_ip_ops) WITH (m='16', ef_construction='64') 则代表构建完成(注意,后面没有 INVALID)
+\d modeldata
+  

版本新功能介绍

Fast GPT V4.5

  1. 新增 - 升级 PgVector 插件,引入 HNSW 索引,极大加快的知识库搜索速度。
  2. 新增 - AI对话模块,增加【返回AI内容】选项,可控制 AI 的内容不直接返回浏览器。
  3. 新增 - 支持问题分类选择模型
  4. 优化 - TextSplitter,采用递归拆解法。
  5. 优化 - 高级编排 UX 性能
  6. 修复 - 分享链接鉴权问题

该版本需要修改 config.json 文件

最新配置可参考: V45版本最新 config.json

+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/451/index.html b/docs/development/upgrading/451/index.html new file mode 100644 index 000000000000..b519eefdf30b --- /dev/null +++ b/docs/development/upgrading/451/index.html @@ -0,0 +1,48 @@ +V4.5.1(需进行初始化) | FastGPT
+
upgrade

V4.5.1(需进行初始化)

FastGPT V4.5.1 更新

执行初始化 API

发起 1 个 HTTP 请求({{rootkey}} 替换成环境变量里的rootkey,{{host}}替换成自己域名)

  1. https://xxxxx/api/admin/initv451
+  curl --location --request POST 'https://{{host}}/api/admin/initv451' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

初始化内容:

  1. rename 数据库字段
  2. 初始化 Mongo APP 表中知识库的相关字段
  3. 初始化 PG 和 Mongo 的内容,为每个文件创建一个集合(存储 Mongo 中),并反馈赋值给 PG。

该初始化接口可能速度很慢,返回超时不用管,注意看日志即可

功能介绍

Fast GPT V4.5.1

  1. 新增知识库文件夹管理
  2. 修复了 openai4.x sdk 无法兼容 oneapi 的智谱和阿里的接口。
  3. 修复部分模块无法触发完成事件
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/452/index.html b/docs/development/upgrading/452/index.html new file mode 100644 index 000000000000..250a46315d5f --- /dev/null +++ b/docs/development/upgrading/452/index.html @@ -0,0 +1,44 @@ +V4.5.2 | FastGPT
+
upgrade

V4.5.2

FastGPT V4.5.2 更新

功能介绍

Fast GPT V4.5.2

  1. 新增 - 模块插件,允许自行组装插件进行模块复用。
  2. 优化 - 知识库引用提示。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/46/index.html b/docs/development/upgrading/46/index.html new file mode 100644 index 000000000000..7296b92230f9 --- /dev/null +++ b/docs/development/upgrading/46/index.html @@ -0,0 +1,60 @@ +V4.6(包含升级脚本) | FastGPT
+
upgrade

V4.6(包含升级脚本)

FastGPT V4.6 更新

V4.6 版本加入了简单的团队功能,可以邀请其他用户进来管理资源。该版本升级后无法执行旧的升级脚本,且无法回退。

1。更新镜像并变更配置文件

更新镜像至 latest 或者 v4.6 版本。商业版镜像更新至 V0.2.1

最新配置可参考:V46 版本最新 config.json,商业镜像配置文件也更新,参考最新的飞书文档。

2。执行初始化 API

发起 2 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名)

该初始化接口可能速度很慢,返回超时不用管,注意看日志即可,需要注意的是,需确保 initv46 成功后,在执行 initv46-2

  1. https://xxxxx/api/admin/initv46
+  curl --location --request POST 'https://{{host}}/api/admin/initv46' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  
  1. https://xxxxx/api/admin/initv46-2
+  curl --location --request POST 'https://{{host}}/api/admin/initv46-2' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

初始化内容: +1。创建默认团队 +2。初始化 Mongo 所有资源的团队字段 +3。初始化 Pg 的字段 +4。初始化 Mongo Data

V4.6 功能介绍

  1. 新增 - 团队空间
  2. 新增 - 多路向量 (多个向量映射一组数据)
  3. 新增 - tts 语音
  4. 新增 - 支持知识库配置文本预处理模型
  5. 线上环境新增 - ReRank 向量召回,提高召回精度
  6. 优化 - 知识库导出,可直接触发流下载,无需等待转圈圈

4.6 缺陷修复

旧的 4.6 版本由于缺少一个字段,导致文件导入时知识库数据无法显示,可执行下面的脚本:

https://xxxxx/api/admin/initv46-fix

+  curl --location --request POST 'https://{{host}}/api/admin/initv46-fix' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/461/index.html b/docs/development/upgrading/461/index.html new file mode 100644 index 000000000000..de77ddaf5bb7 --- /dev/null +++ b/docs/development/upgrading/461/index.html @@ -0,0 +1,44 @@ +V4.6.1 | FastGPT
+
upgrade

V4.6.1

FastGPT V4.6 .1

V4.6.1 功能介绍

  1. 新增 - GPT4-v 模型支持
  2. 新增 - whisper 语音输入
  3. 优化 - TTS 流传输
  4. 优化 - TTS 缓存
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/462/index.html b/docs/development/upgrading/462/index.html new file mode 100644 index 000000000000..6c143e03a905 --- /dev/null +++ b/docs/development/upgrading/462/index.html @@ -0,0 +1,48 @@ +V4.6.2(包含升级脚本) | FastGPT
+
upgrade

V4.6.2(包含升级脚本)

FastGPT V4.6.2

1。执行初始化 API

发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名)

  1. https://xxxxx/api/admin/initv462
+  curl --location --request POST 'https://{{host}}/api/admin/initv462' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

初始化说明:

  1. 初始化全文索引

V4.6.2 功能介绍

  1. 新增 - 全文索引(需配合 Rerank 模型,在看怎么放到开源版,模型接口比较特殊)
  2. 新增 - 插件来源(预计4.7/4.8版本会正式使用)
  3. 优化 - PDF读取
  4. 优化 - docx文件读取,转成 markdown 并保留其图片内容
  5. 修复和优化 TextSplitter 函数
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/463/index.html b/docs/development/upgrading/463/index.html new file mode 100644 index 000000000000..09afa43b7437 --- /dev/null +++ b/docs/development/upgrading/463/index.html @@ -0,0 +1,48 @@ +V4.6.3(包含升级脚本) | FastGPT
+
upgrade

V4.6.3(包含升级脚本)

FastGPT V4.6.3

1。执行初始化 API

发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名)

  1. https://xxxxx/api/admin/initv463
+  curl --location --request POST 'https://{{host}}/api/admin/initv463' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

初始化说明:

  1. 初始化Mongo 中 dataset,collection 和 data 的部分字段

V4.6.3 功能介绍

  1. 商业版新增 - web站点同步
  2. 新增 - 集合元数据记录
  3. 优化 - url 读取内容
  4. 优化 - 流读取文件,防止内存溢出
  5. 优化 - 4v模型自动将 url 转 base64,本地也可调试
  6. 优化 - 图片压缩等级
  7. 修复 - 图片压缩失败报错,防止文件读取过程卡死。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/464/index.html b/docs/development/upgrading/464/index.html new file mode 100644 index 000000000000..446c1c2a90a4 --- /dev/null +++ b/docs/development/upgrading/464/index.html @@ -0,0 +1,48 @@ +V4.6.4(包含升级脚本) | FastGPT
+
upgrade

V4.6.4(包含升级脚本)

FastGPT V4.6.4

1。执行初始化 API

发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名)

  1. https://xxxxx/api/admin/initv464
+  curl --location --request POST 'https://{{host}}/api/admin/initv464' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

初始化说明:

  1. 初始化 PG 的createTime字段
  2. 初始化 Mongo 中 chat 的 feedback 字段

V4.6.4 功能介绍

  1. 重写 - 分享链接身份逻辑,采用 localID 记录用户的ID。
  2. 商业版新增 - 分享链接 SSO 方案,通过身份鉴权地址,仅需3个接口即可完全接入已有用户系统。具体参考分享链接身份鉴权
  3. 新增 - 分享链接更多嵌入方式提示,更多DIY方式。
  4. 优化 - 历史记录模块。弃用旧的历史记录模块,直接在对应地方填写数值即可。
  5. 调整 - 知识库搜索模块 topk 逻辑,采用 MaxToken 计算,兼容不同长度的文本块
  6. 调整鉴权顺序,提高 apikey 的优先级,避免cookie抢占 apikey 的鉴权。
  7. 链接读取支持多选择器。参考Web 站点同步用法
  8. 修复 - 分享链接图片上传鉴权问题
  9. 修复 - Mongo 连接池未释放问题。
  10. 修复 - Dataset Intro 无法更新
  11. 修复 - md 代码块问题
  12. 修复 - root 权限问题
  13. 优化 docker file
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/465/index.html b/docs/development/upgrading/465/index.html new file mode 100644 index 000000000000..89813421dde9 --- /dev/null +++ b/docs/development/upgrading/465/index.html @@ -0,0 +1,44 @@ +V4.6.5(需要改配置文件) | FastGPT
+
V4.6.5(需要改配置文件)
upgrade

V4.6.5(需要改配置文件)

FastGPT V4.6.5

配置文件变更

由于 openai 已开始弃用 function call,改为 toolChoice。FastGPT 同步的修改了对于的配置和调用方式,需要对配置文件做一些修改:

点击查看最新的配置文件

  1. 主要是修改模型的functionCall字段,改成toolChoice即可。设置为true的模型,会默认走 openai 的 tools 模式;未设置或设置为false的,会走提示词生成模式。

问题优化模型与内容提取模型使用同一组配置。

  1. 增加 "ReRankModels": []

V4.6.5 功能介绍

  1. 新增 - 问题优化模块
  2. 新增 - 文本编辑模块
  3. 新增 - 判断器模块
  4. 新增 - 自定义反馈模块
  5. 新增 - 【内容提取】模块支持选择模型,以及字段枚举
  6. 优化 - docx读取,兼容表格(表格转markdown)
  7. 优化 - 高级编排连接线交互
  8. 优化 - 由于 html2md 导致的 cpu密集计算,阻断线程问题
  9. 修复 - 高级编排提示词提取描述
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/466/index.html b/docs/development/upgrading/466/index.html new file mode 100644 index 000000000000..a895bbca3af0 --- /dev/null +++ b/docs/development/upgrading/466/index.html @@ -0,0 +1,44 @@ +V4.6.6(需要改配置文件) | FastGPT
+
upgrade

V4.6.6(需要改配置文件)

FastGPT V4.6.6

配置文件变更

为了减少代码重复度,我们对配置文件做了一些修改:点击查看最新的配置文件

商业版变更

  1. 更新商业版镜像到 4.6.6 版本。

  2. 将旧版配置文件中的 SystemParams.pluginBaseUrl 放置到环境变量中:

    PRO_URL=商业版镜像地址(此处不再需要以 /api 结尾),例如:
    PRO_URL=http://fastgpt-plugin.ns-hsss5d.svc.cluster.local:3000

  3. 原本在配置文件中的 FeConfig 已被移除,可以直接打开新的商业版镜像外网地址进行配置。包括 FastGPT 的各个参数和模型都可以直接在商业版镜像中配置,无需再变更 config.json 文件。

V4.6.6 更新说明

  1. 查看 FastGPT 2024 RoadMap
  2. 新增 - Http 模块请求头支持 Json 编辑器。
  3. 新增 - ReRank模型部署
  4. 新增 - 搜索方式:分离向量语义检索,全文检索和重排,通过 RRF 进行排序合并。
  5. 优化 - 问题分类提示词,id引导。测试国产商用 api 模型(百度阿里智谱讯飞)使用 Prompt 模式均可分类。
  6. UI 优化,未来将逐步替换新的UI设计。
  7. 优化代码:Icon 抽离和自动化获取。
  8. 修复 - 链接读取的数据集,未保存选择器,导致同步时不使用选择器。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/467/index.html b/docs/development/upgrading/467/index.html new file mode 100644 index 000000000000..8627ee6d64c1 --- /dev/null +++ b/docs/development/upgrading/467/index.html @@ -0,0 +1,48 @@ +V4.6.7(需要初始化) | FastGPT
+
upgrade

V4.6.7(需要初始化)

FastGPT V4.6.7

1。执行初始化 API

发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名)

  1. https://xxxxx/api/admin/initv467
+  curl --location --request POST 'https://{{host}}/api/admin/initv467' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

初始化说明:

  1. 将 images 重新关联到数据集
  2. 设置 pg 表的 null 值。

V4.6.7 更新说明

  1. 修改了知识库UI及新的导入交互方式。
  2. 优化知识库和对话的数据索引。
  3. 知识库 openAPI,支持通过 API 操作知识库
  4. 新增 - 输入框变量提示。输入 { 号后将会获得可用变量提示。根据社区针对高级编排的反馈,我们计划于 2 月份的版本中,优化变量内容,支持模块的局部变量以及更多全局变量写入。
  5. 优化 - 切换团队后会保存记录,下次登录时优先登录该团队。
  6. 修复 - API 对话时,chatId 冲突问题。
  7. 修复 - Iframe 嵌入网页可能导致的 window.onLoad 冲突。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/468/index.html b/docs/development/upgrading/468/index.html new file mode 100644 index 000000000000..2fdee6610dd3 --- /dev/null +++ b/docs/development/upgrading/468/index.html @@ -0,0 +1,98 @@ +V4.6.8(需要初始化) | FastGPT
+
upgrade

V4.6.8(需要初始化)

FastGPT V4.6.8更新说明

docker 部署 - 手动更新 Mongo

  1. 修改 docker-compose.yml 的mongo部分,补上commandentrypoint
+  mongo:
+    image: mongo:5.0.18
+    # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
+    container_name: mongo
+    ports:
+      - 27017:27017
+    networks:
+      - fastgpt
+    command: mongod --keyFile /data/mongodb.key --replSet rs0
+    environment:
+      # 这里密码注意要和以前的一致
+      - MONGO_INITDB_ROOT_USERNAME=username
+      - MONGO_INITDB_ROOT_PASSWORD=password
+    volumes:
+      - ./mongo/data:/data/db
+    entrypoint:
+      - bash
+      - -c
+      - |
+        openssl rand -base64 128 > /data/mongodb.key
+        chmod 400 /data/mongodb.key
+        chown 999:999 /data/mongodb.key
+        echo 'const isInited = rs.status().ok === 1
+        if(!isInited){
+          rs.initiate({
+              _id: "rs0",
+              members: [
+                  { _id: 0, host: "mongo:27017" }
+              ]
+          })
+        }' > /data/initReplicaSet.js
+        # 启动MongoDB服务
+        exec docker-entrypoint.sh "$@" &
+
+        # 等待MongoDB服务启动
+        until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
+          echo "Waiting for MongoDB to start..."
+          sleep 2
+        done
+
+        # 执行初始化副本集的脚本
+        mongo -u myusername -p mypassword --authenticationDatabase admin /data/initReplicaSet.js
+
+        # 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
+        wait $!
+  
  1. 重启 MongoDB
+  # 重启 Mongo
+docker-compose down
+docker-compose up -d
+  

Sealos 部署 - 无需更新 Mongo

修改配置文件

去除了重复的模型配置,LLM模型都合并到一个属性中:点击查看最新的配置文件

商业版初始化

商业版用户需要执行一个初始化,格式化团队信息。

发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成商业版域名)

+  curl --location --request POST 'https://{{host}}/api/init/v468' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会初始化计费系统,内部使用可把免费的存储拉大。

V4.6.8 更新说明

  1. 新增 - 知识库搜索合并模块。
  2. 新增 - 新的 Http 模块,支持更加灵活的参数传入。同时支持了输入输出自动数据类型转化,例如:接口输出的 JSON 类型会自动转成字符串类型,直接给其他模块使用。此外,还补充了一些例子,可在文档中查看。
  3. 优化 - 内容补全。将内容补全内置到【知识库搜索】中,并实现了一次内容补全,即可完成“指代消除”和“问题扩展”。FastGPT知识库搜索详细流程可查看:知识库搜索介绍
  4. 优化 - LLM 模型配置,不再区分对话、分类、提取模型。同时支持模型的默认参数,避免不同模型参数冲突,可通过defaultConfig传入默认的配置。
  5. 优化 - 流响应,参考了ChatNextWeb的流,更加丝滑。此外,之前提到的乱码、中断,刷新后又正常了,可能会修复)
  6. 修复 - 语音输入文件无法上传。
  7. 修复 - 对话框重新生成无法使用。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/469/index.html b/docs/development/upgrading/469/index.html new file mode 100644 index 000000000000..fea9fa31cf56 --- /dev/null +++ b/docs/development/upgrading/469/index.html @@ -0,0 +1,51 @@ +V4.6.9(包含升级脚本) | FastGPT
+
upgrade

V4.6.9(包含升级脚本)

FastGPT V4.6.9更新说明

修改商业版环境变量

增加 oneapi 地址和令牌。

+  OPENAI_BASE_URL=http://oneapi:3000/v1
+CHAT_API_KEY=sk-fastgpt
+  

初始化脚本

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成自己域名

+  curl --location --request POST 'https://{{host}}/api/admin/initv469' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  
  1. 重置计量表。
  2. 执行脏数据清理(清理无效的文件、清理无效的图片、清理无效的知识库集合、清理无效的向量)

外部接口更新

  1. 由于计费系统变更,分享链接对话上报接口需要做一些调整,price字段被totalPoints字段取代。inputToken和outputToken不再提供,只提供token字段(总token数量)。

V4.6.9 更新说明

  1. 商业版新增 - 知识库新增“增强处理”训练模式,可生成更多类型索引。
  2. 新增 - 完善了HTTP模块的变量提示。
  3. 新增 - HTTP模块支持OpenAI单接口导入。
  4. 新增 - 全局变量支持增加外部变量。可通过分享链接的Query或 API 的 variables 参数传入。
  5. 新增 - 内容提取模块增加默认值。
  6. 优化 - 问题补全。增加英文类型。同时可以设置为单独模块,方便复用。
  7. 优化 - 重写了计量模式
  8. 优化 - Token 过滤历史记录,保持偶数条,防止部分模型报错。
  9. 优化 - 分享链接SEO,可直接展示应用名和头像。
  10. 修复 - 标注功能。
  11. 修复 - qa生成线程计数错误。
  12. 修复 - 问题分类连线类型错误
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/47/index.html b/docs/development/upgrading/47/index.html new file mode 100644 index 000000000000..e8ea32fdd3aa --- /dev/null +++ b/docs/development/upgrading/47/index.html @@ -0,0 +1,59 @@ +V4.7(需要初始化) | FastGPT
+
upgrade

V4.7(需要初始化)

FastGPT V4.7更新说明

1. 修改配置文件

增加一些 Boolean 值,用于决定不同功能块可以使用哪些模型,同时增加了模型的 logo:点击查看最新的配置文件

2. 初始化脚本

升级完镜像后。从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成自己域名

+  curl --location --request POST 'https://{{host}}/api/admin/initv47' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

脚本功能:

  1. 初始化插件的 parentId

3. 升级 ReRank 模型

4.7对ReRank模型进行了格式变动,兼容 cohere 的格式,可以直接使用 cohere 提供的 API。如果是本地的 ReRank 模型,需要修改镜像为:registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1

cohere的重排模型对中文不是很好,感觉不如 bge 的好用,接入教程如下:

  1. 申请 Cohere 官方 Key: https://dashboard.cohere.com/api-keys
  2. 修改 FastGPT 配置文件
+  {
+    "reRankModels": [
+        {
+            "model": "rerank-multilingual-v2.0", // 这里的 model 需要对应 cohere 的模型名
+            "name": "检索重排", // 随意
+            "requestUrl": "https://api.cohere.ai/v1/rerank",
+            "requestAuth": "Coherer上申请的key"
+        }
+    ]
+}
+  

V4.7 更新说明

  1. 新增 - 工具调用模块,可以让LLM模型根据用户意图,动态的选择其他模型或插件执行。
  2. 新增 - 分类和内容提取支持 functionCall 模式。部分模型支持 functionCall 不支持 ToolCall,也可以使用了。需要把 LLM 模型配置文件里的 functionCall 设置为 truetoolChoice设置为 false。如果 toolChoice 为 true,会走 tool 模式。
  3. 新增 - HTTP插件,可实现OpenAPI快速生成插件。
  4. 新增 - Rerank 模型兼容 cohere的格式,可以直接使用 cohere 的 rerank 模型。
  5. 新增 - Helm 安装。
  6. 优化 - 高级编排性能。
  7. 优化 - 抽离 Flow controller 到 packages。
  8. 优化 - AI模型选择。
  9. 优化 - 手动输入知识库弹窗。
  10. 优化 - 变量输入弹窗。
  11. 优化 - docker 部署,自动初始化副本集。
  12. 优化 - 浏览器读取文件自动推断编码,减少乱码情况。
  13. 修复 - 开源版重排选不上。
  14. 修复 - http 请求 body,不使用时,传入undefined。(会造成部分GET请求失败)
  15. 新增 - 支持 http url 使用变量。
  16. 修复 - 469 的提取的提示词容易造成幻觉。
  17. 修复 - PG HNSW索引未实际生效问题,本次更新后,搜索速度大幅度提升(但是可能会出现精度损失,如果出现精度损失需要参考PgVector文档,对索引进行调整)。详细见:https://github.com/pgvector/pgvector?tab=readme-ov-file#troubleshooting
  18. 修复Safari浏览器语音输入问题。
  19. 修复 - 自定义分割规则可输入正则特殊字符(之前输入的话,会导致前端崩溃)
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/471/index.html b/docs/development/upgrading/471/index.html new file mode 100644 index 000000000000..f944dbbc9994 --- /dev/null +++ b/docs/development/upgrading/471/index.html @@ -0,0 +1,48 @@ +V4.7.1(包含升级脚本) | FastGPT
+
upgrade

V4.7.1(包含升级脚本)

FastGPT V4.7.1 更新说明

初始化脚本

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT的域名。

+  curl --location --request POST 'https://{{host}}/api/admin/clearInvalidData' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

该请求会执行脏数据清理(清理无效的文件、清理无效的图片、清理无效的知识库集合、清理无效的向量)

修改配置文件

增加了Laf环境配置:点击查看最新的配置文件

V4.7.1 更新说明

  1. 新增 - 语音输入完整配置。支持选择是否打开语音输入(包括分享页面),支持语音输入后自动发送,支持语音输入后自动语音播放(流式)。
  2. 新增 - pptx 和 xlsx 文件读取。但所有文件读取都放服务端,会消耗更多的服务器资源,以及无法在上传时预览更多内容。
  3. 新增 - 集成 Laf 云函数,可以读取 Laf 账号中的云函数作为 HTTP 模块。
  4. 新增 - 定时器,清理垃圾数据。(采用小范围清理,会清理最近n个小时的,所以请保证服务持续运行,长时间不允许,可以继续执行 clearInvalidData 的接口进行全量清理。)
  5. 商业版新增 - 后台配置系统通知。
  6. 优化 - 支持ip模式导出知识库。
  7. 修改 - csv导入模板,取消 header 校验,自动获取前两列。
  8. 修复 - 工具调用模块连线数据类型校验错误。
  9. 修复 - 自定义索引输入时,解构数据失败。
  10. 修复 - rerank 模型数据格式。
  11. 修复 - 问题补全历史记录BUG
  12. 修复 - 分享页面特殊情况下加载缓慢问题(由于ssr时候数据库不会触发连接)
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/48/index.html b/docs/development/upgrading/48/index.html new file mode 100644 index 000000000000..b89918c365b0 --- /dev/null +++ b/docs/development/upgrading/48/index.html @@ -0,0 +1,45 @@ +V4.8 | FastGPT
+
upgrade

V4.8

FastGPT V4.8 更新说明

新工作流

FastGPT workflow V2上线,支持更加简洁的工作流模式。

给应用和插件增加了 version 的字段,用于标识是旧工作流还是新工作流。当你更新 4.8 后,保存和新建的工作流均为新版,旧版工作流会有一个重置的弹窗提示。并且,如果是通过 API 和 分享链接 调用的工作流,仍可以正常使用,直到你下次保存它们。

商业版配置更新

商业版用户如果配置了邮件验证码,需要在管理端 -> 项目配置 -> 登录配置 -> 邮箱登录配置 -> 修改 邮箱服务SMTP地址,之前只能配置别名,现在可以配置自定义的地址。下面是一组别名和实际地址关系:

qq: smtp.qq.com +gmail: smtp.gmail.com

V4.8 更新说明

  1. 重构 - 工作流
  2. 新增 - 判断器。支持 if elseIf else 判断。 @newfish-cmyk (preview版本的if else节点需要删除重建)
  3. 新增 - 变量更新节点。支持更新运行中工作流输出变量,或更新全局变量。@newfish-cmyk
  4. 新增 - 工作流自动保存和版本管理。
  5. 新增 - 工作流 Debug 模式,可以调试单个节点或者逐步调试工作流。
  6. 新增 - 定时执行应用。可轻松实现定时任务。
  7. 新增 - 插件自定义输入优化,可以渲染输入组件。
  8. 新增 - 分享链接发送对话前 hook https://github.com/labring/FastGPT/pull/1252 @gaord
  9. 优化 - 工作流连线,可以四向连接,方便构建循环工作流。
  10. 优化 - 工作流上下文传递,性能🚀。
  11. 优化 - ctrl和alt+enter换行,换行符位置不正确。
  12. 优化 - chat中存储变量配置。避免修改变量后,影响旧的对话。
  13. 优化 - 简易模式,更新配置后自动更新调试框内容,无需保存。
  14. 优化 - worker进程管理,并将计算 Token 任务分配给 worker 进程。
  15. 优化 - 工具调用支持指定字段数据类型(string, boolean, number) https://github.com/labring/FastGPT/issues/1236
  16. 优化 - completions接口size限制 https://github.com/labring/FastGPT/issues/1241
  17. 优化 - Node api 中间件。优化 api 端代码。@c121914yu
  18. 优化 - 对话记录保持为偶数进行截取,避免部分模型不支持奇数的历史记录,最大长度增加到50轮。 https://github.com/labring/FastGPT/issues/1384
  19. 优化 - HTTP节点错误后终止进程 https://github.com/labring/FastGPT/issues/1290
  20. 修复 - 工具调用时候,name不能是数字开头(随机数有概率数字开头)@c121914yu
  21. 修复 - 分享链接, query 全局变量会被缓存。 @c121914yu
  22. 修复 - 工具调用字段兼容。 https://github.com/labring/FastGPT/issues/1253
  23. 修复 - HTTP 模块url光标问题 https://github.com/labring/FastGPT/issues/1334 @maquannene
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/481/index.html b/docs/development/upgrading/481/index.html new file mode 100644 index 000000000000..2ab76bced0d3 --- /dev/null +++ b/docs/development/upgrading/481/index.html @@ -0,0 +1,53 @@ +V4.8.1(包含升级脚本) | FastGPT
+
upgrade

V4.8.1(包含升级脚本)

FastGPT V4.8.1 更新说明

初始化脚本

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT的域名。

+  curl --location --request POST 'https://{{host}}/api/admin/initv481' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

由于之前集合名不规范,该初始化会重置表名。请在初始化前,确保 dataset.trainings 表没有数据。 +最好更新该版本时,暂停所有进行中业务,再进行初始化,避免数据冲突。

执行脏数据清理

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT的域名。

+  curl --location --request POST 'https://{{host}}/api/admin/clearInvalidData' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

初始化完后,可以执行这个命令。之前定时清理的定时器有些问题,部分数据没被清理,可以手动执行清理。

V4.8.1 更新说明

使用 Chat api 接口需要注意,增加了 event: updateVariables 事件,用于更新变量。

点击查看升级说明

+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/4810/index.html b/docs/development/upgrading/4810/index.html new file mode 100644 index 000000000000..9c0dff891fb5 --- /dev/null +++ b/docs/development/upgrading/4810/index.html @@ -0,0 +1,51 @@ +V4.8.10(包含升级脚本) | FastGPT
+
upgrade

V4.8.10(包含升级脚本)

FastGPT V4.8.10 更新说明

更新指南

1. 做好数据备份

2. 商业版 —— 修改环境变量

  1. 需要给fastgpt-pro镜像,增加沙盒的环境变量:SANDBOX_URL=http://xxxxx:3000
  2. fastgpt-pro镜像和fastgpt镜像增加环境变量,以便更好的存储系统日志:
+  LOG_LEVEL=debug
+STORE_LOG_LEVEL=warn
+  

3. 修改镜像tag

  • 更新 FastGPT 镜像 tag: v4.8.10
  • 更新 FastGPT 商业版镜像 tag: v4.8.10
  • Sandbox 镜像,可以不更新

4. 执行初始化

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名

+  curl --location --request POST 'https://{{host}}/api/admin/initv4810' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  
  1. 初始化发布记录版本标记
  2. 初始化开票记录

V4.8.10 更新说明

完整内容请见:4.8.10 release

  1. 新增 - 模板市场。
  2. 新增 - 工作流节点拖动自动对齐吸附。
  3. 新增 - 用户选择节点(Debug 模式暂未支持)。
  4. 新增 - 工作流增加 uid 全局变量。
  5. 新增 - 工作流撤销和重做。
  6. 新增 - 工作流本次编辑记录,取代自动保存。
  7. 新增 - 工作流版本支持重命名。
  8. 新增 - 工作流的“应用调用”节点弃用,迁移成单独节点,与插件使用方式相同,同时可以传递全局变量和用户上传的文件。
  9. 新增 - 插件增加使用说明配置。
  10. 新增 - 插件自定义输入支持单选框。
  11. 新增 - HTTP 节点支持 text/plain 模式。
  12. 新增 - HTTP模块支持超时配置、支持更多的 Body 类型,params 和 headers 支持新的变量选择模式。
  13. 新增 - 工作流导出导入,支持直接导出和导入 JSON 文件,便于交流。
  14. 新增 - 发送验证码安全校验。
  15. 商业版新增 - 飞书机器人接入。
  16. 商业版新增 - 公众号接入接入。
  17. 商业版新增 - 自助开票申请。
  18. 商业版新增 - SSO 定制。
  19. 优化 - 工作流循环校验,避免 skip 循环空转。同时支持分支完全并发执行。
  20. 优化 - 工作流嵌套执行,参数可能存在的污染问题。
  21. 优化 - 部分全局变量,增加数据类型约束。
  22. 优化 - 节点选择,避免切换 tab 时候,path 加载报错。
  23. 优化 - 最新 React Markdown 组件,支持 Base64 图片。
  24. 优化 - 对话框性能问题。
  25. 优化 - 单选框打开后自动滚动到选中的位置。
  26. 优化 - 知识库集合禁用,目录禁用会递归修改其下所有 children 的禁用状态。
  27. 优化 - SSE 响应代码优化。
  28. 优化 - 无 SSL 证书情况下,优化复制。
  29. 优化 - 知识库列表 UI。
  30. 优化 - 知识库详情页 UI。
  31. 优化 - 支持无网络配置情况下运行。
  32. 优化 - 调整.env.template关于mongodb的说明,使得更易于理解。
  33. 优化 - 新的支付模式。
  34. 优化 - 用户默认头像。
  35. 修复 - Prompt 模式调用工具,stream=false 模式下,会携带 0: 开头标记。
  36. 修复 - 对话日志鉴权问题:仅为 APP 管理员的用户,无法查看对话日志详情。
  37. 修复 - 选择 Milvus 部署时,无法导出知识库。
  38. 修复 - 创建 APP 副本,无法复制系统配置。
  39. 修复 - 图片识别模式下,自动解析图片链接正则不够严谨问题。
  40. 修复 - 内容提取的数据类型与输出数据类型未一致。
  41. 修复 - 工作流运行时间统计错误。
  42. 修复 - stream 模式下,工具调用有可能出现 undefined。
  43. 修复 - reranker typo。
  44. 修复 - home host typo。
  45. 修复 - i18n display。
  46. 修复 - 全局变量可重复定义 key。
  47. 修复 - 全局变量在 Debug 模式下不可持久化。
  48. 修复 - 全局变量在 API 中无法持久化。
  49. 修复 - OpenAPI,detail=false模式下,不应该返回 tool 调用结果,仅返回文字。(可解决 cow 不适配问题)。
  50. 修复 - 知识库标签重复加载。
  51. 修复 - 网络链接重新获取时,自定义分割符不生效。
  52. 修复 - 插件运行时,会传递额外的全局变量,可能造成插件内变量污染。
  53. 文档 - qa docs。
  54. 文档 - Update feishu.md。
  55. 文档 - update baseURL。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/4811/index.html b/docs/development/upgrading/4811/index.html new file mode 100644 index 000000000000..4dada6b2cda9 --- /dev/null +++ b/docs/development/upgrading/4811/index.html @@ -0,0 +1,99 @@ +V4.8.11(商业版初始化) | FastGPT
+
upgrade

V4.8.11(商业版初始化)

FastGPT V4.8.11 更新说明

更新指南

1. 做好数据备份

2. 修改配置文件

如需增加 openai o1 模型,可添加如下配置:

+  {
+    "model": "o1-mini",
+    "name": "o1-mini",
+    "avatar": "/imgs/model/openai.svg",
+    "maxContext": 125000,
+    "maxResponse": 65000,
+    "quoteMaxToken": 120000,
+    "maxTemperature": 1.2,
+    "charsPointsPrice": 0,
+    "censor": false,
+    "vision": false,
+    "datasetProcess": true,
+    "usedInClassify": true,
+    "usedInExtractFields": true,
+    "usedInToolCall": true,
+    "usedInQueryExtension": true,
+    "toolChoice": false,
+    "functionCall": false,
+    "customCQPrompt": "",
+    "customExtractPrompt": "",
+    "defaultSystemChatPrompt": "",
+    "defaultConfig": {
+        "temperature": 1
+    }
+},
+{
+    "model": "o1-preview",
+    "name": "o1-preview",
+    "avatar": "/imgs/model/openai.svg",
+    "maxContext": 125000,
+    "maxResponse": 32000,
+    "quoteMaxToken": 120000,
+    "maxTemperature": 1.2,
+    "charsPointsPrice": 0,
+    "censor": false,
+    "vision": false,
+    "datasetProcess": true,
+    "usedInClassify": true,
+    "usedInExtractFields": true,
+    "usedInToolCall": true,
+    "usedInQueryExtension": true,
+    "toolChoice": false,
+    "functionCall": false,
+    "customCQPrompt": "",
+    "customExtractPrompt": "",
+    "defaultSystemChatPrompt": "",
+    "defaultConfig": {
+        "temperature": 1
+    }
+}
+  

3. 修改镜像 tag 并重启

  • 更新 FastGPT 镜像 tag: v4.8.11-fix
  • 更新 FastGPT 商业版镜像 tag: v4.8.11
  • 更新 FastGPT Sandbox 镜像 tag: v4.8.11

4. 商业版初始化

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版域名

+  curl --location --request POST 'https://{{host}}/api/admin/init/4811' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会初始化团队成员组。

V4.8.11 更新说明

  1. 新增 - 表单输入节点,允许用户在工作流中让用户输入一些信息。
  2. 新增 - 循环运行节点,可传入数组进行批量调用,目前最多支持 50 长度的数组串行执行。
  3. 新增 - 节点支持折叠。
  4. 新增 - 简易模式支持新的历史记录模式,可记录本地变更记录。
  5. 新增 - 聊天记录滚动加载,不再只加载 30 条。
  6. 新增 - 工作流增加触摸板优先模式,可以通过工作流右下角按键进行切换。
  7. 新增 - 沙盒增加字符串转 base64 全局方法(全局变量 strToBase64)。
  8. 新增 - 支持 Openai o1 模型,需增加模型的 defaultConfig 配置,覆盖 temperaturemax_tokensstream配置,o1 不支持 stream 模式。
  9. 新增 - AI 对话节点知识库引用,支持配置 role=system 和 role=user,已配置的过自定义提示词的节点将会保持 user 模式,其余用户将转成 system 模式。
  10. 新增 - 插件支持上传系统文件。
  11. 新增 - 插件输出,支持指定字段作为工具响应。
  12. 新增 - 支持工作流嵌套子应用时,可以设置非流模式,同时简易模式也可以选择工作流作为插件了,简易模式调用子应用时,都将强制使用非流模式。
  13. 新增 - 调试模式下,子应用调用,支持返回详细运行数据。
  14. 新增 - 保留所有模式下子应用嵌套调用的日志。
  15. 新增 - 对话日志显示成员。
  16. 新增 - 商业版支持后台配置 AI 生成文案提示。
  17. 新增 - Jest 单测框架。
  18. 新增 - 工具调用参数节点,可以配合工具调用完全自由声明参数。
  19. 新增 - BI 图表插件。
  20. 新增 - Surya OCR 识别模块示例。
  21. 新增 - 工作流右键新增注释。
  22. 商业版新增 - 团队成员组。
  23. 优化 - 工作流嵌套层级限制 20 层,避免因编排不合理导致的无限死循环。
  24. 优化 - 工作流 handler 性能优化。
  25. 优化 - 工作流快捷键,避免调试测试时也会触发复制和回退。
  26. 优化 - 工作流复制时,名字去掉多余“#”。
  27. 优化 - 流输出,切换浏览器 Tab 后仍可以继续输出。
  28. 优化 - 完善外部文件知识库相关 API 。
  29. 优化 - 修改 config.json 的地址。
  30. 优化 - 正确处理//开头的超链接。
  31. 优化 - 工作流 Textarea 滚轮可以正常滚动而不是缩放。
  32. 优化 - 去除部分输入框前后空格。
  33. 优化 - 工作流返回时,跳转到上一次记忆的 Tab 。
  34. 优化 - 工作流画布禁止触摸板缩放浏览器。
  35. 优化 - 工作流部分节点会自动选择用户问题作为初始值。
  36. 优化 - Prompt Editor 支持动态增高。
  37. 优化 - 自动补全工具描述。
  38. 优化 - 文档说明 configuration.md 。
  39. 优化 - IOS safari 浏览器语音输入不准确。
  40. 修复 - 知识库选择权限问题。
  41. 修复 - 空 chatId 发起对话,首轮携带用户选择时会异常。
  42. 修复 - createDataset 接口,intro 未赋值。
  43. 修复 - 对话框渲染性能问题。
  44. 修复 - Rerank 文档地址。
  45. 修复 - Stream 模式下使用 toolChoice,toolCall 的function 和type 可能为 null 。
  46. 修复 - 站点同步自定义分割符未同步。
  47. 修复 - 工具调用历史记录存储问题。
  48. 修复 - 对话页面可能无限重定向。
  49. 修复 - 全局变量在工具调用中未持久传递。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/4812/index.html b/docs/development/upgrading/4812/index.html new file mode 100644 index 000000000000..87622db6438f --- /dev/null +++ b/docs/development/upgrading/4812/index.html @@ -0,0 +1,52 @@ +V4.8.12(包含升级脚本) | FastGPT
+
upgrade

V4.8.12(包含升级脚本)

FastGPT V4.8.12 更新说明

更新指南

1. 做好数据备份

2. 修改镜像

  • 更新 FastGPT 镜像 tag: v4.8.12-fix
  • 更新 FastGPT 管理端镜像 tag: v4.8.12 (fastgpt-pro镜像)
  • Sandbox 镜像,可以不更新

3. 商业版执行初始化

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 管理端域名

+  curl --location --request POST 'https://{{host}}/api/admin/init/4812' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会初始化应用和知识库的成员组数据。

4. 重构 Milvus 数据

由于 js int64 精度丢失问题,之前私有化使用 milvus 或者 zilliz 的用户,如果存在数据精度丢失的问题,需要重构 Milvus 数据。(可以查看 dataset_datas 表中,indexes 中的 dataId 是否末尾精度丢失)。使用 PG 的用户不需要操作。

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 主域名

+  curl --location --request POST 'https://{{host}}/api/admin/resetMilvus' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

更新说明

  1. 新增 - 全局变量支持数字类型,支持配置默认值和部分输入框参数。
  2. 新增 - 插件自定义输入,文本输入框、数字输入框、选择框、开关,默认都支持作为变量引用。
  3. 新增 - FE_DOMAIN 环境变量,配置该环境变量后,上传文件/图片会补全后缀后得到完整地址。(可解决 docx 文件图片链接,有时模型会伪造图片域名)
  4. 新增 - 工具调用支持使用交互节点
  5. 新增 - Debug 模式支持输入全局变量
  6. 新增 - chat OpenAPI 文档
  7. 新增 - wiki 搜索插件
  8. 新增 - Google 搜索插件
  9. 新增 - 数据库连接和操作插件
  10. 新增 - Cookie 隐私协议提示
  11. 新增 - HTTP 节点支持 JSONPath 表达式
  12. 新增 - 应用和知识库支持成员组配置权限
  13. 优化 - 循环节点支持选择外部节点的变量
  14. 优化 - Docx 文件读取中, HTML to Markdown 优化,提高速度和大幅度降低内存消耗。
  15. 修复 - 文件后缀判断,去除 query 影响。
  16. 修复 - AI 响应为空时,会造成 LLM 历史记录合并。
  17. 修复 - 用户交互节点未阻塞流程。
  18. 修复 - 新建 APP,有时候会导致空指针报错。
  19. 修复 - 拥有多个循环节点时,错误运行。
  20. 修复 - 循环节点中修改变量,无法传递。
  21. 修复 - 非 stream 模式,嵌套子应用/插件执行时无法获取子应用响应。
  22. 修复 - 数据分块策略,同时将每个 Markdown 独立分块。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/4813/index.html b/docs/development/upgrading/4813/index.html new file mode 100644 index 000000000000..718d885316f1 --- /dev/null +++ b/docs/development/upgrading/4813/index.html @@ -0,0 +1,44 @@ +V4.8.13 | FastGPT
+
upgrade

V4.8.13

FastGPT V4.8.13 更新说明

更新指南

1. 做好数据备份

2. 修改镜像

  • 更新 FastGPT 镜像 tag: v4.8.13-fix
  • 更新 FastGPT 商业版镜像 tag: v4.8.13-fix (fastgpt-pro镜像)
  • Sandbox 镜像,可以不更新

3. 添加环境变量

  • 给 fastgpt 和 fastgpt-pro 镜像添加环境变量:FE_DOMAIN=http://xx.com,值为 fastgpt 前端访问地址,注意后面不要加/。可以自动补齐相对文件地址的前缀。

4. 调整文件上传编排

虽然依然兼容旧版的文件上传编排,但是未来两个版本内将会去除兼容代码,请尽快调整编排,以适应最新的文件上传逻辑。尤其是嵌套应用的文件传递,未来将不会自动传递,必须手动指定传递的文件。具体内容可参考: 文件上传变更

更新说明

  1. 新增 - 数组变量选择支持多选,可以选多个数组或对应的单一数据类型,会自动按选择顺序进行合并。
  2. 新增 - 文件上传方案调整,AI对话和工具调用节点直接支持接收文件链接,并且会强制加入提示词,无需由模型决策调用。插件自定义变量支持文件上传类型,取代全局文件。
  3. 新增 - 对话记录增加时间显示。
  4. 新增 - 工作流校验错误时,跳转至错误节点。
  5. 新增 - 循环节点增加下标值。
  6. 新增 - 部分对话错误提醒增加翻译。
  7. 新增 - 对话输入框支持拖拽文件上传,可直接拖文件到输入框中。
  8. 新增 - 对话日志,来源可显示分享链接/API具体名称
  9. 新增 - 分享链接支持配置是否展示实时运行状态。
  10. 优化 - 合并多个 system 提示词成 1 个,避免部分模型不支持多个 system 提示词。
  11. 优化 - 知识库上传文件,优化报错提示。
  12. 优化 - 全文检索语句,减少一轮子查询。
  13. 优化 - 修改 findLast 为 […array].reverse().find,适配旧版浏览器。
  14. 优化 - Markdown 组件自动空格,避免分割 url 中的中文。
  15. 优化 - 工作流上下文拆分,性能优化。
  16. 优化 - 语音播报,不支持 mediaSource 的浏览器可等待完全生成语音后输出。
  17. 优化 - 对话引导 csv 读取,自动识别编码
  18. 优化 - csv 导入问题引导可能乱码
  19. 修复 - Dockerfile pnpm install 支持代理。。
  20. 修复 - Dockerfile pnpm install 支持代理。
  21. 修复 - BI 图表生成无法写入文件。同时优化其解析,支持数字类型数组。
  22. 修复 - 分享链接首次加载时,标题显示不正确。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/4814/index.html b/docs/development/upgrading/4814/index.html new file mode 100644 index 000000000000..32dfa0dc6272 --- /dev/null +++ b/docs/development/upgrading/4814/index.html @@ -0,0 +1,44 @@ +V4.8.14 | FastGPT
+
upgrade

V4.8.14

FastGPT V4.8.14 更新说明

更新指南

1. 做好数据备份

2. 修改镜像

  • 更新 FastGPT 镜像 tag: v4.8.14-fix
  • 更新 FastGPT 商业版镜像 tag: v4.8.14 (fastgpt-pro镜像)
  • Sandbox 镜像,可以不更新

milvus版本使用:v4.8.14-milvus-fix 镜像。

新功能预览

自动触发工作流

可以允许你配置用户加载对话时,自动触发一次工作流。可以用于一些 CRM 系统,可以快速的引导用户使用,无需等待用户主动触发。

alt textalt text

完整更新内容

  1. 新增 - 工作流支持进入聊天框/点击开始对话后,自动触发一轮对话。
  2. 新增 - 重写 chatContext,对话测试也会有日志,并且刷新后不会丢失对话。
  3. 新增 - 分享链接支持配置是否允许查看原文。
  4. 新增 - 新的 doc2x 插件。
  5. 新增 - 繁体中文。
  6. 新增 - 分析链接和 chat api 支持传入自定义 uid。
  7. 商业版新增 - 微软 oauth 登录
  8. 优化 - 工作流 ui 细节。
  9. 优化 - 应用编辑记录采用 diff 存储,避免浏览器溢出。
  10. 优化 - 代码入口,增加 register 入口,无需等待首次访问才执行。
  11. 优化 - 工作流检查,增加更多缺失值检查。
  12. 优化 - 增加知识库训练最大重试次数限制。
  13. 优化 - 图片路径问题和示意图任务
  14. 优化 - Milvus description
  15. 修复 - 分块策略,四级标题会被丢失。 同时新增了五级标题的支持。
  16. 修复 - MongoDB 知识库集合唯一索引。
  17. 修复 - 反选知识库引用后可能会报错。
  18. 修复 - 简易模式转工作流,不是使用最新编辑记录进行转移。
  19. 修复 - 表单输入的说明文字不显示。
  20. 修复 - API 无法使用 base64 图片。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/4815/index.html b/docs/development/upgrading/4815/index.html new file mode 100644 index 000000000000..7c8ebea8dd2e --- /dev/null +++ b/docs/development/upgrading/4815/index.html @@ -0,0 +1,52 @@ +V4.8.15(包含升级脚本) | FastGPT
+
upgrade

V4.8.15(包含升级脚本)

FastGPT V4.8.15 更新说明

新功能预览

API 知识库

alt textalt text

HTML 渲染

源码模式预览模式全屏模式
alt textalt textalt text

升级指南

  • 更新 fastgpt 镜像 tag: v4.8.15-fix3
  • 更新 fastgpt-pro 商业版镜像 tag: v4.8.15
  • Sandbox 镜像,可以不更新

运行升级脚本

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名

+  curl --location --request POST 'https://{{host}}/api/admin/initv4815' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会重置应用定时执行的字段,把 null 去掉,减少索引大小。


从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成fastgpt-pro域名

+  curl --location --request POST 'https://{{host}}/api/admin/init/refreshFreeUser' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

重新计算一次免费版用户的时长,之前有版本升级时没有重新计算时间,导致会误发通知。

完整更新内容

  1. 新增 - API 知识库, 见 API 知识库介绍,外部文件库会被弃用。
  2. 新增 - 工具箱页面,展示所有可用的系统资源。商业版后台可更便捷的配置系统插件和自定义分类。
  3. 新增 - Markdown 中,HTML代码会被额外渲染,可以选择预览模式,会限制所有 script 脚本,仅做展示。
  4. 新增 - 自定义系统级文件解析服务, 见 接入 Marker PDF 文档解析
  5. 新增 - 集合直接重新调整参数,无需删除再导入。
  6. 新增 - 商业版后台支持配置侧边栏跳转链接。
  7. 优化 - base64 图片截取判断。
  8. 优化 - i18n cookie 判断。
  9. 优化 - 支持 Markdown 文本分割时,只有标题,无内容。
  10. 优化 - 字符串变量替换,未赋值的变量会转成 undefined,而不是保留原来 id 串。
  11. 优化 - 全局变量默认值在 API 生效,并且自定义变量支持默认值。
  12. 优化 - 增加 HTTP Body 的 JSON 解析,正则将 undefined 转 null,减少 Body 解析错误。
  13. 优化 - 定时执行增加运行日志,增加重试,减少报错概率。
  14. 修复 - 分享链接点赞鉴权问题。
  15. 修复 - 对话页面切换自动执行应用时,会误触发非自动执行应用。
  16. 修复 - 语言播放鉴权问题。
  17. 修复 - 插件应用知识库引用上限始终为 3000
  18. 修复 - 工作流编辑记录存储上限,去掉本地存储,增加异常离开时,强制自动保存。
  19. 修复 - 工作流特殊变量替换问题。($开头的字符串无法替换)
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/4816/index.html b/docs/development/upgrading/4816/index.html new file mode 100644 index 000000000000..ef5910b6eb3f --- /dev/null +++ b/docs/development/upgrading/4816/index.html @@ -0,0 +1,69 @@ +V4.8.16(更新配置文件) | FastGPT
+
upgrade

V4.8.16(更新配置文件)

FastGPT V4.8.16 更新说明

更新指南

1. 更新镜像:

  • 更新 fastgpt 镜像 tag: v4.8.16
  • 更新 fastgpt-pro 商业版镜像 tag: v4.8.16
  • Sandbox 镜像 tag: v4.8.16

2. 更新配置文件

参考最新的配置文件,更新 config.json 或 admin 中模型文件配置。给 LLMModel 和 VectorModel 增加 provider 字段,以便进行模型分类。例如:

+  {
+    "provider": "OpenAI", // 这是新增的
+    "model": "gpt-4o",
+    "name": "gpt-4o",
+    "maxContext": 125000,
+    "maxResponse": 4000,
+    "quoteMaxToken": 120000,
+    "maxTemperature": 1.2,
+    "charsPointsPrice": 0,
+    "censor": false,
+    "vision": true,
+    "datasetProcess": true,
+    "usedInClassify": true,
+    "usedInExtractFields": true,
+    "usedInToolCall": true,
+    "usedInQueryExtension": true,
+    "toolChoice": true,
+    "functionCall": false,
+    "customCQPrompt": "",
+    "customExtractPrompt": "",
+    "defaultSystemChatPrompt": "",
+    "defaultConfig": {},
+    "fieldMap": {}
+}
+  

完整更新内容

  1. 新增 - SearXNG 搜索插件点击查看教程
  2. 新增 - 商业版支持 API 知识库和链接集合定时同步。
  3. 新增 - 猜你想问支持选择模型和自定义提示词。
  4. 新增 - 钉钉和企微机器人 webhook 插件。
  5. 新增 - 商业版支持钉钉 SSO 登录配置。点击查看教程
  6. 新增 - 商业版支持飞书和语雀知识库导入。点击查看教程
  7. 新增 - sandbox 新增 createHmac 加密全局方法。
  8. 新增 - 工作流右键支持全部折叠。
  9. 优化 - 模型选择器。
  10. 优化 - SSR 渲染,预判断是移动端还是 pc 端,减少页面抖动。
  11. 优化 - 工作流/简易模式变量初始化代码,去除监听初始化,避免因渲染顺序不一致导致的失败。
  12. 优化 - 工作流获取数据类型不一致数据时,增加类型转化,避免 undefined。
  13. 修复 - 无法自动切换默认语言。增加分享链接,强制执行一次切换默认语言。
  14. 修复 - 数组选择器自动兼容 4.8.13 以前的数据。
  15. 修复 - 站点同步知识库,链接同步时未使用选择器。
  16. 修复 - 简易模式转工作流,没有把系统配置项转化。
  17. 修复 - 插件独立运行,变量初始值未赋上。
  18. 修复 - 工作流使用弹窗组件时,关闭弹窗后,有时候会出现页面偏移。
  19. 修复 - 插件调试时,日志未保存插件输入参数。
  20. 修复 - 部分模板市场模板
  21. 修复 - 设置NEXT_PUBLIC_BASE_URL时,图片文件读取URL不正确
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/4817/index.html b/docs/development/upgrading/4817/index.html new file mode 100644 index 000000000000..876b68fc9cd6 --- /dev/null +++ b/docs/development/upgrading/4817/index.html @@ -0,0 +1,48 @@ +V4.8.17(包含升级脚本) | FastGPT
+
upgrade

V4.8.17(包含升级脚本)

FastGPT V4.8.17 更新说明

更新指南

1. 更新镜像:

  • 更新 fastgpt 镜像 tag: v4.8.17-fix-title
  • 更新 fastgpt-pro 商业版镜像 tag: v4.8.17
  • Sandbox 镜像无需更新

2. 运行升级脚本

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名

+  curl --location --request POST 'https://{{host}}/api/admin/initv4817' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会将用户绑定的 OpenAI 账号移动到团队中。

调整 completions 接口返回值

/api/v1/chat/completions 接口返回值调整,对话节点、工具节点等使用到模型的节点,将不再返回 tokens 字段,改为返回 inputTokensoutputTokens 字段,分别表示输入和输出的 Token 数量。

完整更新内容

  1. 新增 - 简易模式工具调用支持数组类型插件。
  2. 新增 - 工作流增加异常离开自动保存,避免工作流丢失。
  3. 新增 - LLM 模型参数支持关闭 max_tokens 和 temperature。
  4. 新增 - 商业版支持后台配置模板市场。
  5. 新增 - 商业版支持后台配置自定义工作流变量,用于与业务系统鉴权打通。
  6. 新增 - 搜索测试接口支持问题优化。
  7. 新增 - 工作流中 Input Token 和 Output Token 分开记录展示。并修复部分请求未记录输出 Token 计费问题。
  8. 优化 - Markdown 大小测试,超出 20 万字符不使用 Markdown 组件,避免崩溃。
  9. 优化 - 知识库搜索参数,滑动条支持输入模式,可以更精准的控制。
  10. 优化 - 可用模型展示UI。
  11. 优化 - Mongo 查询语句,增加 virtual 字段。
  12. 修复 - 文件返回接口缺少 Content-Length 头,导致通过非同源文件上传时,阿里 vision 模型无法识别图片。
  13. 修复 - 去除判断器两端字符串隐藏换行符,避免判断器失效。
  14. 修复 - 变量更新节点,手动输入更新内容时候,非字符串类型数据类型无法自动转化。
  15. 修复 - 豆包模型无法工具调用。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/4818/index.html b/docs/development/upgrading/4818/index.html new file mode 100644 index 000000000000..d839bb3b68d8 --- /dev/null +++ b/docs/development/upgrading/4818/index.html @@ -0,0 +1,48 @@ +V4.8.18(进行中) | FastGPT
+
upgrade

V4.8.18(进行中)

FastGPT V4.8.18 更新说明

更新指南

2. 运行升级脚本

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名

+  curl --location --request POST 'https://{{host}}/api/admin/initv4818' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会迁移全文检索表,时间较长,迁移期间全文检索会失效,日志中会打印已经迁移的数据长度。

完整更新内容

  1. 新增 - 支持部门架构权限模式。
  2. 新增 - 支持配置自定跨域安全策略,默认全开。
  3. 优化 - 分享链接随机生成用户头像。
  4. 优化 - 图片上传安全校验。并增加头像图片唯一存储,确保不会累计存储。
  5. 优化 - Mongo 全文索引表分离。
  6. 优化 - 知识库检索查询语句合并,同时减少查库数量。
  7. 优化 - 文件编码检测,减少 CSV 文件乱码概率。
  8. 优化 - 异步读取文件内容,减少进程阻塞。
  9. 优化 - 文件阅读,HTML 直接下载,不允许在线阅读。
  10. 修复 - HTML 文件上传,base64 图片无法自动转图片链接。
  11. 修复 - 插件计费错误。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/482/index.html b/docs/development/upgrading/482/index.html new file mode 100644 index 000000000000..7cd76116ec24 --- /dev/null +++ b/docs/development/upgrading/482/index.html @@ -0,0 +1,46 @@ +V4.8.2 | FastGPT
+
upgrade

V4.8.2

FastGPT V4.8.2 更新说明

Sealos 升级说明

  1. 在应用管理中新建一个应用,镜像为:registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.1
  2. 无需外网访问地址,端口号为3000
  3. 部署完后,复制应用的内网地址
  4. 点击变更`FastGPT - 修改环境变量,增加下面的环境变量即可
+  SANDBOX_URL=内网地址
+  

Docker 部署

可以拉取最新 docker-compose.yml 文件参考

  1. 新增一个容器 sandbox
  2. fastgpt 和 fastgpt-pro(商业版) 容器新增环境变量: SANDBOX_URL
  3. sandbox 简易不要开启外网访问,未做凭证校验。

V4.8.2 更新说明

  1. 新增 - js代码运行节点(更完整的type提醒,后续继续完善)
  2. 新增 - 内容提取节点支持数据类型选择
  3. 修复 - 新增的站点同步无法使用
  4. 修复 - 定时任务无法输入内容
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/483/index.html b/docs/development/upgrading/483/index.html new file mode 100644 index 000000000000..d7719d36b6ae --- /dev/null +++ b/docs/development/upgrading/483/index.html @@ -0,0 +1,44 @@ +V4.8.3 | FastGPT
+
upgrade

V4.8.3

FastGPT V4.8.3 更新说明

升级指南

  • fastgpt 镜像 tag 修改成 v4.8.3
  • fastgpt-sandbox 镜像 tag 修改成 v4.8.3
  • 商业版镜像 tag 修改成 v4.8.3

V4.8.3 更新说明

  1. 新增 - 支持 Milvus 数据库, 可参考最新的 docker-compose-milvus.yml.
  2. 新增 - 给 chat 接口 empty answer 增加 log,便于排查模型问题。
  3. 新增 - ifelse判断器,字符串支持正则。
  4. 新增 - 代码运行支持 console.log 输出调试。
  5. 修复 - 变量更新在 Debug 模式下出错。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/484/index.html b/docs/development/upgrading/484/index.html new file mode 100644 index 000000000000..8b651242fff1 --- /dev/null +++ b/docs/development/upgrading/484/index.html @@ -0,0 +1,48 @@ +V4.8.4(包含升级脚本) | FastGPT
+
upgrade

V4.8.4(包含升级脚本)

FastGPT V4.8.4 更新说明

升级指南

1. 修改镜像

  • fastgpt 镜像 tag 修改成 v4.8.4
  • fastgpt-sandbox 镜像 tag 修改成 v4.8.4 (选择性,无变更)
  • 商业版镜像 tag 修改成 v4.8.4

2. 商业版用户执行初始化

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版的域名

+  curl --location --request POST 'https://{{host}}/api/admin/init/484' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

V4.8.4 更新说明

  1. 新增 - 应用使用新权限系统。
  2. 新增 - 应用支持文件夹。
  3. 优化 - 文本分割增加连续换行、制表符清除,避免大文本性能问题。
  4. 重要修复 - 修复系统插件运行池数据污染问题,由于从内存获取,会导致全局污染。
  5. 修复 - Debug 模式下,相同 source 和 target 内容,导致连线显示异常。
  6. 修复 - 定时执行初始化错误。
  7. 修复 - 应用调用传参异常。
  8. 修复 - ctrl + cv 复杂节点时,nodeId错误。
  9. 调整组件库全局theme。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/485/index.html b/docs/development/upgrading/485/index.html new file mode 100644 index 000000000000..cad624233b54 --- /dev/null +++ b/docs/development/upgrading/485/index.html @@ -0,0 +1,52 @@ +V4.8.5(包含升级脚本) | FastGPT
+
upgrade

V4.8.5(包含升级脚本)

FastGPT V4.8.5 更新说明

升级指南

1. 做好数据库备份

2. 修改镜像

  • fastgpt 镜像 tag 修改成 v4.8.5
  • 商业版镜像 tag 修改成 v4.8.5

3. 执行初始化

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名

+  curl --location --request POST 'https://{{host}}/api/admin/initv485' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会把插件的数据表合并到应用中,插件表不会删除。


商业版用户执行额外的初始化

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版的域名

+  curl --location --request POST 'https://{{host}}/api/admin/init/485' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会重置知识库权限系统。

V4.8.5 更新说明

  1. 新增 - 合并插件和应用,统一成工作台
  2. 新增 - 应用创建副本功能
  3. 新增 - 应用创建模板
  4. 新增 - 支持代码运行结果作为工具输出。
  5. 新增 - Markdown 图片输出,支持移动端放大缩放。
  6. 优化 - 原文件编码存取
  7. 优化 - 知识库删除后,简易模式会过滤掉删除的知识库,避免错误判断。
  8. 优化 - 文件夹读取,支持单个文件夹超出 100 个文件
  9. 优化 - 问答拆分/手动录入,当有a字段时,自动将q作为补充索引。
  10. 优化 - 对话框页面代码
  11. 优化 - 工作流新节点自动增加序号名
  12. 修复 - 定时任务无法实际关闭
  13. 修复 - 输入引导特殊字符导致正则报错
  14. 修复 - 文件包含特殊字符%,且为转义时会导致页面崩溃
  15. 修复 - 自定义输入选择知识库引用时页面崩溃
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/486/index.html b/docs/development/upgrading/486/index.html new file mode 100644 index 000000000000..96e5a26a4a9c --- /dev/null +++ b/docs/development/upgrading/486/index.html @@ -0,0 +1,48 @@ +V4.8.6(包含升级脚本) | FastGPT
+
upgrade

V4.8.6(包含升级脚本)

FastGPT V4.8.6 更新说明

升级指南

1. 做好数据库备份

2. 修改镜像

  • fastgpt 镜像 tag 修改成 v4.8.6
  • fastgpt-sandbox 镜像 tag 修改成 v4.8.6
  • 商业版镜像 tag 修改成 v4.8.6

3. 执行初始化

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名

+  curl --location --request POST 'https://{{host}}/api/admin/initv486' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会初始化应用的继承权限


V4.8.6 更新说明

  1. 新增 - 应用权限继承
  2. 新增 - 知识库支持单个集合禁用功能
  3. 新增 - 系统插件模式变更,新增链接读取和数学计算器插件,正式版会更新如何自定义系统插件
  4. 新增 - 代码沙盒运行参数
  5. 新增 - AI对话时隐藏头部的功能,主要是适配移动端
  6. 优化 - 文件读取,Mongo 默认使用从节点,减轻主节点压力
  7. 优化 - 提示词模板
  8. 优化 - Mongo model 重复加载
  9. 修复 - 创建链接集合未返回 id
  10. 修复 - 文档接口说明
  11. 修复 - api system 提示合并
  12. 修复 - 团队插件目录内的内容无法加载
  13. 修复 - 知识库集合目录面包屑无法加载
  14. 修复 - Markdown 导出对话异常
  15. 修复 - 提示模板结束标签错误
  16. 修复 - 文档描述
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/487/index.html b/docs/development/upgrading/487/index.html new file mode 100644 index 000000000000..ba88c7863a38 --- /dev/null +++ b/docs/development/upgrading/487/index.html @@ -0,0 +1,44 @@ +V4.8.7 | FastGPT
+
upgrade

V4.8.7

FastGPT V4.8.7 更新说明

升级指南

1. 做好数据库备份

2. 修改镜像

  • fastgpt 镜像 tag 修改成 v4.8.7
  • 商业版镜像 tag 修改成 v4.8.7

V4.8.7 更新说明

  1. 新增 - 插件支持独立运行,发布和日志查看
  2. 新增 - 应用搜索
  3. 优化 - 对话框代码
  4. 优化 - 升级 Dockerfile node 和 pnpm 版本
  5. 优化 - local 域名部署,也可以正常使用 vision 模式
  6. 修复 - 简易模式无法变更全局变量
  7. 修复 - gpt4o 无法同时使用工具和图片
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/488/index.html b/docs/development/upgrading/488/index.html new file mode 100644 index 000000000000..ddba3d359a57 --- /dev/null +++ b/docs/development/upgrading/488/index.html @@ -0,0 +1,48 @@ +V4.8.8(包含升级脚本) | FastGPT
+
upgrade

V4.8.8(包含升级脚本)

FastGPT V4.8.8 更新说明

升级指南

1. 做好数据库备份

2. 修改镜像

  • fastgpt 镜像 tag 修改成 v4.8.8-fix2
  • 商业版镜像 tag 修改成 v4.8.8

3. 执行初始化

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名

+  curl --location --request POST 'https://{{host}}/api/admin/initv488' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会初始化知识库的继承权限


V4.8.8 更新说明

点击查看完整更新

  1. 新增 - 重构系统插件的结构。允许向开源社区 PR 系统插件,具体可见: 如何向 FastGPT 社区提交系统插件
  2. 新增 - DuckDuckGo 系统插件。
  3. 新增 - 飞书 webhook 系统插件。
  4. 新增 - 修改变量填写方式。提示词输入框以以及工作流中所有 Textarea 输入框,支持输入 / 唤起变量选择,可直接选择所有上游输出值,无需动态引入。
  5. 商业版新增 - 知识库权限继承。
  6. 优化 - 移动端快速切换应用交互。
  7. 优化 - 节点图标。
  8. 优化 - 对话框引用增加额外复制案件,便于复制。增加引用内容折叠。
  9. 优化 - OpenAI sdk 升级,并自定义了 whisper 模型接口(未仔细查看 sdk 实现,但 sdk 中 whisper 接口,似乎无法适配一般 fastapi 接口)
  10. 修复 - Permission 表声明问题。
  11. 修复 - 并行执行节点,运行时间未正确记录。
  12. 修复 - 运行详情未正确展示嵌套节点信息。
  13. 修复 - 简易模式,首次进入,无法正确获取知识库配置。
  14. 修复 - Log debug level 配置无效。
  15. 修复 - 插件独立运行时,会将插件输入的值进行变量替换,可能导致后续节点变量异常。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/489/index.html b/docs/development/upgrading/489/index.html new file mode 100644 index 000000000000..0f6fa181ba6b --- /dev/null +++ b/docs/development/upgrading/489/index.html @@ -0,0 +1,48 @@ +V4.8.9(需要初始化) | FastGPT
+
upgrade

V4.8.9(需要初始化)

FastGPT V4.8.9 更新说明

升级指南

1. 做好数据库备份

2. 修改镜像

  • 更新 FastGPT 镜像 tag: v4.8.9
  • 更新 FastGPT 商业版镜像 tag: v4.8.9
  • Sandbox 镜像,可以不更新

3. 商业版执行初始化

从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版域名

+  curl --location --request POST 'https://{{host}}/api/admin/init/489' \
+--header 'rootkey: {{rootkey}}' \
+--header 'Content-Type: application/json'
+  

会初始化多租户的通知方式,仅内部使用的,无需执行。


V4.8.9 更新说明

  1. 新增 - 文件上传配置,不再依赖视觉模型决定是否可上传图片,而是通过系统配置决定。
  2. 新增 - AI 对话节点和工具调用支持选择“是否开启图片识别”,开启后会自动获取对话框上传的图片和“用户问题”中的图片链接。
  3. 新增 - 文档解析节点。
  4. 商业版新增 - 团队通知账号绑定,用于接收重要信息。
  5. 商业版新增 - 知识库集合标签功能,可以对知识库进行标签管理。
  6. 商业版新增 - 知识库搜索节点支持标签过滤和创建时间过滤。
  7. 商业版新增 - 转移 App owner 权限。
  8. 新增 - 删除所有对话引导内容。
  9. 新增 - QA 拆分支持自定义 chunk 大小,并优化 gpt4o-mini 拆分时,chunk 太大导致生成内容很少的问题。
  10. 优化 - 对话框信息懒加载,减少网络传输。
  11. 优化 - 清除选文件缓存,支持重复选择同一个文件。
  12. 修复 - 知识库上传文件,网络不稳定或文件较多情况下,进度无法到 100%。
  13. 修复 - 删除应用后回到聊天选择最后一次对话的应用为删除的应用时提示无该应用问题。
  14. 修复 - 插件动态变量配置默认值时,无法正常显示默认值。
  15. 修复 - 工具调用温度和最大回复值未生效。
  16. 修复 - 函数调用模式,assistant role 中,GPT 模型必须传入 content 参数。(不影响大部分模型,目前基本都改用用 ToolChoice 模式,FC 模式已弃用)。
  17. 修复 - 知识库文件上传进度更新可能异常。
  18. 修复 - 知识库 rebuilding 时候,页面总是刷新到第一页。
  19. 修复 - 知识库 list openapi 鉴权问题。
  20. 修复 - 分享链接,新对话无法反馈。
+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/index.html b/docs/development/upgrading/index.html new file mode 100644 index 000000000000..39b8415f4020 --- /dev/null +++ b/docs/development/upgrading/index.html @@ -0,0 +1,44 @@ +版本更新/升级操作 | FastGPT
+
版本更新/升级操作
upgrade

版本更新/升级操作

FastGPT 版本更新介绍及升级操作


+ + + + \ No newline at end of file diff --git a/docs/development/upgrading/index.xml b/docs/development/upgrading/index.xml new file mode 100644 index 000000000000..7398b133bf14 --- /dev/null +++ b/docs/development/upgrading/index.xml @@ -0,0 +1,115 @@ +版本更新/升级操作 on FastGPThttps://doc.tryfastgpt.ai/docs/development/upgrading/Recent content in 版本更新/升级操作 on FastGPTHugo -- gohugo.iozh-cn升级说明https://doc.tryfastgpt.ai/docs/development/upgrading/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/intro/FastGPT 升级包括两个步骤: +镜像升级 执行升级初始化脚本 镜像名 linkgit版 +FastGPT 主镜像:ghcr.io/labring/fastgpt:latest 商业版镜像:ghcr.io/c121914yu/fastgpt-pro:latest Admin 镜像:ghcr.io/c121914yu/fastgpt-admin:latest 阿里云 +FastGPT 主镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt 商业版镜像:ghcr:registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-pro Admin 镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-admin 镜像由镜像名和Tag组成,例如: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.6.1 代表4.6.3版本镜像,具体可以看 docker hub, github 仓库。 +Sealos 修改镜像 link 打开 Sealos Cloud, 找到桌面上的应用管理 选择对应的应用 - 点击右边三个点 - 变更 修改镜像 - 确认变更 +如果要修改配置文件,可以拉到下面的配置文件进行修改。 +Docker-Compose 修改镜像 link直接修改yml文件中的image: 即可。随后执行: +docker-compose pull docker-compose up -d 执行升级初始化脚本 link镜像更新完后,可以查看文档中的版本介绍,通常需要执行升级脚本的版本都会标明包含升级脚本,打开对应的文档,参考说明执行升级脚本即可,大部分时候都是需要发送一个POST请求。 +QA link为什么需要执行升级脚本 link数据表出现大幅度变更,无法通过设置默认值,或复杂度较高时,会通过升级脚本来更新部分数据表字段。 严格按初始化步骤进行操作,不会造成旧数据丢失。但在初始化过程中,如果数据量大,需要初始化的时间较长,这段时间可能会造成服务无法正常使用。 +{{host}} 是什么 link{{}} 代表变量, {{host}}代表一个名为 host 的变量。指的是你服务器的域名或 IP。 +Sealos 中,你可以在下图中找到你的域名: +如何获取 rootkey link从docker-compose.yml中的environment中获取,对应的是ROOT_KEY的值。V4.8.18(进行中)https://doc.tryfastgpt.ai/docs/development/upgrading/4818/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4818/更新指南 link2. 运行升级脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv4818&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会迁移全文检索表,时间较长,迁移期间全文检索会失效,日志中会打印已经迁移的数据长度。 +完整更新内容 link 新增 - 支持部门架构权限模式。 新增 - 支持配置自定跨域安全策略,默认全开。 优化 - 分享链接随机生成用户头像。 优化 - 图片上传安全校验。并增加头像图片唯一存储,确保不会累计存储。 优化 - Mongo 全文索引表分离。 优化 - 知识库检索查询语句合并,同时减少查库数量。 优化 - 文件编码检测,减少 CSV 文件乱码概率。 优化 - 异步读取文件内容,减少进程阻塞。 优化 - 文件阅读,HTML 直接下载,不允许在线阅读。 修复 - HTML 文件上传,base64 图片无法自动转图片链接。 修复 - 插件计费错误。V4.8.17(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/4817/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4817/更新指南 link1. 更新镜像: link 更新 fastgpt 镜像 tag: v4.8.17-fix-title 更新 fastgpt-pro 商业版镜像 tag: v4.8.17 Sandbox 镜像无需更新 2. 运行升级脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv4817&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会将用户绑定的 OpenAI 账号移动到团队中。 +调整 completions 接口返回值 link/api/v1/chat/completions 接口返回值调整,对话节点、工具节点等使用到模型的节点,将不再返回 tokens 字段,改为返回 inputTokens 和 outputTokens 字段,分别表示输入和输出的 Token 数量。 +完整更新内容 link 新增 - 简易模式工具调用支持数组类型插件。 新增 - 工作流增加异常离开自动保存,避免工作流丢失。 新增 - LLM 模型参数支持关闭 max_tokens 和 temperature。 新增 - 商业版支持后台配置模板市场。 新增 - 商业版支持后台配置自定义工作流变量,用于与业务系统鉴权打通。 新增 - 搜索测试接口支持问题优化。 新增 - 工作流中 Input Token 和 Output Token 分开记录展示。并修复部分请求未记录输出 Token 计费问题。 优化 - Markdown 大小测试,超出 20 万字符不使用 Markdown 组件,避免崩溃。 优化 - 知识库搜索参数,滑动条支持输入模式,可以更精准的控制。 优化 - 可用模型展示UI。 优化 - Mongo 查询语句,增加 virtual 字段。 修复 - 文件返回接口缺少 Content-Length 头,导致通过非同源文件上传时,阿里 vision 模型无法识别图片。 修复 - 去除判断器两端字符串隐藏换行符,避免判断器失效。 修复 - 变量更新节点,手动输入更新内容时候,非字符串类型数据类型无法自动转化。 修复 - 豆包模型无法工具调用。V4.8.16(更新配置文件)https://doc.tryfastgpt.ai/docs/development/upgrading/4816/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4816/更新指南 link1. 更新镜像: link 更新 fastgpt 镜像 tag: v4.8.16 更新 fastgpt-pro 商业版镜像 tag: v4.8.16 Sandbox 镜像 tag: v4.8.16 2. 更新配置文件 link参考最新的配置文件,更新 config.json 或 admin 中模型文件配置。给 LLMModel 和 VectorModel 增加 provider 字段,以便进行模型分类。例如: +{ &#34;provider&#34;: &#34;OpenAI&#34;, // 这是新增的 &#34;model&#34;: &#34;gpt-4o&#34;, &#34;name&#34;: &#34;gpt-4o&#34;, &#34;maxContext&#34;: 125000, &#34;maxResponse&#34;: 4000, &#34;quoteMaxToken&#34;: 120000, &#34;maxTemperature&#34;: 1.2, &#34;charsPointsPrice&#34;: 0, &#34;censor&#34;: false, &#34;vision&#34;: true, &#34;datasetProcess&#34;: true, &#34;usedInClassify&#34;: true, &#34;usedInExtractFields&#34;: true, &#34;usedInToolCall&#34;: true, &#34;usedInQueryExtension&#34;: true, &#34;toolChoice&#34;: true, &#34;functionCall&#34;: false, &#34;customCQPrompt&#34;: &#34;&#34;, &#34;customExtractPrompt&#34;: &#34;&#34;, &#34;defaultSystemChatPrompt&#34;: &#34;&#34;, &#34;defaultConfig&#34;: {}, &#34;fieldMap&#34;: {} } 完整更新内容 link 新增 - SearXNG 搜索插件点击查看教程 新增 - 商业版支持 API 知识库和链接集合定时同步。 新增 - 猜你想问支持选择模型和自定义提示词。 新增 - 钉钉和企微机器人 webhook 插件。 新增 - 商业版支持钉钉 SSO 登录配置。点击查看教程 新增 - 商业版支持飞书和语雀知识库导入。点击查看教程 新增 - sandbox 新增 createHmac 加密全局方法。 新增 - 工作流右键支持全部折叠。 优化 - 模型选择器。 优化 - SSR 渲染,预判断是移动端还是 pc 端,减少页面抖动。 优化 - 工作流/简易模式变量初始化代码,去除监听初始化,避免因渲染顺序不一致导致的失败。 优化 - 工作流获取数据类型不一致数据时,增加类型转化,避免 undefined。 修复 - 无法自动切换默认语言。增加分享链接,强制执行一次切换默认语言。 修复 - 数组选择器自动兼容 4.V4.8.15(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/4815/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4815/新功能预览 linkAPI 知识库 link HTML 渲染 link 源码模式 预览模式 全屏模式 升级指南 link 更新 fastgpt 镜像 tag: v4.8.15-fix3 更新 fastgpt-pro 商业版镜像 tag: v4.8.15 Sandbox 镜像,可以不更新 运行升级脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv4815&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会重置应用定时执行的字段,把 null 去掉,减少索引大小。 +从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成fastgpt-pro域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/init/refreshFreeUser&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 重新计算一次免费版用户的时长,之前有版本升级时没有重新计算时间,导致会误发通知。V4.8.14https://doc.tryfastgpt.ai/docs/development/upgrading/4814/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4814/更新指南 link1. 做好数据备份 link2. 修改镜像 link 更新 FastGPT 镜像 tag: v4.8.14-fix 更新 FastGPT 商业版镜像 tag: v4.8.14 (fastgpt-pro镜像) Sandbox 镜像,可以不更新 milvus版本使用:v4.8.14-milvus-fix 镜像。 +新功能预览 link自动触发工作流 link可以允许你配置用户加载对话时,自动触发一次工作流。可以用于一些 CRM 系统,可以快速的引导用户使用,无需等待用户主动触发。 +完整更新内容 link 新增 - 工作流支持进入聊天框/点击开始对话后,自动触发一轮对话。 新增 - 重写 chatContext,对话测试也会有日志,并且刷新后不会丢失对话。 新增 - 分享链接支持配置是否允许查看原文。 新增 - 新的 doc2x 插件。 新增 - 繁体中文。 新增 - 分析链接和 chat api 支持传入自定义 uid。 商业版新增 - 微软 oauth 登录 优化 - 工作流 ui 细节。 优化 - 应用编辑记录采用 diff 存储,避免浏览器溢出。 优化 - 代码入口,增加 register 入口,无需等待首次访问才执行。 优化 - 工作流检查,增加更多缺失值检查。 优化 - 增加知识库训练最大重试次数限制。 优化 - 图片路径问题和示意图任务 优化 - Milvus description 修复 - 分块策略,四级标题会被丢失。 同时新增了五级标题的支持。 修复 - MongoDB 知识库集合唯一索引。 修复 - 反选知识库引用后可能会报错。 修复 - 简易模式转工作流,不是使用最新编辑记录进行转移。 修复 - 表单输入的说明文字不显示。 修复 - API 无法使用 base64 图片。V4.8.13https://doc.tryfastgpt.ai/docs/development/upgrading/4813/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4813/更新指南 link1. 做好数据备份 link2. 修改镜像 link 更新 FastGPT 镜像 tag: v4.8.13-fix 更新 FastGPT 商业版镜像 tag: v4.8.13-fix (fastgpt-pro镜像) Sandbox 镜像,可以不更新 3. 添加环境变量 link 给 fastgpt 和 fastgpt-pro 镜像添加环境变量:FE_DOMAIN=http://xx.com,值为 fastgpt 前端访问地址,注意后面不要加/。可以自动补齐相对文件地址的前缀。 4. 调整文件上传编排 link虽然依然兼容旧版的文件上传编排,但是未来两个版本内将会去除兼容代码,请尽快调整编排,以适应最新的文件上传逻辑。尤其是嵌套应用的文件传递,未来将不会自动传递,必须手动指定传递的文件。具体内容可参考: 文件上传变更 +更新说明 link 新增 - 数组变量选择支持多选,可以选多个数组或对应的单一数据类型,会自动按选择顺序进行合并。 新增 - 文件上传方案调整,AI对话和工具调用节点直接支持接收文件链接,并且会强制加入提示词,无需由模型决策调用。插件自定义变量支持文件上传类型,取代全局文件。 新增 - 对话记录增加时间显示。 新增 - 工作流校验错误时,跳转至错误节点。 新增 - 循环节点增加下标值。 新增 - 部分对话错误提醒增加翻译。 新增 - 对话输入框支持拖拽文件上传,可直接拖文件到输入框中。 新增 - 对话日志,来源可显示分享链接/API具体名称 新增 - 分享链接支持配置是否展示实时运行状态。 优化 - 合并多个 system 提示词成 1 个,避免部分模型不支持多个 system 提示词。 优化 - 知识库上传文件,优化报错提示。 优化 - 全文检索语句,减少一轮子查询。 优化 - 修改 findLast 为 [&hellip;array].V4.8.12(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/4812/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4812/更新指南 link1. 做好数据备份 link2. 修改镜像 link 更新 FastGPT 镜像 tag: v4.8.12-fix 更新 FastGPT 管理端镜像 tag: v4.8.12 (fastgpt-pro镜像) Sandbox 镜像,可以不更新 3. 商业版执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 管理端域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/init/4812&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会初始化应用和知识库的成员组数据。 +4. 重构 Milvus 数据 link由于 js int64 精度丢失问题,之前私有化使用 milvus 或者 zilliz 的用户,如果存在数据精度丢失的问题,需要重构 Milvus 数据。(可以查看 dataset_datas 表中,indexes 中的 dataId 是否末尾精度丢失)。使用 PG 的用户不需要操作。 +从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 主域名。V4.8.11(商业版初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/4811/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4811/更新指南 link1. 做好数据备份 link2. 修改配置文件 link如需增加 openai o1 模型,可添加如下配置: +{ &#34;model&#34;: &#34;o1-mini&#34;, &#34;name&#34;: &#34;o1-mini&#34;, &#34;avatar&#34;: &#34;/imgs/model/openai.svg&#34;, &#34;maxContext&#34;: 125000, &#34;maxResponse&#34;: 65000, &#34;quoteMaxToken&#34;: 120000, &#34;maxTemperature&#34;: 1.2, &#34;charsPointsPrice&#34;: 0, &#34;censor&#34;: false, &#34;vision&#34;: false, &#34;datasetProcess&#34;: true, &#34;usedInClassify&#34;: true, &#34;usedInExtractFields&#34;: true, &#34;usedInToolCall&#34;: true, &#34;usedInQueryExtension&#34;: true, &#34;toolChoice&#34;: false, &#34;functionCall&#34;: false, &#34;customCQPrompt&#34;: &#34;&#34;, &#34;customExtractPrompt&#34;: &#34;&#34;, &#34;defaultSystemChatPrompt&#34;: &#34;&#34;, &#34;defaultConfig&#34;: { &#34;temperature&#34;: 1 } }, { &#34;model&#34;: &#34;o1-preview&#34;, &#34;name&#34;: &#34;o1-preview&#34;, &#34;avatar&#34;: &#34;/imgs/model/openai.svg&#34;, &#34;maxContext&#34;: 125000, &#34;maxResponse&#34;: 32000, &#34;quoteMaxToken&#34;: 120000, &#34;maxTemperature&#34;: 1.V4.8.10(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/4810/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4810/更新指南 link1. 做好数据备份 link2. 商业版 —— 修改环境变量 link 需要给fastgpt-pro镜像,增加沙盒的环境变量:SANDBOX_URL=http://xxxxx:3000 给fastgpt-pro镜像和fastgpt镜像增加环境变量,以便更好的存储系统日志: LOG_LEVEL=debug STORE_LOG_LEVEL=warn 3. 修改镜像tag link 更新 FastGPT 镜像 tag: v4.8.10 更新 FastGPT 商业版镜像 tag: v4.8.10 Sandbox 镜像,可以不更新 4. 执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv4810&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化发布记录版本标记 初始化开票记录 V4.8.10 更新说明 link完整内容请见:4.8.10 release +新增 - 模板市场。 新增 - 工作流节点拖动自动对齐吸附。 新增 - 用户选择节点(Debug 模式暂未支持)。 新增 - 工作流增加 uid 全局变量。 新增 - 工作流撤销和重做。 新增 - 工作流本次编辑记录,取代自动保存。 新增 - 工作流版本支持重命名。 新增 - 工作流的“应用调用”节点弃用,迁移成单独节点,与插件使用方式相同,同时可以传递全局变量和用户上传的文件。 新增 - 插件增加使用说明配置。 新增 - 插件自定义输入支持单选框。 新增 - HTTP 节点支持 text/plain 模式。 新增 - HTTP模块支持超时配置、支持更多的 Body 类型,params 和 headers 支持新的变量选择模式。 新增 - 工作流导出导入,支持直接导出和导入 JSON 文件,便于交流。 新增 - 发送验证码安全校验。 商业版新增 - 飞书机器人接入。 商业版新增 - 公众号接入接入。 商业版新增 - 自助开票申请。 商业版新增 - SSO 定制。 优化 - 工作流循环校验,避免 skip 循环空转。同时支持分支完全并发执行。 优化 - 工作流嵌套执行,参数可能存在的污染问题。 优化 - 部分全局变量,增加数据类型约束。 优化 - 节点选择,避免切换 tab 时候,path 加载报错。 优化 - 最新 React Markdown 组件,支持 Base64 图片。 优化 - 对话框性能问题。 优化 - 单选框打开后自动滚动到选中的位置。 优化 - 知识库集合禁用,目录禁用会递归修改其下所有 children 的禁用状态。 优化 - SSE 响应代码优化。 优化 - 无 SSL 证书情况下,优化复制。 优化 - 知识库列表 UI。 优化 - 知识库详情页 UI。 优化 - 支持无网络配置情况下运行。 优化 - 调整.V4.8.9(需要初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/489/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/489/升级指南 link1. 做好数据库备份 link2. 修改镜像 link 更新 FastGPT 镜像 tag: v4.8.9 更新 FastGPT 商业版镜像 tag: v4.8.9 Sandbox 镜像,可以不更新 3. 商业版执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/init/489&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会初始化多租户的通知方式,仅内部使用的,无需执行。 +V4.8.9 更新说明 link 新增 - 文件上传配置,不再依赖视觉模型决定是否可上传图片,而是通过系统配置决定。 新增 - AI 对话节点和工具调用支持选择“是否开启图片识别”,开启后会自动获取对话框上传的图片和“用户问题”中的图片链接。 新增 - 文档解析节点。 商业版新增 - 团队通知账号绑定,用于接收重要信息。 商业版新增 - 知识库集合标签功能,可以对知识库进行标签管理。 商业版新增 - 知识库搜索节点支持标签过滤和创建时间过滤。 商业版新增 - 转移 App owner 权限。 新增 - 删除所有对话引导内容。 新增 - QA 拆分支持自定义 chunk 大小,并优化 gpt4o-mini 拆分时,chunk 太大导致生成内容很少的问题。 优化 - 对话框信息懒加载,减少网络传输。 优化 - 清除选文件缓存,支持重复选择同一个文件。 修复 - 知识库上传文件,网络不稳定或文件较多情况下,进度无法到 100%。 修复 - 删除应用后回到聊天选择最后一次对话的应用为删除的应用时提示无该应用问题。 修复 - 插件动态变量配置默认值时,无法正常显示默认值。 修复 - 工具调用温度和最大回复值未生效。 修复 - 函数调用模式,assistant role 中,GPT 模型必须传入 content 参数。(不影响大部分模型,目前基本都改用用 ToolChoice 模式,FC 模式已弃用)。 修复 - 知识库文件上传进度更新可能异常。 修复 - 知识库 rebuilding 时候,页面总是刷新到第一页。 修复 - 知识库 list openapi 鉴权问题。 修复 - 分享链接,新对话无法反馈。V4.8.8(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/488/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/488/升级指南 link1. 做好数据库备份 link2. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.8-fix2 商业版镜像 tag 修改成 v4.8.8 3. 执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv488&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会初始化知识库的继承权限 +V4.8.8 更新说明 link点击查看完整更新 +新增 - 重构系统插件的结构。允许向开源社区 PR 系统插件,具体可见: 如何向 FastGPT 社区提交系统插件。 新增 - DuckDuckGo 系统插件。 新增 - 飞书 webhook 系统插件。 新增 - 修改变量填写方式。提示词输入框以以及工作流中所有 Textarea 输入框,支持输入 / 唤起变量选择,可直接选择所有上游输出值,无需动态引入。 商业版新增 - 知识库权限继承。 优化 - 移动端快速切换应用交互。 优化 - 节点图标。 优化 - 对话框引用增加额外复制案件,便于复制。增加引用内容折叠。 优化 - OpenAI sdk 升级,并自定义了 whisper 模型接口(未仔细查看 sdk 实现,但 sdk 中 whisper 接口,似乎无法适配一般 fastapi 接口) 修复 - Permission 表声明问题。 修复 - 并行执行节点,运行时间未正确记录。 修复 - 运行详情未正确展示嵌套节点信息。 修复 - 简易模式,首次进入,无法正确获取知识库配置。 修复 - Log debug level 配置无效。 修复 - 插件独立运行时,会将插件输入的值进行变量替换,可能导致后续节点变量异常。V4.8.7https://doc.tryfastgpt.ai/docs/development/upgrading/487/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/487/升级指南 link1. 做好数据库备份 link2. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.7 商业版镜像 tag 修改成 v4.8.7 V4.8.7 更新说明 link 新增 - 插件支持独立运行,发布和日志查看 新增 - 应用搜索 优化 - 对话框代码 优化 - 升级 Dockerfile node 和 pnpm 版本 优化 - local 域名部署,也可以正常使用 vision 模式 修复 - 简易模式无法变更全局变量 修复 - gpt4o 无法同时使用工具和图片V4.8.6(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/486/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/486/升级指南 link1. 做好数据库备份 link2. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.6 fastgpt-sandbox 镜像 tag 修改成 v4.8.6 商业版镜像 tag 修改成 v4.8.6 3. 执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv486&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会初始化应用的继承权限 +V4.8.6 更新说明 link 新增 - 应用权限继承 新增 - 知识库支持单个集合禁用功能 新增 - 系统插件模式变更,新增链接读取和数学计算器插件,正式版会更新如何自定义系统插件 新增 - 代码沙盒运行参数 新增 - AI对话时隐藏头部的功能,主要是适配移动端 优化 - 文件读取,Mongo 默认使用从节点,减轻主节点压力 优化 - 提示词模板 优化 - Mongo model 重复加载 修复 - 创建链接集合未返回 id 修复 - 文档接口说明 修复 - api system 提示合并 修复 - 团队插件目录内的内容无法加载 修复 - 知识库集合目录面包屑无法加载 修复 - Markdown 导出对话异常 修复 - 提示模板结束标签错误 修复 - 文档描述V4.8.5(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/485/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/485/升级指南 link1. 做好数据库备份 link2. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.5 商业版镜像 tag 修改成 v4.8.5 3. 执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv485&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会把插件的数据表合并到应用中,插件表不会删除。 +商业版用户执行额外的初始化 +从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版的域名: +curl --location --request POST &#39;https://{{host}}/api/admin/init/485&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会重置知识库权限系统。 +V4.8.5 更新说明 link 新增 - 合并插件和应用,统一成工作台 新增 - 应用创建副本功能 新增 - 应用创建模板 新增 - 支持代码运行结果作为工具输出。 新增 - Markdown 图片输出,支持移动端放大缩放。 优化 - 原文件编码存取 优化 - 知识库删除后,简易模式会过滤掉删除的知识库,避免错误判断。 优化 - 文件夹读取,支持单个文件夹超出 100 个文件 优化 - 问答拆分/手动录入,当有a字段时,自动将q作为补充索引。 优化 - 对话框页面代码 优化 - 工作流新节点自动增加序号名 修复 - 定时任务无法实际关闭 修复 - 输入引导特殊字符导致正则报错 修复 - 文件包含特殊字符%,且为转义时会导致页面崩溃 修复 - 自定义输入选择知识库引用时页面崩溃V4.8.4(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/484/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/484/升级指南 link1. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.4 fastgpt-sandbox 镜像 tag 修改成 v4.8.4 (选择性,无变更) 商业版镜像 tag 修改成 v4.8.4 2. 商业版用户执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版的域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/init/484&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; V4.8.4 更新说明 link 新增 - 应用使用新权限系统。 新增 - 应用支持文件夹。 优化 - 文本分割增加连续换行、制表符清除,避免大文本性能问题。 重要修复 - 修复系统插件运行池数据污染问题,由于从内存获取,会导致全局污染。 修复 - Debug 模式下,相同 source 和 target 内容,导致连线显示异常。 修复 - 定时执行初始化错误。 修复 - 应用调用传参异常。 修复 - ctrl + cv 复杂节点时,nodeId错误。 调整组件库全局theme。V4.8.3https://doc.tryfastgpt.ai/docs/development/upgrading/483/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/483/升级指南 link fastgpt 镜像 tag 修改成 v4.8.3 fastgpt-sandbox 镜像 tag 修改成 v4.8.3 商业版镜像 tag 修改成 v4.8.3 V4.8.3 更新说明 link 新增 - 支持 Milvus 数据库, 可参考最新的 docker-compose-milvus.yml. 新增 - 给 chat 接口 empty answer 增加 log,便于排查模型问题。 新增 - ifelse判断器,字符串支持正则。 新增 - 代码运行支持 console.log 输出调试。 修复 - 变量更新在 Debug 模式下出错。V4.8.2https://doc.tryfastgpt.ai/docs/development/upgrading/482/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/482/Sealos 升级说明 link 在应用管理中新建一个应用,镜像为:registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.1 无需外网访问地址,端口号为3000 部署完后,复制应用的内网地址 点击变更`FastGPT - 修改环境变量,增加下面的环境变量即可 SANDBOX_URL=内网地址 Docker 部署 link可以拉取最新 docker-compose.yml 文件参考 +新增一个容器 sandbox fastgpt 和 fastgpt-pro(商业版) 容器新增环境变量: SANDBOX_URL sandbox 简易不要开启外网访问,未做凭证校验。 V4.8.2 更新说明 link 新增 - js代码运行节点(更完整的type提醒,后续继续完善) 新增 - 内容提取节点支持数据类型选择 修复 - 新增的站点同步无法使用 修复 - 定时任务无法输入内容V4.8.1(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/481/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/481/初始化脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT的域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv481&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 由于之前集合名不规范,该初始化会重置表名。请在初始化前,确保 dataset.trainings 表没有数据。 最好更新该版本时,暂停所有进行中业务,再进行初始化,避免数据冲突。 +执行脏数据清理 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT的域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/clearInvalidData&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化完后,可以执行这个命令。之前定时清理的定时器有些问题,部分数据没被清理,可以手动执行清理。 +V4.8.1 更新说明 link使用 Chat api 接口需要注意,增加了 event: updateVariables 事件,用于更新变量。 +点击查看升级说明V4.8https://doc.tryfastgpt.ai/docs/development/upgrading/48/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/48/新工作流 linkFastGPT workflow V2上线,支持更加简洁的工作流模式。 +🤖 +由于工作流差异较大,不少地方需要手动重新构建。请依次重建插件和应用 +简易尽快更新工作流,避免未来持续迭代后导致无法兼容。 +给应用和插件增加了 version 的字段,用于标识是旧工作流还是新工作流。当你更新 4.8 后,保存和新建的工作流均为新版,旧版工作流会有一个重置的弹窗提示。并且,如果是通过 API 和 分享链接 调用的工作流,仍可以正常使用,直到你下次保存它们。 +商业版配置更新 link商业版用户如果配置了邮件验证码,需要在管理端 -&gt; 项目配置 -&gt; 登录配置 -&gt; 邮箱登录配置 -&gt; 修改 邮箱服务SMTP地址,之前只能配置别名,现在可以配置自定义的地址。下面是一组别名和实际地址关系: +qq: smtp.qq.com gmail: smtp.gmail.com +V4.8 更新说明 link 重构 - 工作流 新增 - 判断器。支持 if elseIf else 判断。 @newfish-cmyk (preview版本的if else节点需要删除重建) 新增 - 变量更新节点。支持更新运行中工作流输出变量,或更新全局变量。@newfish-cmyk 新增 - 工作流自动保存和版本管理。 新增 - 工作流 Debug 模式,可以调试单个节点或者逐步调试工作流。 新增 - 定时执行应用。可轻松实现定时任务。 新增 - 插件自定义输入优化,可以渲染输入组件。 新增 - 分享链接发送对话前 hook https://github.com/labring/FastGPT/pull/1252 @gaord 优化 - 工作流连线,可以四向连接,方便构建循环工作流。 优化 - 工作流上下文传递,性能🚀。 优化 - ctrl和alt+enter换行,换行符位置不正确。 优化 - chat中存储变量配置。避免修改变量后,影响旧的对话。 优化 - 简易模式,更新配置后自动更新调试框内容,无需保存。 优化 - worker进程管理,并将计算 Token 任务分配给 worker 进程。 优化 - 工具调用支持指定字段数据类型(string, boolean, number) https://github.V4.7.1(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/471/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/471/初始化脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT的域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/clearInvalidData&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 该请求会执行脏数据清理(清理无效的文件、清理无效的图片、清理无效的知识库集合、清理无效的向量) +修改配置文件 link增加了Laf环境配置:点击查看最新的配置文件 +V4.7.1 更新说明 link 新增 - 语音输入完整配置。支持选择是否打开语音输入(包括分享页面),支持语音输入后自动发送,支持语音输入后自动语音播放(流式)。 新增 - pptx 和 xlsx 文件读取。但所有文件读取都放服务端,会消耗更多的服务器资源,以及无法在上传时预览更多内容。 新增 - 集成 Laf 云函数,可以读取 Laf 账号中的云函数作为 HTTP 模块。 新增 - 定时器,清理垃圾数据。(采用小范围清理,会清理最近n个小时的,所以请保证服务持续运行,长时间不允许,可以继续执行 clearInvalidData 的接口进行全量清理。) 商业版新增 - 后台配置系统通知。 优化 - 支持ip模式导出知识库。 修改 - csv导入模板,取消 header 校验,自动获取前两列。 修复 - 工具调用模块连线数据类型校验错误。 修复 - 自定义索引输入时,解构数据失败。 修复 - rerank 模型数据格式。 修复 - 问题补全历史记录BUG 修复 - 分享页面特殊情况下加载缓慢问题(由于ssr时候数据库不会触发连接)V4.7(需要初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/47/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/47/1. 修改配置文件 link增加一些 Boolean 值,用于决定不同功能块可以使用哪些模型,同时增加了模型的 logo:点击查看最新的配置文件 +2. 初始化脚本 link升级完镜像后。从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成自己域名 +curl --location --request POST &#39;https://{{host}}/api/admin/initv47&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 脚本功能: +初始化插件的 parentId 3. 升级 ReRank 模型 link4.7对ReRank模型进行了格式变动,兼容 cohere 的格式,可以直接使用 cohere 提供的 API。如果是本地的 ReRank 模型,需要修改镜像为:registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1 。 +cohere的重排模型对中文不是很好,感觉不如 bge 的好用,接入教程如下: +申请 Cohere 官方 Key: https://dashboard.cohere.com/api-keys 修改 FastGPT 配置文件 { &#34;reRankModels&#34;: [ { &#34;model&#34;: &#34;rerank-multilingual-v2.0&#34;, // 这里的 model 需要对应 cohere 的模型名 &#34;name&#34;: &#34;检索重排&#34;, // 随意 &#34;requestUrl&#34;: &#34;https://api.V4.6.9(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/469/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/469/修改商业版环境变量 link增加 oneapi 地址和令牌。 +OPENAI_BASE_URL=http://oneapi:3000/v1 CHAT_API_KEY=sk-fastgpt 初始化脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成自己域名 +curl --location --request POST &#39;https://{{host}}/api/admin/initv469&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 重置计量表。 执行脏数据清理(清理无效的文件、清理无效的图片、清理无效的知识库集合、清理无效的向量) 外部接口更新 link 由于计费系统变更,分享链接对话上报接口需要做一些调整,price字段被totalPoints字段取代。inputToken和outputToken不再提供,只提供token字段(总token数量)。 V4.6.9 更新说明 link 商业版新增 - 知识库新增“增强处理”训练模式,可生成更多类型索引。 新增 - 完善了HTTP模块的变量提示。 新增 - HTTP模块支持OpenAI单接口导入。 新增 - 全局变量支持增加外部变量。可通过分享链接的Query或 API 的 variables 参数传入。 新增 - 内容提取模块增加默认值。 优化 - 问题补全。增加英文类型。同时可以设置为单独模块,方便复用。 优化 - 重写了计量模式 优化 - Token 过滤历史记录,保持偶数条,防止部分模型报错。 优化 - 分享链接SEO,可直接展示应用名和头像。 修复 - 标注功能。 修复 - qa生成线程计数错误。 修复 - 问题分类连线类型错误V4.6.8(需要初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/468/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/468/docker 部署 - 手动更新 Mongo link 修改 docker-compose.yml 的mongo部分,补上command和entrypoint mongo: image: mongo:5.0.18 # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云 container_name: mongo ports: - 27017:27017 networks: - fastgpt command: mongod --keyFile /data/mongodb.key --replSet rs0 environment: # 这里密码注意要和以前的一致 - MONGO_INITDB_ROOT_USERNAME=username - MONGO_INITDB_ROOT_PASSWORD=password volumes: - ./mongo/data:/data/db entrypoint: - bash - -c - | openssl rand -base64 128 &gt; /data/mongodb.key chmod 400 /data/mongodb.key chown 999:999 /data/mongodb.key echo &#39;const isInited = rs.status().ok === 1 if(!isInited){ rs.initiate({ _id: &#34;rs0&#34;, members: [ { _id: 0, host: &#34;mongo:27017&#34; } ] }) }&#39; &gt; /data/initReplicaSet.V4.6.7(需要初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/467/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/467/1。执行初始化 API link发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +https://xxxxx/api/admin/initv467 curl --location --request POST &#39;https://{{host}}/api/admin/initv467&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化说明: +将 images 重新关联到数据集 设置 pg 表的 null 值。 V4.6.7 更新说明 link 修改了知识库UI及新的导入交互方式。 优化知识库和对话的数据索引。 知识库 openAPI,支持通过 API 操作知识库。 新增 - 输入框变量提示。输入 { 号后将会获得可用变量提示。根据社区针对高级编排的反馈,我们计划于 2 月份的版本中,优化变量内容,支持模块的局部变量以及更多全局变量写入。 优化 - 切换团队后会保存记录,下次登录时优先登录该团队。 修复 - API 对话时,chatId 冲突问题。 修复 - Iframe 嵌入网页可能导致的 window.onLoad 冲突。V4.6.6(需要改配置文件)https://doc.tryfastgpt.ai/docs/development/upgrading/466/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/466/配置文件变更 link为了减少代码重复度,我们对配置文件做了一些修改:点击查看最新的配置文件 +商业版变更 link 更新商业版镜像到 4.6.6 版本。 +将旧版配置文件中的 SystemParams.pluginBaseUrl 放置到环境变量中: +PRO_URL=商业版镜像地址(此处不再需要以 /api 结尾),例如: +PRO_URL=http://fastgpt-plugin.ns-hsss5d.svc.cluster.local:3000 +原本在配置文件中的 FeConfig 已被移除,可以直接打开新的商业版镜像外网地址进行配置。包括 FastGPT 的各个参数和模型都可以直接在商业版镜像中配置,无需再变更 config.json 文件。 +V4.6.6 更新说明 link 查看 FastGPT 2024 RoadMap 新增 - Http 模块请求头支持 Json 编辑器。 新增 - ReRank模型部署 新增 - 搜索方式:分离向量语义检索,全文检索和重排,通过 RRF 进行排序合并。 优化 - 问题分类提示词,id引导。测试国产商用 api 模型(百度阿里智谱讯飞)使用 Prompt 模式均可分类。 UI 优化,未来将逐步替换新的UI设计。 优化代码:Icon 抽离和自动化获取。 修复 - 链接读取的数据集,未保存选择器,导致同步时不使用选择器。V4.6.5(需要改配置文件)https://doc.tryfastgpt.ai/docs/development/upgrading/465/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/465/配置文件变更 link由于 openai 已开始弃用 function call,改为 toolChoice。FastGPT 同步的修改了对于的配置和调用方式,需要对配置文件做一些修改: +点击查看最新的配置文件 +主要是修改模型的functionCall字段,改成toolChoice即可。设置为true的模型,会默认走 openai 的 tools 模式;未设置或设置为false的,会走提示词生成模式。 问题优化模型与内容提取模型使用同一组配置。 +增加 &quot;ReRankModels&quot;: [] V4.6.5 功能介绍 link 新增 - 问题优化模块 新增 - 文本编辑模块 新增 - 判断器模块 新增 - 自定义反馈模块 新增 - 【内容提取】模块支持选择模型,以及字段枚举 优化 - docx读取,兼容表格(表格转markdown) 优化 - 高级编排连接线交互 优化 - 由于 html2md 导致的 cpu密集计算,阻断线程问题 修复 - 高级编排提示词提取描述V4.6.4(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/464/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/464/1。执行初始化 API link发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +https://xxxxx/api/admin/initv464 curl --location --request POST &#39;https://{{host}}/api/admin/initv464&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化说明: +初始化 PG 的createTime字段 初始化 Mongo 中 chat 的 feedback 字段 V4.6.4 功能介绍 link 重写 - 分享链接身份逻辑,采用 localID 记录用户的ID。 商业版新增 - 分享链接 SSO 方案,通过身份鉴权地址,仅需3个接口即可完全接入已有用户系统。具体参考分享链接身份鉴权 新增 - 分享链接更多嵌入方式提示,更多DIY方式。 优化 - 历史记录模块。弃用旧的历史记录模块,直接在对应地方填写数值即可。 调整 - 知识库搜索模块 topk 逻辑,采用 MaxToken 计算,兼容不同长度的文本块 调整鉴权顺序,提高 apikey 的优先级,避免cookie抢占 apikey 的鉴权。 链接读取支持多选择器。参考Web 站点同步用法 修复 - 分享链接图片上传鉴权问题 修复 - Mongo 连接池未释放问题。 修复 - Dataset Intro 无法更新 修复 - md 代码块问题 修复 - root 权限问题 优化 docker fileV4.6.3(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/463/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/463/1。执行初始化 API link发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +https://xxxxx/api/admin/initv463 curl --location --request POST &#39;https://{{host}}/api/admin/initv463&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化说明: +初始化Mongo 中 dataset,collection 和 data 的部分字段 V4.6.3 功能介绍 link 商业版新增 - web站点同步 新增 - 集合元数据记录 优化 - url 读取内容 优化 - 流读取文件,防止内存溢出 优化 - 4v模型自动将 url 转 base64,本地也可调试 优化 - 图片压缩等级 修复 - 图片压缩失败报错,防止文件读取过程卡死。V4.6.2(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/462/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/462/1。执行初始化 API link发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +https://xxxxx/api/admin/initv462 curl --location --request POST &#39;https://{{host}}/api/admin/initv462&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化说明: +初始化全文索引 V4.6.2 功能介绍 link 新增 - 全文索引(需配合 Rerank 模型,在看怎么放到开源版,模型接口比较特殊) 新增 - 插件来源(预计4.7/4.8版本会正式使用) 优化 - PDF读取 优化 - docx文件读取,转成 markdown 并保留其图片内容 修复和优化 TextSplitter 函数V4.6.1https://doc.tryfastgpt.ai/docs/development/upgrading/461/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/461/V4.6.1 功能介绍 link 新增 - GPT4-v 模型支持 新增 - whisper 语音输入 优化 - TTS 流传输 优化 - TTS 缓存V4.6(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/46/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/46/V4.6 版本加入了简单的团队功能,可以邀请其他用户进来管理资源。该版本升级后无法执行旧的升级脚本,且无法回退。 +1。更新镜像并变更配置文件 link更新镜像至 latest 或者 v4.6 版本。商业版镜像更新至 V0.2.1 +最新配置可参考:V46 版本最新 config.json,商业镜像配置文件也更新,参考最新的飞书文档。 +2。执行初始化 API link发起 2 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +该初始化接口可能速度很慢,返回超时不用管,注意看日志即可,需要注意的是,需确保 initv46 成功后,在执行 initv46-2 +https://xxxxx/api/admin/initv46 curl --location --request POST &#39;https://{{host}}/api/admin/initv46&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; https://xxxxx/api/admin/initv46-2 curl --location --request POST &#39;https://{{host}}/api/admin/initv46-2&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化内容: 1。创建默认团队 2。初始化 Mongo 所有资源的团队字段 3。初始化 Pg 的字段 4。初始化 Mongo Data +V4.6 功能介绍 link 新增 - 团队空间 新增 - 多路向量 (多个向量映射一组数据) 新增 - tts 语音 新增 - 支持知识库配置文本预处理模型 线上环境新增 - ReRank 向量召回,提高召回精度 优化 - 知识库导出,可直接触发流下载,无需等待转圈圈 4.V4.5.2https://doc.tryfastgpt.ai/docs/development/upgrading/452/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/452/功能介绍 linkFast GPT V4.5.2 link 新增 - 模块插件,允许自行组装插件进行模块复用。 优化 - 知识库引用提示。V4.5.1(需进行初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/451/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/451/执行初始化 API link发起 1 个 HTTP 请求({{rootkey}} 替换成环境变量里的rootkey,{{host}}替换成自己域名) +https://xxxxx/api/admin/initv451 curl --location --request POST &#39;https://{{host}}/api/admin/initv451&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化内容: +rename 数据库字段 初始化 Mongo APP 表中知识库的相关字段 初始化 PG 和 Mongo 的内容,为每个文件创建一个集合(存储 Mongo 中),并反馈赋值给 PG。 该初始化接口可能速度很慢,返回超时不用管,注意看日志即可 +功能介绍 linkFast GPT V4.5.1 link 新增知识库文件夹管理 修复了 openai4.x sdk 无法兼容 oneapi 的智谱和阿里的接口。 修复部分模块无法触发完成事件V4.5(需进行较为复杂更新)https://doc.tryfastgpt.ai/docs/development/upgrading/45/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/45/FastGPT V4.5 引入 PgVector0.5 版本的 HNSW 索引,极大的提高了知识库检索的速度,比起IVFFlat索引大致有3~10倍的性能提升,可轻松实现百万数据毫秒级搜索。缺点在于构建索引的速度非常慢,4c16g 500w 组数据使用并行构建大约花了 48 小时。具体参数配置可参考 PgVector官方 +下面需要对数据库进行一些操作升级: +PgVector升级:Sealos 部署方案 link 点击Sealos桌面的数据库应用。 点击【pg】数据库的详情。 点击右上角的重启,等待重启完成。 点击左侧的一键链接,等待打开 Terminal。 依次输入下方 sql 命令 -- 升级插件名 ALTER EXTENSION vector UPDATE; -- 插件是否升级成功,成功的话,vector插件版本为 0.5.0,旧版的为 0.4.1 \dx -- 下面两个语句会设置 pg 在构建索引时可用的内存大小,需根据自身的数据库规格来动态配置,可配置为 1/4 的内存大小 alter system set maintenance_work_mem = &#39;2400MB&#39;; select pg_reload_conf(); -- 重构数据库索引和排序 REINDEX DATABASE postgres; -- 开始构建索引,该索引构建时间非常久,直接点击右上角的叉,退出 Terminal 即可 CREATE INDEX CONCURRENTLY vector_index ON modeldata USING hnsw (vector vector_ip_ops) WITH (m = 16, ef_construction = 64); -- 可以再次点击一键链接,进入 Terminal,输入下方命令,如果看到 &#34;vector_index&#34; hnsw (vector vector_ip_ops) WITH (m=&#39;16&#39;, ef_construction=&#39;64&#39;) 则代表构建完成(注意,后面没有 INVALID) \d modeldata PgVector升级:Docker-compose.V4.4.7(需执行升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/447/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/447/执行初始化 API link发起 1 个 HTTP 请求({{rootkey}} 替换成环境变量里的rootkey,{{host}}替换成自己域名) +https://xxxxx/api/admin/initv447 curl --location --request POST &#39;https://{{host}}/api/admin/initv447&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化 pg 索引以及将 file_id 中空对象转成 manual 对象。如果数据多,可能需要较长时间,可以通过日志查看进度。 +功能介绍 linkFast GPT V4.4.7 link 优化了数据库文件 crud。 兼容链接读取,作为 source。 区分手动录入和标注,可追数据至某个文件。 升级 openai sdk。V4.4.6https://doc.tryfastgpt.ai/docs/development/upgrading/446/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/446/功能介绍 link 高级编排新增模块 - 应用调用,可调用其他应用。 新增 - 必要连接校验 修复 - 下一步指引在免登录中身份问题。V4.4.5(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/445/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/445/执行初始化 API link发起 1 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv445 curl --location --request POST &#39;https://{{host}}/api/admin/initv445&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化了 variable 模块,将其合并到用户引导模块中。 +功能介绍 linkFast GPT V4.4.5 link 新增 - 下一步指引选项,可以通过模型生成 3 个预测问题。 商业版新增 - 分享链接限制及 hook 身份校验(可对接已有的用户系统)。 商业版新增 - Api Key 使用。增加别名、额度限制和过期时间。自带 appId,无需额外连接。 优化 - 全局变量与开场白合并成同一模块。升级到 V4.4.2(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/442/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/442/执行初始化 API link发起 1 个 HTTP 请求 (记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv442 curl --location --request POST &#39;https://{{host}}/api/admin/initv442&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会给初始化 Mongo 的 Bill 表的索引,之前过期时间有误。升级到 V4.4.1(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/441/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/441/执行初始化 API link发起 1 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv441 curl --location --request POST &#39;https://{{host}}/api/admin/initv441&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会给初始化 Mongo 的 dataset.files,将所有数据设置为可用。升级到 V4.4(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/44/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/44/执行初始化 API link发起 1 个 HTTP 请求 (记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv44 curl --location --request POST &#39;https://{{host}}/api/admin/initv44&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会给初始化 Mongo 的部分字段。升级到 V4.3(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/43/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/43/执行初始化 API link发起 1 个 HTTP 请求 (记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv43 curl --location --request POST &#39;https://{{host}}/api/admin/initv43&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会给 PG 数据库的 modeldata 表插入一个新列 file_id,用于存储文件 ID。 +增加环境变量 link增加一个 FILE_TOKEN_KEY 环境变量,用于生成文件预览链接,过期时间为 30 分钟。 +FILE_TOKEN_KEY=filetokenkey升级到 V4.2.1https://doc.tryfastgpt.ai/docs/development/upgrading/421/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/421/私有部署,如果添加了配置文件,需要在配置文件中修改 VectorModels 字段。增加 defaultToken 和 maxToken,分别对应直接分段时的默认 token 数量和该模型支持的 token 上限 (通常不建议超过 3000) +&#34;VectorModels&#34;: [ { &#34;model&#34;: &#34;text-embedding-ada-002&#34;, &#34;name&#34;: &#34;Embedding-2&#34;, &#34;price&#34;: 0, &#34;defaultToken&#34;: 500, &#34;maxToken&#34;: 3000 } ] 改动目的是,我们认为不需要留有选择余地,选择一个最合适的模型去进行任务即可。升级到 V4.2https://doc.tryfastgpt.ai/docs/development/upgrading/42/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/42/99.9%用户不影响,升级 4.2 主要是修改了配置文件中 QAModel 的格式。从原先的数组改成对象: +&#34;QAModel&#34;: { &#34;model&#34;: &#34;gpt-3.5-turbo-16k&#34;, &#34;name&#34;: &#34;GPT35-16k&#34;, &#34;maxToken&#34;: 16000, &#34;price&#34;: 0 } 改动目的是,我们认为不需要留有选择余地,选择一个最合适的模型去进行任务即可。升级到 V4.1https://doc.tryfastgpt.ai/docs/development/upgrading/41/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/41/如果您是从旧版本升级到 V4.1,由于新版重新设置了对话存储结构,需要初始化原来的存储内容。 +更新环境变量 linkV4.1 优化了 PostgreSQL 和 MongoDB 的连接变量,只需要填 1 个 URL 即可: +注意:/fastgpt 和 /postgres 是指数据库名称,需要和旧版的变量对应。 +# mongo 配置,不需要改. 如果连不上,可能需要去掉 ?authSource=admin - MONGODB_URI=mongodb://username:password@mongo:27017/fastgpt?authSource=admin # pg配置. 不需要改 - PG_URL=postgresql://username:password@pg:5432/postgres 初始化 API link部署新版项目,并发起 1 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initChatItem升级到 V4.0https://doc.tryfastgpt.ai/docs/development/upgrading/40/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/40/如果您是从旧版本升级到 V4,由于新版 MongoDB 表变更比较大,需要按照本文档的说明执行一些初始化脚本。 +重命名表名 link需要连接上 MongoDB 数据库,执行两条命令: +db.models.renameCollection(&#34;apps&#34;) db.sharechats.renameCollection(&#34;outlinks&#34;) warning 注意:从旧版更新到 V4, MongoDB 会自动创建空表,你需要先手动删除这两个空表,再执行上面的操作。 +初始化几个表中的字段 link依次执行下面 3 条命令,时间比较长,不成功可以重复执行(会跳过已经初始化的数据),直到所有数据更新完成。 +db.chats.find({appId: {$exists: false}}).forEach(function(item){ db.chats.updateOne( { _id: item._id, }, { &#34;$set&#34;: {&#34;appId&#34;:item.modelId}} ) }) db.collections.find({appId: {$exists: false}}).forEach(function(item){ db.collections.updateOne( { _id: item._id, }, { &#34;$set&#34;: {&#34;appId&#34;:item.modelId}} ) }) db.outlinks.find({shareId: {$exists: false}}).forEach(function(item){ db.outlinks.updateOne( { _id: item._id, }, { &#34;$set&#34;: {&#34;shareId&#34;:item._id.toString(),&#34;appId&#34;:item.modelId}} ) }) 初始化 API link部署新版项目,并发起 3 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv4 https://xxxxx/api/admin/initChat https://xxxxx/api/admin/initOutlink 1 和 2 有可能会因为内存不足挂掉,可以重复执行。 \ No newline at end of file diff --git a/docs/development/upgrading/intro/index.html b/docs/development/upgrading/intro/index.html new file mode 100644 index 000000000000..4e4d9b75b662 --- /dev/null +++ b/docs/development/upgrading/intro/index.html @@ -0,0 +1,48 @@ +升级说明 | FastGPT
+
upgrade

升级说明

FastGPT 升级说明

FastGPT 升级包括两个步骤:

  1. 镜像升级
  2. 执行升级初始化脚本

镜像名

git版

  • FastGPT 主镜像:ghcr.io/labring/fastgpt:latest
  • 商业版镜像:ghcr.io/c121914yu/fastgpt-pro:latest
  • Admin 镜像:ghcr.io/c121914yu/fastgpt-admin:latest

阿里云

  • FastGPT 主镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt
  • 商业版镜像:ghcr:registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-pro
  • Admin 镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-admin

镜像由镜像名和Tag组成,例如: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.6.1 代表4.6.3版本镜像,具体可以看 docker hub, github 仓库。

Sealos 修改镜像

  1. 打开 Sealos Cloud, 找到桌面上的应用管理

  1. 选择对应的应用 - 点击右边三个点 - 变更

  1. 修改镜像 - 确认变更

    如果要修改配置文件,可以拉到下面的配置文件进行修改。

Docker-Compose 修改镜像

直接修改yml文件中的image: 即可。随后执行:

+  docker-compose pull
+docker-compose up -d
+  

执行升级初始化脚本

镜像更新完后,可以查看文档中的版本介绍,通常需要执行升级脚本的版本都会标明包含升级脚本,打开对应的文档,参考说明执行升级脚本即可,大部分时候都是需要发送一个POST请求。

QA

为什么需要执行升级脚本

数据表出现大幅度变更,无法通过设置默认值,或复杂度较高时,会通过升级脚本来更新部分数据表字段。 +严格按初始化步骤进行操作,不会造成旧数据丢失。但在初始化过程中,如果数据量大,需要初始化的时间较长,这段时间可能会造成服务无法正常使用。

{{host}} 是什么

{{}} 代表变量, {{host}}代表一个名为 host 的变量。指的是你服务器的域名或 IP。

Sealos 中,你可以在下图中找到你的域名:

如何获取 rootkey

docker-compose.yml中的environment中获取,对应的是ROOT_KEY的值。

sealos 中可以从上图左侧的环境变量中获取。

如何跨版本升级!!

建议逐一版本升级,防止脏数据。例如,当前版本是4.4.7,需要升级到4.6。

  1. 修改镜像到4.5,执行初始化
  2. 修改镜像到4.5.1,执行初始化
  3. 修改镜像到4.5.2,执行初始化
  4. 修改镜像到4.6,执行初始化
  5. …..

逐一升级

+ + + + \ No newline at end of file diff --git a/docs/faq/app/index.html b/docs/faq/app/index.html new file mode 100644 index 000000000000..eb7300ae4b1c --- /dev/null +++ b/docs/faq/app/index.html @@ -0,0 +1,44 @@ +应用使用问题 | FastGPT
+
quiz

应用使用问题

FastGPT 常见应用使用问题,包括简易应用、工作流和插件

工作流中多轮对话场景中如何使连续问题被问题分类节点正确的归类

问题分类节点具有获取上下文信息的能力,当处理两个关联性较大的问题时,模型的判断准确性往往依赖于这两个问题之间的联系和模型的能力。例如,当用户先问“我该如何使用这个功能?”接着又询问“这个功能有什么限制?”时,模型借助上下文信息,就能够更精准地理解并响应。

但是,当连续问题之间的关联性较小,模型判断的准确度可能会受到限制。在这种情况下,我们可以引入全局变量的概念来记录分类结果。在后续的问题分类阶段,首先检查全局变量是否存有分类结果。如果有,那么直接沿用该结果;若没有,则让模型自行判断。

建议:构建批量运行脚本进行测试,评估问题分类的准确性。

系统编排配置中的定时执行,如果用户打开分享的连接,停留在那个页面,定时执行触发问题

发布后,后台生效。

AI对话回答要求中的Markdown语法取消

在针对知识库的回答要求里有, 要给它配置提示词,不然他就是默认的,默认的里面就有该语法。

+ + + + \ No newline at end of file diff --git a/docs/faq/chat/index.html b/docs/faq/chat/index.html new file mode 100644 index 000000000000..ed0c872c4317 --- /dev/null +++ b/docs/faq/chat/index.html @@ -0,0 +1,44 @@ +聊天框问题 | FastGPT
+
quiz

聊天框问题

FastGPT 常见聊天框问题

我修改了工作台的应用,为什么在“聊天”时没有更新配置?

应用需要点击发布后,聊天才会更新应用。

浏览器不支持语音输入

  1. 首先需要确保浏览器、电脑本身麦克风权限的开启。
  2. 确认浏览器允许该站点使用麦克风,并且选择正确的麦克风来源。
  3. 需有 SSL 证书的站点才可以使用麦克风。
+ + + + \ No newline at end of file diff --git a/docs/faq/dataset/index.html b/docs/faq/dataset/index.html new file mode 100644 index 000000000000..dbfbb78f3442 --- /dev/null +++ b/docs/faq/dataset/index.html @@ -0,0 +1,44 @@ +知识库使用问题 | FastGPT
+
quiz

知识库使用问题

常见知识库使用问题

上传的文件内容出现中文乱码

将文件另存为 UTF-8 编码格式。

知识库配置里的文件处理模型是什么?与索引模型有什么区别?

  • 文件处理模型:用于数据处理的【增强处理】和【问答拆分】。在【增强处理】中,生成相关问题和摘要,在【问答拆分】中执行问答对生成。
  • 索引模型:用于向量化,即通过对文本数据进行处理和组织,构建出一个能够快速查询的数据结构。

基于知识库的查询,但是问题相关的答案过多。ai回答到一半就不继续回答。

FastGPT回复长度计算公式:

最大回复=min(配置的最大回复(内置的限制),最大上下文(输入和输出的总和)-历史记录)

18K模型->输入与输出的和

输出增多->输入减小

所以可以:

  1. 检查配置的最大回复(回复上限)
  2. 减小输入来增大输出,即减小历史记录,在工作流其实也就是“聊天记录”

配置的最大回复:

  1. 私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出

受到模型上下文的限制,有时候达不到聊天记录的轮次,连续对话字数过多就会报上下文不够的错误。

FastGPT回复长度计算公式:

最大回复=min(配置的最大回复(内置的限制),最大上下文(输入和输出的总和)-历史记录)

18K模型->输入与输出的和

输出增多->输入减小

所以可以:

  1. 检查配置的最大回复(回复上限)
  2. 减小输入来增大输出,即减小历史记录,在工作流其实也就是“聊天记录”

配置的最大回复:

  1. 私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出
+ + + + \ No newline at end of file diff --git a/docs/faq/docker/index.html b/docs/faq/docker/index.html new file mode 100644 index 000000000000..aae72ca1c63a --- /dev/null +++ b/docs/faq/docker/index.html @@ -0,0 +1 @@ +/docs/development/docker/#faq \ No newline at end of file diff --git a/docs/faq/error/index.html b/docs/faq/error/index.html new file mode 100644 index 000000000000..e13fae0857e7 --- /dev/null +++ b/docs/faq/error/index.html @@ -0,0 +1,46 @@ +报错 | FastGPT
+
quiz

报错

  1. 当前分组上游负载已饱和,请稍后再试(request id:202407100753411462086782835521)

是oneapi渠道的问题,可以换个模型用or换一家中转站

  1. 使用API时在日志中报错Connection Error

大概率是api-key填写了openapi,然后部署的服务器在国内,不能访问海外的api,可以使用中转或者反代的手段解决访问不到的问题

+ + + + \ No newline at end of file diff --git a/docs/faq/external_channel_integration/index.html b/docs/faq/external_channel_integration/index.html new file mode 100644 index 000000000000..57a042843dfc --- /dev/null +++ b/docs/faq/external_channel_integration/index.html @@ -0,0 +1,44 @@ +接入外部渠道 | FastGPT
+
integration

接入外部渠道

如何通过外部渠道与 FastGPT 集成,实现对多种平台的支持

  1. 接入cow,图文对话无法直接显示图片

提示词给引导,不要以markdown格式输出。图片需要二开 cow 实现图片链接截取并发送。

  1. 可以获取到用户发送问答的记录吗

在应用的对话日志里可以查看。

+ + + + \ No newline at end of file diff --git a/docs/faq/index.html b/docs/faq/index.html new file mode 100644 index 000000000000..c672a1a5e0f0 --- /dev/null +++ b/docs/faq/index.html @@ -0,0 +1,44 @@ +FAQ | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/faq/index.xml b/docs/faq/index.xml new file mode 100644 index 000000000000..080c67113b9b --- /dev/null +++ b/docs/faq/index.xml @@ -0,0 +1,21 @@ +FAQ on FastGPThttps://doc.tryfastgpt.ai/docs/faq/Recent content in FAQ on FastGPTHugo -- gohugo.iozh-cnDocker 部署问题https://doc.tryfastgpt.ai/docs/faq/docker/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/docker/私有部署常见问题https://doc.tryfastgpt.ai/docs/faq/privatedeploy/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/privatedeploy/聊天框问题https://doc.tryfastgpt.ai/docs/faq/chat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/chat/我修改了工作台的应用,为什么在“聊天”时没有更新配置? link应用需要点击发布后,聊天才会更新应用。 +浏览器不支持语音输入 link 首先需要确保浏览器、电脑本身麦克风权限的开启。 确认浏览器允许该站点使用麦克风,并且选择正确的麦克风来源。 需有 SSL 证书的站点才可以使用麦克风。应用使用问题https://doc.tryfastgpt.ai/docs/faq/app/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/app/工作流中多轮对话场景中如何使连续问题被问题分类节点正确的归类 link问题分类节点具有获取上下文信息的能力,当处理两个关联性较大的问题时,模型的判断准确性往往依赖于这两个问题之间的联系和模型的能力。例如,当用户先问“我该如何使用这个功能?”接着又询问“这个功能有什么限制?”时,模型借助上下文信息,就能够更精准地理解并响应。 +但是,当连续问题之间的关联性较小,模型判断的准确度可能会受到限制。在这种情况下,我们可以引入全局变量的概念来记录分类结果。在后续的问题分类阶段,首先检查全局变量是否存有分类结果。如果有,那么直接沿用该结果;若没有,则让模型自行判断。 +建议:构建批量运行脚本进行测试,评估问题分类的准确性。 +系统编排配置中的定时执行,如果用户打开分享的连接,停留在那个页面,定时执行触发问题 link发布后,后台生效。 +AI对话回答要求中的Markdown语法取消 link在针对知识库的回答要求里有, 要给它配置提示词,不然他就是默认的,默认的里面就有该语法。知识库使用问题https://doc.tryfastgpt.ai/docs/faq/dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/dataset/上传的文件内容出现中文乱码 link将文件另存为 UTF-8 编码格式。 +知识库配置里的文件处理模型是什么?与索引模型有什么区别? link 文件处理模型:用于数据处理的【增强处理】和【问答拆分】。在【增强处理】中,生成相关问题和摘要,在【问答拆分】中执行问答对生成。 索引模型:用于向量化,即通过对文本数据进行处理和组织,构建出一个能够快速查询的数据结构。 基于知识库的查询,但是问题相关的答案过多。ai回答到一半就不继续回答。 linkFastGPT回复长度计算公式: +最大回复=min(配置的最大回复(内置的限制),最大上下文(输入和输出的总和)-历史记录) +18K模型-&gt;输入与输出的和 +输出增多-&gt;输入减小 +所以可以: +检查配置的最大回复(回复上限) 减小输入来增大输出,即减小历史记录,在工作流其实也就是“聊天记录” 配置的最大回复: +私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出 受到模型上下文的限制,有时候达不到聊天记录的轮次,连续对话字数过多就会报上下文不够的错误。 linkFastGPT回复长度计算公式: +最大回复=min(配置的最大回复(内置的限制),最大上下文(输入和输出的总和)-历史记录) +18K模型-&gt;输入与输出的和 +输出增多-&gt;输入减小 +所以可以: +检查配置的最大回复(回复上限) 减小输入来增大输出,即减小历史记录,在工作流其实也就是“聊天记录” 配置的最大回复: +私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出接入外部渠道https://doc.tryfastgpt.ai/docs/faq/external_channel_integration/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/external_channel_integration/接入cow,图文对话无法直接显示图片 link 提示词给引导,不要以markdown格式输出。图片需要二开 cow 实现图片链接截取并发送。 +可以获取到用户发送问答的记录吗 link 在应用的对话日志里可以查看。报错https://doc.tryfastgpt.ai/docs/faq/error/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/error/当前分组上游负载已饱和,请稍后再试(request id:202407100753411462086782835521) link 是oneapi渠道的问题,可以换个模型用or换一家中转站 +使用API时在日志中报错Connection Error link 大概率是api-key填写了openapi,然后部署的服务器在国内,不能访问海外的api,可以使用中转或者反代的手段解决访问不到的问题积分消耗https://doc.tryfastgpt.ai/docs/faq/points_consumption/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/points_consumption/接入oneapi后,为什么还会消耗fastgpt的积分 link 矢量数据库检索会默认消耗。可以查看看绑定提示和使用记录。其他问题https://doc.tryfastgpt.ai/docs/faq/other/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/other/oneapi 官网是哪个 link只有开源的 README,没官网,GitHub: https://github.com/songquanpeng/one-api \ No newline at end of file diff --git a/docs/faq/other/index.html b/docs/faq/other/index.html new file mode 100644 index 000000000000..923ac1d86200 --- /dev/null +++ b/docs/faq/other/index.html @@ -0,0 +1,44 @@ +其他问题 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/faq/points_consumption/index.html b/docs/faq/points_consumption/index.html new file mode 100644 index 000000000000..43f227bc83a4 --- /dev/null +++ b/docs/faq/points_consumption/index.html @@ -0,0 +1,44 @@ +积分消耗 | FastGPT
+
points

积分消耗

了解 FastGPT 中的积分消耗机制和使用场景

  1. 接入oneapi后,为什么还会消耗fastgpt的积分

矢量数据库检索会默认消耗。可以查看看绑定提示和使用记录。

+ + + + \ No newline at end of file diff --git a/docs/faq/privatedeploy/index.html b/docs/faq/privatedeploy/index.html new file mode 100644 index 000000000000..c2ed33cf63cd --- /dev/null +++ b/docs/faq/privatedeploy/index.html @@ -0,0 +1 @@ +/docs/development/faq/ \ No newline at end of file diff --git a/docs/fonts/KaTeX_AMS-Regular.ttf b/docs/fonts/KaTeX_AMS-Regular.ttf new file mode 100644 index 000000000000..c6f9a5e7c03f Binary files /dev/null and b/docs/fonts/KaTeX_AMS-Regular.ttf differ diff --git a/docs/fonts/KaTeX_AMS-Regular.woff b/docs/fonts/KaTeX_AMS-Regular.woff new file mode 100644 index 000000000000..b804d7b33a3f Binary files /dev/null and b/docs/fonts/KaTeX_AMS-Regular.woff differ diff --git a/docs/fonts/KaTeX_AMS-Regular.woff2 b/docs/fonts/KaTeX_AMS-Regular.woff2 new file mode 100644 index 000000000000..0acaaff03d4b Binary files /dev/null and b/docs/fonts/KaTeX_AMS-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Caligraphic-Bold.ttf b/docs/fonts/KaTeX_Caligraphic-Bold.ttf new file mode 100644 index 000000000000..9ff4a5e04421 Binary files /dev/null and b/docs/fonts/KaTeX_Caligraphic-Bold.ttf differ diff --git a/docs/fonts/KaTeX_Caligraphic-Bold.woff b/docs/fonts/KaTeX_Caligraphic-Bold.woff new file mode 100644 index 000000000000..9759710d1d3e Binary files /dev/null and b/docs/fonts/KaTeX_Caligraphic-Bold.woff differ diff --git a/docs/fonts/KaTeX_Caligraphic-Bold.woff2 b/docs/fonts/KaTeX_Caligraphic-Bold.woff2 new file mode 100644 index 000000000000..f390922eceff Binary files /dev/null and b/docs/fonts/KaTeX_Caligraphic-Bold.woff2 differ diff --git a/docs/fonts/KaTeX_Caligraphic-Regular.ttf b/docs/fonts/KaTeX_Caligraphic-Regular.ttf new file mode 100644 index 000000000000..f522294ff0f3 Binary files /dev/null and b/docs/fonts/KaTeX_Caligraphic-Regular.ttf differ diff --git a/docs/fonts/KaTeX_Caligraphic-Regular.woff b/docs/fonts/KaTeX_Caligraphic-Regular.woff new file mode 100644 index 000000000000..9bdd534fd2be Binary files /dev/null and b/docs/fonts/KaTeX_Caligraphic-Regular.woff differ diff --git a/docs/fonts/KaTeX_Caligraphic-Regular.woff2 b/docs/fonts/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 000000000000..75344a1f98e3 Binary files /dev/null and b/docs/fonts/KaTeX_Caligraphic-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Fraktur-Bold.ttf b/docs/fonts/KaTeX_Fraktur-Bold.ttf new file mode 100644 index 000000000000..4e98259c3b54 Binary files /dev/null and b/docs/fonts/KaTeX_Fraktur-Bold.ttf differ diff --git a/docs/fonts/KaTeX_Fraktur-Bold.woff b/docs/fonts/KaTeX_Fraktur-Bold.woff new file mode 100644 index 000000000000..e7730f66275c Binary files /dev/null and b/docs/fonts/KaTeX_Fraktur-Bold.woff differ diff --git a/docs/fonts/KaTeX_Fraktur-Bold.woff2 b/docs/fonts/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 000000000000..395f28beac23 Binary files /dev/null and b/docs/fonts/KaTeX_Fraktur-Bold.woff2 differ diff --git a/docs/fonts/KaTeX_Fraktur-Regular.ttf b/docs/fonts/KaTeX_Fraktur-Regular.ttf new file mode 100644 index 000000000000..b8461b275fae Binary files /dev/null and b/docs/fonts/KaTeX_Fraktur-Regular.ttf differ diff --git a/docs/fonts/KaTeX_Fraktur-Regular.woff b/docs/fonts/KaTeX_Fraktur-Regular.woff new file mode 100644 index 000000000000..acab069f90b6 Binary files /dev/null and b/docs/fonts/KaTeX_Fraktur-Regular.woff differ diff --git a/docs/fonts/KaTeX_Fraktur-Regular.woff2 b/docs/fonts/KaTeX_Fraktur-Regular.woff2 new file mode 100644 index 000000000000..735f6948d63c Binary files /dev/null and b/docs/fonts/KaTeX_Fraktur-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Main-Bold.ttf b/docs/fonts/KaTeX_Main-Bold.ttf new file mode 100644 index 000000000000..4060e627dc34 Binary files /dev/null and b/docs/fonts/KaTeX_Main-Bold.ttf differ diff --git a/docs/fonts/KaTeX_Main-Bold.woff b/docs/fonts/KaTeX_Main-Bold.woff new file mode 100644 index 000000000000..f38136ac1cc2 Binary files /dev/null and b/docs/fonts/KaTeX_Main-Bold.woff differ diff --git a/docs/fonts/KaTeX_Main-Bold.woff2 b/docs/fonts/KaTeX_Main-Bold.woff2 new file mode 100644 index 000000000000..ab2ad21da6fb Binary files /dev/null and b/docs/fonts/KaTeX_Main-Bold.woff2 differ diff --git a/docs/fonts/KaTeX_Main-BoldItalic.ttf b/docs/fonts/KaTeX_Main-BoldItalic.ttf new file mode 100644 index 000000000000..dc007977ee70 Binary files /dev/null and b/docs/fonts/KaTeX_Main-BoldItalic.ttf differ diff --git a/docs/fonts/KaTeX_Main-BoldItalic.woff b/docs/fonts/KaTeX_Main-BoldItalic.woff new file mode 100644 index 000000000000..67807b0bd4f8 Binary files /dev/null and b/docs/fonts/KaTeX_Main-BoldItalic.woff differ diff --git a/docs/fonts/KaTeX_Main-BoldItalic.woff2 b/docs/fonts/KaTeX_Main-BoldItalic.woff2 new file mode 100644 index 000000000000..5931794de4a2 Binary files /dev/null and b/docs/fonts/KaTeX_Main-BoldItalic.woff2 differ diff --git a/docs/fonts/KaTeX_Main-Italic.ttf b/docs/fonts/KaTeX_Main-Italic.ttf new file mode 100644 index 000000000000..0e9b0f354ad4 Binary files /dev/null and b/docs/fonts/KaTeX_Main-Italic.ttf differ diff --git a/docs/fonts/KaTeX_Main-Italic.woff b/docs/fonts/KaTeX_Main-Italic.woff new file mode 100644 index 000000000000..6f43b594b6c1 Binary files /dev/null and b/docs/fonts/KaTeX_Main-Italic.woff differ diff --git a/docs/fonts/KaTeX_Main-Italic.woff2 b/docs/fonts/KaTeX_Main-Italic.woff2 new file mode 100644 index 000000000000..b50920e13880 Binary files /dev/null and b/docs/fonts/KaTeX_Main-Italic.woff2 differ diff --git a/docs/fonts/KaTeX_Main-Regular.ttf b/docs/fonts/KaTeX_Main-Regular.ttf new file mode 100644 index 000000000000..dd45e1ed2e18 Binary files /dev/null and b/docs/fonts/KaTeX_Main-Regular.ttf differ diff --git a/docs/fonts/KaTeX_Main-Regular.woff b/docs/fonts/KaTeX_Main-Regular.woff new file mode 100644 index 000000000000..21f5812968c4 Binary files /dev/null and b/docs/fonts/KaTeX_Main-Regular.woff differ diff --git a/docs/fonts/KaTeX_Main-Regular.woff2 b/docs/fonts/KaTeX_Main-Regular.woff2 new file mode 100644 index 000000000000..eb24a7ba282b Binary files /dev/null and b/docs/fonts/KaTeX_Main-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Math-BoldItalic.ttf b/docs/fonts/KaTeX_Math-BoldItalic.ttf new file mode 100644 index 000000000000..728ce7a1e2cb Binary files /dev/null and b/docs/fonts/KaTeX_Math-BoldItalic.ttf differ diff --git a/docs/fonts/KaTeX_Math-BoldItalic.woff b/docs/fonts/KaTeX_Math-BoldItalic.woff new file mode 100644 index 000000000000..0ae390d74c9f Binary files /dev/null and b/docs/fonts/KaTeX_Math-BoldItalic.woff differ diff --git a/docs/fonts/KaTeX_Math-BoldItalic.woff2 b/docs/fonts/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 000000000000..29657023adc0 Binary files /dev/null and b/docs/fonts/KaTeX_Math-BoldItalic.woff2 differ diff --git a/docs/fonts/KaTeX_Math-Italic.ttf b/docs/fonts/KaTeX_Math-Italic.ttf new file mode 100644 index 000000000000..70d559b4e937 Binary files /dev/null and b/docs/fonts/KaTeX_Math-Italic.ttf differ diff --git a/docs/fonts/KaTeX_Math-Italic.woff b/docs/fonts/KaTeX_Math-Italic.woff new file mode 100644 index 000000000000..eb5159d4c1ca Binary files /dev/null and b/docs/fonts/KaTeX_Math-Italic.woff differ diff --git a/docs/fonts/KaTeX_Math-Italic.woff2 b/docs/fonts/KaTeX_Math-Italic.woff2 new file mode 100644 index 000000000000..215c143fd780 Binary files /dev/null and b/docs/fonts/KaTeX_Math-Italic.woff2 differ diff --git a/docs/fonts/KaTeX_SansSerif-Bold.ttf b/docs/fonts/KaTeX_SansSerif-Bold.ttf new file mode 100644 index 000000000000..2f65a8a3a6d3 Binary files /dev/null and b/docs/fonts/KaTeX_SansSerif-Bold.ttf differ diff --git a/docs/fonts/KaTeX_SansSerif-Bold.woff b/docs/fonts/KaTeX_SansSerif-Bold.woff new file mode 100644 index 000000000000..8d47c02d9408 Binary files /dev/null and b/docs/fonts/KaTeX_SansSerif-Bold.woff differ diff --git a/docs/fonts/KaTeX_SansSerif-Bold.woff2 b/docs/fonts/KaTeX_SansSerif-Bold.woff2 new file mode 100644 index 000000000000..cfaa3bda5924 Binary files /dev/null and b/docs/fonts/KaTeX_SansSerif-Bold.woff2 differ diff --git a/docs/fonts/KaTeX_SansSerif-Italic.ttf b/docs/fonts/KaTeX_SansSerif-Italic.ttf new file mode 100644 index 000000000000..d5850df98ec1 Binary files /dev/null and b/docs/fonts/KaTeX_SansSerif-Italic.ttf differ diff --git a/docs/fonts/KaTeX_SansSerif-Italic.woff b/docs/fonts/KaTeX_SansSerif-Italic.woff new file mode 100644 index 000000000000..7e02df963621 Binary files /dev/null and b/docs/fonts/KaTeX_SansSerif-Italic.woff differ diff --git a/docs/fonts/KaTeX_SansSerif-Italic.woff2 b/docs/fonts/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 000000000000..349c06dc609f Binary files /dev/null and b/docs/fonts/KaTeX_SansSerif-Italic.woff2 differ diff --git a/docs/fonts/KaTeX_SansSerif-Regular.ttf b/docs/fonts/KaTeX_SansSerif-Regular.ttf new file mode 100644 index 000000000000..537279f6bd21 Binary files /dev/null and b/docs/fonts/KaTeX_SansSerif-Regular.ttf differ diff --git a/docs/fonts/KaTeX_SansSerif-Regular.woff b/docs/fonts/KaTeX_SansSerif-Regular.woff new file mode 100644 index 000000000000..31b84829b42e Binary files /dev/null and b/docs/fonts/KaTeX_SansSerif-Regular.woff differ diff --git a/docs/fonts/KaTeX_SansSerif-Regular.woff2 b/docs/fonts/KaTeX_SansSerif-Regular.woff2 new file mode 100644 index 000000000000..a90eea85f6f7 Binary files /dev/null and b/docs/fonts/KaTeX_SansSerif-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Script-Regular.ttf b/docs/fonts/KaTeX_Script-Regular.ttf new file mode 100644 index 000000000000..fd679bf374af Binary files /dev/null and b/docs/fonts/KaTeX_Script-Regular.ttf differ diff --git a/docs/fonts/KaTeX_Script-Regular.woff b/docs/fonts/KaTeX_Script-Regular.woff new file mode 100644 index 000000000000..0e7da821eee0 Binary files /dev/null and b/docs/fonts/KaTeX_Script-Regular.woff differ diff --git a/docs/fonts/KaTeX_Script-Regular.woff2 b/docs/fonts/KaTeX_Script-Regular.woff2 new file mode 100644 index 000000000000..b3048fc11568 Binary files /dev/null and b/docs/fonts/KaTeX_Script-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Size1-Regular.ttf b/docs/fonts/KaTeX_Size1-Regular.ttf new file mode 100644 index 000000000000..871fd7d19d86 Binary files /dev/null and b/docs/fonts/KaTeX_Size1-Regular.ttf differ diff --git a/docs/fonts/KaTeX_Size1-Regular.woff b/docs/fonts/KaTeX_Size1-Regular.woff new file mode 100644 index 000000000000..7f292d91184f Binary files /dev/null and b/docs/fonts/KaTeX_Size1-Regular.woff differ diff --git a/docs/fonts/KaTeX_Size1-Regular.woff2 b/docs/fonts/KaTeX_Size1-Regular.woff2 new file mode 100644 index 000000000000..c5a8462fbfe2 Binary files /dev/null and b/docs/fonts/KaTeX_Size1-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Size2-Regular.ttf b/docs/fonts/KaTeX_Size2-Regular.ttf new file mode 100644 index 000000000000..7a212caf91c0 Binary files /dev/null and b/docs/fonts/KaTeX_Size2-Regular.ttf differ diff --git a/docs/fonts/KaTeX_Size2-Regular.woff b/docs/fonts/KaTeX_Size2-Regular.woff new file mode 100644 index 000000000000..d241d9be2d31 Binary files /dev/null and b/docs/fonts/KaTeX_Size2-Regular.woff differ diff --git a/docs/fonts/KaTeX_Size2-Regular.woff2 b/docs/fonts/KaTeX_Size2-Regular.woff2 new file mode 100644 index 000000000000..e1bccfe2403a Binary files /dev/null and b/docs/fonts/KaTeX_Size2-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Size3-Regular.ttf b/docs/fonts/KaTeX_Size3-Regular.ttf new file mode 100644 index 000000000000..00bff3495fa9 Binary files /dev/null and b/docs/fonts/KaTeX_Size3-Regular.ttf differ diff --git a/docs/fonts/KaTeX_Size3-Regular.woff b/docs/fonts/KaTeX_Size3-Regular.woff new file mode 100644 index 000000000000..e6e9b658dcf1 Binary files /dev/null and b/docs/fonts/KaTeX_Size3-Regular.woff differ diff --git a/docs/fonts/KaTeX_Size3-Regular.woff2 b/docs/fonts/KaTeX_Size3-Regular.woff2 new file mode 100644 index 000000000000..249a28662218 Binary files /dev/null and b/docs/fonts/KaTeX_Size3-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Size4-Regular.ttf b/docs/fonts/KaTeX_Size4-Regular.ttf new file mode 100644 index 000000000000..74f08921f00f Binary files /dev/null and b/docs/fonts/KaTeX_Size4-Regular.ttf differ diff --git a/docs/fonts/KaTeX_Size4-Regular.woff b/docs/fonts/KaTeX_Size4-Regular.woff new file mode 100644 index 000000000000..e1ec5457664f Binary files /dev/null and b/docs/fonts/KaTeX_Size4-Regular.woff differ diff --git a/docs/fonts/KaTeX_Size4-Regular.woff2 b/docs/fonts/KaTeX_Size4-Regular.woff2 new file mode 100644 index 000000000000..680c13085076 Binary files /dev/null and b/docs/fonts/KaTeX_Size4-Regular.woff2 differ diff --git a/docs/fonts/KaTeX_Typewriter-Regular.ttf b/docs/fonts/KaTeX_Typewriter-Regular.ttf new file mode 100644 index 000000000000..c83252c5714c Binary files /dev/null and b/docs/fonts/KaTeX_Typewriter-Regular.ttf differ diff --git a/docs/fonts/KaTeX_Typewriter-Regular.woff b/docs/fonts/KaTeX_Typewriter-Regular.woff new file mode 100644 index 000000000000..2432419f2893 Binary files /dev/null and b/docs/fonts/KaTeX_Typewriter-Regular.woff differ diff --git a/docs/fonts/KaTeX_Typewriter-Regular.woff2 b/docs/fonts/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 000000000000..771f1af705f5 Binary files /dev/null and b/docs/fonts/KaTeX_Typewriter-Regular.woff2 differ diff --git a/docs/fonts/material-symbols-outlined.woff b/docs/fonts/material-symbols-outlined.woff new file mode 100644 index 000000000000..44a3eb5a1660 Binary files /dev/null and b/docs/fonts/material-symbols-outlined.woff differ diff --git a/docs/fonts/material-symbols-outlined.woff2 b/docs/fonts/material-symbols-outlined.woff2 new file mode 100644 index 000000000000..cca755f1d23a Binary files /dev/null and b/docs/fonts/material-symbols-outlined.woff2 differ diff --git a/docs/guide/admin/index.html b/docs/guide/admin/index.html new file mode 100644 index 000000000000..8e9c191f389c --- /dev/null +++ b/docs/guide/admin/index.html @@ -0,0 +1,44 @@ +商业版后台 | FastGPT
+
商业版后台
chat_bubble

商业版后台

商业版后台使用教程


+ + + + \ No newline at end of file diff --git a/docs/guide/admin/index.xml b/docs/guide/admin/index.xml new file mode 100644 index 000000000000..c8f3b3311005 --- /dev/null +++ b/docs/guide/admin/index.xml @@ -0,0 +1,7 @@ +商业版后台 on FastGPThttps://doc.tryfastgpt.ai/docs/guide/admin/Recent content in 商业版后台 on FastGPTHugo -- gohugo.iozh-cn钉钉 SSO 配置https://doc.tryfastgpt.ai/docs/guide/admin/sso_dingtalk/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/admin/sso_dingtalk/1. 注册钉钉应用 link登录 钉钉开放平台,创建一个应用。 +2. 配置钉钉应用安全设置 link点击进入创建好的应用后,点开安全设置,配置出口 IP(服务器 IP),和重定向 URL。重定向 URL 填写逻辑: +{{fastgpt 域名}}/login/provider +3. 设置钉钉应用权限 link点击进入创建好的应用后,点开权限设置,开放两个权限: 个人手机号信息和通讯录个人信息读权限 +4. 发布应用 link点击进入创建好的应用后,点开版本管理与发布,随便创建一个新版本即可。 +5. 在 FastGPT Admin 配置钉钉应用 id link名字都是对应上,直接填写即可。 +6. 测试 link \ No newline at end of file diff --git a/docs/guide/admin/sso_dingtalk/index.html b/docs/guide/admin/sso_dingtalk/index.html new file mode 100644 index 000000000000..82503915b5b9 --- /dev/null +++ b/docs/guide/admin/sso_dingtalk/index.html @@ -0,0 +1,44 @@ +钉钉 SSO 配置 | FastGPT
+
chat_bubble

钉钉 SSO 配置

钉钉 SSO 登录

1. 注册钉钉应用

登录 钉钉开放平台,创建一个应用。

alt text

2. 配置钉钉应用安全设置

点击进入创建好的应用后,点开安全设置,配置出口 IP(服务器 IP),和重定向 URL。重定向 URL 填写逻辑:

{{fastgpt 域名}}/login/provider

alt text

3. 设置钉钉应用权限

点击进入创建好的应用后,点开权限设置,开放两个权限: 个人手机号信息通讯录个人信息读权限

alt text

4. 发布应用

点击进入创建好的应用后,点开版本管理与发布,随便创建一个新版本即可。

5. 在 FastGPT Admin 配置钉钉应用 id

名字都是对应上,直接填写即可。

alt textalt text

6. 测试

alt text

+ + + + \ No newline at end of file diff --git a/docs/guide/course/ai_settings/index.html b/docs/guide/course/ai_settings/index.html new file mode 100644 index 000000000000..6b275168c489 --- /dev/null +++ b/docs/guide/course/ai_settings/index.html @@ -0,0 +1,81 @@ +AI 相关参数配置说明 | FastGPT
+
sign_language

AI 相关参数配置说明

FastGPT AI 相关参数配置说明

在 FastGPT 的 AI 对话模块中,有一个 AI 高级配置,里面包含了 AI 模型的参数配置,本文详细介绍这些配置的含义。

alt textalt textalt text

流响应(高级编排 AI 对话 特有)

旧版名字叫做:返回 AI 内容;新版改名:流响应。

这是一个开关,打开的时候,当 AI 对话模块运行时,会将其输出的内容返回到浏览器(API响应); +如果关闭,会强制使用非流模式调用模型,并且 AI 输出的内容不会返回到浏览器,但是生成的内容仍可以通过【AI回复】进行输出。你可以将【AI回复】连接到其他模块中进行二次使用。

最大上下文

代表模型最多容纳的文字数量。

函数调用

支持函数调用的模型,在使用工具时更加准确。

温度

越低回答越严谨,少废话(实测下来,感觉差别不大)

回复上限

最大回复 token 数量。注意,是回复的Tokens!不是上下文 tokens。

通常,回复上限=min(模型允许的最大回复上限, 最大上下文-已用上下文)

所以,一般配置模型时,不会把最大上下文配置成模型实际最大上下文,而是预留预定空间给回答,例如 128k 模型,可以配置 max_context=115000

系统提示词

被放置在上下文数组的最前面,role 为 system,用于引导模型。

记忆轮数(仅简易模式)

可以配置模型支持的记忆轮数,如果模型的超出上下文,系统会自动截断,尽可能保证不超模型上下文。

所以尽管配置 30 轮对话,实际运行时候,不一定会达到 30 轮。

引用模板 & 引用提示词

进行知识库搜索后,你可以自定义组织检索结果构成的提示词,这个配置,仅工作流中 AI 对话节点可用。并且,只会在有引用知识库内容时才会生效。

alt text

AI 对话消息组成

想使用明白这两个变量,首先要了解传递传递给 AI 模型的消息格式。它是一个数组,FastGPT 中这个数组的组成形式为:

+  [
+    内置提示词(config.json 配置,一般为空)
+    系统提示词 (用户输入的提示词)
+    历史记录
+    问题(由引用提示词、引用模板和用户问题组成)
+]
+  

引用模板和提示词设计

简易模式已移除该功能,仅在工作流中可配置,可点击工作流中AI对话节点内,知识库引用旁边的setting icon进行配置。随着模型的增强,这部分功能将逐步弱化。

引用模板和引用提示词通常是成对出现,引用提示词依赖引用模板。

FastGPT 知识库采用 QA 对(不一定都是问答格式,仅代表两个变量)的格式存储,在转义成字符串时候会根据引用模板来进行格式化。知识库包含多个可用变量: q, a, sourceId(数据的ID), index(第n个数据), source(数据的集合名、文件名),score(距离得分,0-1) 可以通过 {{q}} {{a}} {{sourceId}} {{index}} {{source}} {{score}} 按需引入。下面一个模板例子:

可以通过 知识库结构讲解 了解详细的知识库的结构。

引用模板

+  {instruction:"{{q}}",output:"{{a}}",source:"{{source}}"}
+  

搜索到的知识库,会自动将 q,a,source 替换成对应的内容。每条搜索到的内容,会通过 \n 隔开。例如:

+  {instruction:"电影《铃芽之旅》的导演是谁?",output:"电影《铃芽之旅》的导演是新海诚。",source:"手动输入"}
+{instruction:"本作的主人公是谁?",output:"本作的主人公是名叫铃芽的少女。",source:""}
+{instruction:"电影《铃芽之旅》男主角是谁?",output:"电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。",source:""}
+{instruction:"电影《铃芽之旅》的编剧是谁?22",output:"新海诚是本片的编剧。",source:"手动输入"}
+  

引用提示词

引用模板需要和引用提示词一起使用,提示词中可以写引用模板的格式说明以及对话的要求等。可以使用 {{quote}} 来使用 引用模板,使用 {{question}} 来引入问题。例如:

+  你的背景知识:
+"""
+{{quote}}
+"""
+对话要求:
+1. 背景知识是最新的,其中 instruction 是相关介绍,output 是预期回答或补充。
+2. 使用背景知识回答问题。
+3. 背景知识无法回答问题时,你可以礼貌的的回答用户问题。
+我的问题是:"{{question}}"
+  

转义后则为:

+  你的背景知识:
+"""
+{instruction:"电影《铃芽之旅》的导演是谁?",output:"电影《铃芽之旅》的导演是新海诚。",source:"手动输入"}
+{instruction:"本作的主人公是谁?",output:"本作的主人公是名叫铃芽的少女。",source:""}
+{instruction:"电影《铃芽之旅》男主角是谁?",output:"电影《铃芽之旅》男主角是宗像草太,由松村北斗配音}
+"""
+对话要求:
+1. 背景知识是最新的,其中 instruction 是相关介绍,output 是预期回答或补充。
+2. 使用背景知识回答问题。
+3. 背景知识无法回答问题时,你可以礼貌的的回答用户问题。
+我的问题是:"{{question}}"
+  

总结

引用模板规定了搜索出来的内容如何组成一句话,其由 q,a,index,source 多个变量组成。

引用提示词由引用模板提示词组成,提示词通常是对引用模板的一个描述,加上对模型的要求。

引用模板和提示词设计 示例

通用模板与问答模板对比

我们通过一组你是谁的手动数据,对通用模板与问答模板的效果进行对比。此处特意打了个搞笑的答案,通用模板下 GPT35 就变得不那么听话了,而问答模板下 GPT35 依然能够回答正确。这是由于结构化的提示词,在大语言模型中具有更强的引导作用。

通用模板配置及效果问答模板配置及效果

严格模板

使用非严格模板,我们随便询问一个不在知识库中的内容,模型通常会根据其自身知识进行回答。

非严格模板效果选择严格模板严格模板效果

提示词设计思路

  1. 使用序号进行不同要求描述。
  2. 使用首先、然后、最后等词语进行描述。
  3. 列举不同场景的要求时,尽量完整,不要遗漏。例如:背景知识完全可以回答、背景知识可以回答一部分、背景知识与问题无关,3种场景都说明清楚。
  4. 巧用结构化提示,例如在问答模板中,利用了instructionoutput,清楚的告诉模型,output是一个预期的答案。
  5. 标点符号正确且完整。
+ + + + \ No newline at end of file diff --git a/docs/guide/course/chat_input_guide/index.html b/docs/guide/course/chat_input_guide/index.html new file mode 100644 index 000000000000..954e9d025858 --- /dev/null +++ b/docs/guide/course/chat_input_guide/index.html @@ -0,0 +1,60 @@ +对话问题引导 | FastGPT
+
code

对话问题引导

FastGPT 对话问题引导

什么是自定义问题引导

你可以为你的应用提前预设一些问题,用户在输入时,会根据输入的内容,动态搜索这些问题作为提示,从而引导用户更快的进行提问。

你可以直接在 FastGPT 中配置词库,或者提供自定义词库接口。

自定义词库接口

需要保证这个接口可以被用户浏览器访问。

请求:

+  curl --location --request GET 'http://localhost:3000/api/core/chat/inputGuide/query?appId=663c75302caf8315b1c00194&searchKey=你'
+  

其中 appId 为应用ID,searchKey 为搜索关键字,最多是50个字符。

响应

+  {
+  "code": 200,
+  "statusText": "",
+  "message": "",
+  "data": [
+    "是你",
+    "你是谁呀",
+    "你好好呀",
+    "你好呀",
+    "你是谁!",
+    "你好"
+  ]
+}
+  

data是一个数组,包含了搜索到的问题,最多只需要返回5个问题。

参数说明:

  • appId - 应用ID
  • searchKey - 搜索关键字
+ + + + \ No newline at end of file diff --git a/docs/guide/course/collection_tags/index.html b/docs/guide/course/collection_tags/index.html new file mode 100644 index 000000000000..f7abe63060b1 --- /dev/null +++ b/docs/guide/course/collection_tags/index.html @@ -0,0 +1,55 @@ +知识库集合标签 | FastGPT
+
developer_guide

知识库集合标签

FastGPT 知识库集合标签使用说明

知识库集合标签是 FastGPT 商业版特有功能。它允许你对知识库中的数据集合添加标签进行分类,更高效地管理知识库数据。

而进一步可以在问答中,搜索知识库时添加集合过滤,实现更精确的搜索。

标签基础操作说明

在知识库详情页面,可以对标签进行管理,可执行的操作有

  • 创建标签
  • 修改标签名
  • 删除标签
  • 将一个标签赋给多个数据集合
  • 给一个数据集合添加多个标签

也可以利用标签对数据集合进行筛选

知识库搜索-集合过滤说明

利用标签可以在知识库搜索时,通过填写「集合过滤」这一栏来实现更精确的搜索,具体的填写示例如下

+  {
+  "tags": {
+    "$and": ["标签 1","标签 2"],
+    "$or": ["有 $and 标签时,and 生效,or 不生效"]
+  },
+  "createTime": {
+      "$gte": "YYYY-MM-DD HH:mm 格式即可,集合的创建时间大于该时间",
+      "$lte": "YYYY-MM-DD HH:mm 格式即可,集合的创建时间小于该时间,可和 $gte 共同使用"
+  }
+}
+  

在填写时有两个注意的点,

  • 标签值可以为 string 类型的标签名,也可以为 null,而 null 代表着未设置标签的数据集合
  • 标签过滤有 $and$or 两种条件类型,在同时设置了 $and$or 的情况下,只有 $and 会生效
+ + + + \ No newline at end of file diff --git a/docs/guide/course/fileinput/index.html b/docs/guide/course/fileinput/index.html new file mode 100644 index 000000000000..7fd380d0aa7d --- /dev/null +++ b/docs/guide/course/fileinput/index.html @@ -0,0 +1,66 @@ +文件输入功能介绍 | FastGPT
+
description

文件输入功能介绍

FastGPT 文件输入功能介绍

从 4.8.9 版本起,FastGPT 支持在简易模式工作流中,配置用户上传文件、图片功能。下面先简单介绍下如何使用文件输入功能,最后是介绍下文件解析的工作原理。

简易模式中使用

简易模式打开文件上传后,会使用工具调用模式,也就是由模型自行决策,是否需要读取文件内容。

可以找到左侧文件上传的配置项,点击其右侧的开启/关闭按键,即可打开配置弹窗。

打开文件上传

随后,你的调试对话框中,就会出现一个文件选择的 icon,可以点击文件选择 icon,选择你需要上传的文件。

打开文件上传

工作模式

从 4.8.13 版本起,简易模式的文件读取将会强制解析文件并放入 system 提示词中,避免连续对话时,模型有时候不会主动调用读取文件的工具。

工作流中使用

工作流中,可以在系统配置中,找到文件输入配置项,点击其右侧的开启/关闭按键,即可打开配置弹窗。

打开文件上传

在工作流中,使用文件的方式很多,最简单的就是类似下图中,直接通过工具调用接入文档解析,实现和简易模式一样的效果。

当然,你也可以在工作流中,对文档进行内容提取、内容分析等,然后将分析的结果传递给 HTTP 或者其他模块,从而实现文件处理的 SOP。

文档解析

文档解析工作原理

不同于图片识别,LLM 模型目前没有支持直接解析文档的能力,所有的文档“理解”都是通过文档转文字后拼接 prompt 实现。这里通过几个 FAQ 来解释文档解析的工作原理,理解文档解析的原理,可以更好的在工作流中使用文档解析功能。

上传的文件如何存储在数据库中

FastGPT 的对话记录存储结构中,role=user 的消息,value 值会按以下结构存储:

+  type UserChatItemValueItemType = {
+  type: 'text' | 'file'
+  text?: {
+    content: string;
+  };
+  file?: {
+    type: 'img' | 'doc'
+    name?: string;
+    url: string;
+  };
+};
+  

也就是说,上传的图片和文档,都会以 URL 的形式存储在库中,并不会存储解析后的文档内容

图片如何处理

文档解析节点不会处理图片,图片链接会被过滤,图片识别请直接使用支持图片识别的 LLM 模型。

文档解析节点如何工作

文档解析依赖文档解析节点,这个节点会接收一个array<string>类型的输入,对应的是文件输入的 URL;输出的是一个string,对应的是文档解析后的内容。

  • 在文档解析节点中,只会解析文档类型的 URL,它是通过文件 URL 解析出来的文名件后缀去判断的。如果你同时选择了文档和图片,图片会被忽略。
  • 文档解析节点,只会解析本轮工作流接收的文件,不会解析历史记录的文件。
  • 多个文档内容如何拼接的

按下列的模板,对多个文件进行拼接,即文件名+文件内容的形式组成一个字符串,不同文档之间通过分隔符:\n******\n 进行分割。

+  File: ${filename}
+<Content>
+${content}
+</Content>
+  

AI节点中如何使用文档解析

在 AI 节点(AI对话/工具调用)中,新增了一个文档链接的输入,可以直接引用文档的地址,从而实现文档内容的引用。

它接收一个Array<string>类型的输入,最终这些 url 会被解析,并进行提示词拼接,放置在 role=system 的消息中。提示词模板如下:

+  将 <FilesContent></FilesContent> 中的内容作为本次对话的参考:
+<FilesContent>
+{{quote}}
+</FilesContent>
+  

4.8.13版本起,关于文件上传的更新

由于与 4.8.9 版本有些差异,尽管我们做了向下兼容,避免工作流立即不可用。但是请尽快的按新版本规则进行调整工作流,后续将会去除兼容性代码。

  1. 简易模式中,将会强制进行文件解析,不再由模型决策是否解析,保证每次都能参考文档。
  2. 文档解析:不再解析历史记录中的文件。
  3. 工具调用:支持直接选择文档引用,不需要再挂载文档解析工具。会自动解析历史记录中的文件。
  4. AI 对话:支持直接选择文档引用,不需要进过文档解析节点。会自动解析历史记录中的文件。
  5. 插件单独运行:不再支持全局文件;插件输入支持配置文件类型,可以取代全局文件上传。
  6. 工作流调用插件:不再自动传递工作流上传的文件到插件,需要手动给插件输入指定变量。
  7. 工作流调用工作流:不再自动传递工作流上传的文件到子工作流,可以手动选择需要传递的文件链接。
+ + + + \ No newline at end of file diff --git a/docs/guide/course/index.html b/docs/guide/course/index.html new file mode 100644 index 000000000000..9ff5d07dee9b --- /dev/null +++ b/docs/guide/course/index.html @@ -0,0 +1,44 @@ +基础教程 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/course/index.xml b/docs/guide/course/index.xml new file mode 100644 index 000000000000..5578f8c9f273 --- /dev/null +++ b/docs/guide/course/index.xml @@ -0,0 +1,53 @@ +基础教程 on FastGPThttps://doc.tryfastgpt.ai/docs/guide/course/Recent content in 基础教程 on FastGPTHugo -- gohugo.iozh-cn快速上手https://doc.tryfastgpt.ai/docs/guide/course/quick-start/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/quick-start/更多使用技巧,查看视屏教程 +知识库 link开始前,请准备一份测试电子文档,WORD,PDF,TXT,excel,markdown 都可以,比如公司休假制度,不涉密的销售说辞,产品知识等等。 +这里使用 FastGPT 中文 README 文件为例。 +首先我们需要创建一个知识库。 +知识库创建完之后我们需要上传一点内容。 +上传内容这里有四种模式: +手动输入:手动输入问答对,是最精准的数据 QA 拆分:选择文本文件,让AI自动生成问答对 直接分段:选择文本文件,直接将其按分段进行处理 CSV 导入:批量导入问答对 这里,我们选择 QA 拆分,让 AI 自动生成问答,若问答质量不高,可以后期手动修改。 +点击上传后我们需要等待数据处理完成,等到我们上传的文件状态为可用。 +应用 link点击「应用」按钮来新建一个应用,这里有四个模板,我们选择「知识库 + 对话引导」。 +应用创建后来再应用详情页找到「知识库」模块,把我们刚刚创建的知识库添加进去。 +添加完知识库后记得点击「保存并预览」,这样我们的应用就和知识库关联起来了。 +然后我们就可以愉快的开始聊天啦。AI 相关参数配置说明https://doc.tryfastgpt.ai/docs/guide/course/ai_settings/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/ai_settings/在 FastGPT 的 AI 对话模块中,有一个 AI 高级配置,里面包含了 AI 模型的参数配置,本文详细介绍这些配置的含义。 +流响应(高级编排 AI 对话 特有) link旧版名字叫做:返回 AI 内容;新版改名:流响应。 +这是一个开关,打开的时候,当 AI 对话模块运行时,会将其输出的内容返回到浏览器(API响应); 如果关闭,会强制使用非流模式调用模型,并且 AI 输出的内容不会返回到浏览器,但是生成的内容仍可以通过【AI回复】进行输出。你可以将【AI回复】连接到其他模块中进行二次使用。 +最大上下文 link代表模型最多容纳的文字数量。 +函数调用 link支持函数调用的模型,在使用工具时更加准确。 +温度 link越低回答越严谨,少废话(实测下来,感觉差别不大) +回复上限 link最大回复 token 数量。注意,是回复的Tokens!不是上下文 tokens。 +通常,回复上限=min(模型允许的最大回复上限, 最大上下文-已用上下文) +所以,一般配置模型时,不会把最大上下文配置成模型实际最大上下文,而是预留预定空间给回答,例如 128k 模型,可以配置 max_context=115000 +系统提示词 link被放置在上下文数组的最前面,role 为 system,用于引导模型。 +记忆轮数(仅简易模式) link可以配置模型支持的记忆轮数,如果模型的超出上下文,系统会自动截断,尽可能保证不超模型上下文。 +所以尽管配置 30 轮对话,实际运行时候,不一定会达到 30 轮。 +引用模板 &amp; 引用提示词 link进行知识库搜索后,你可以自定义组织检索结果构成的提示词,这个配置,仅工作流中 AI 对话节点可用。并且,只会在有引用知识库内容时才会生效。 +AI 对话消息组成 link想使用明白这两个变量,首先要了解传递传递给 AI 模型的消息格式。它是一个数组,FastGPT 中这个数组的组成形式为: +[ 内置提示词(config.json 配置,一般为空) 系统提示词 (用户输入的提示词) 历史记录 问题(由引用提示词、引用模板和用户问题组成) ] 🍅对话问题引导https://doc.tryfastgpt.ai/docs/guide/course/chat_input_guide/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/chat_input_guide/ 什么是自定义问题引导 link你可以为你的应用提前预设一些问题,用户在输入时,会根据输入的内容,动态搜索这些问题作为提示,从而引导用户更快的进行提问。 +你可以直接在 FastGPT 中配置词库,或者提供自定义词库接口。 +自定义词库接口 link需要保证这个接口可以被用户浏览器访问。 +请求: +curl --location --request GET &#39;http://localhost:3000/api/core/chat/inputGuide/query?appId=663c75302caf8315b1c00194&amp;searchKey=你&#39; 其中 appId 为应用ID,searchKey 为搜索关键字,最多是50个字符。 +响应 +{ &#34;code&#34;: 200, &#34;statusText&#34;: &#34;&#34;, &#34;message&#34;: &#34;&#34;, &#34;data&#34;: [ &#34;是你&#34;, &#34;你是谁呀&#34;, &#34;你好好呀&#34;, &#34;你好呀&#34;, &#34;你是谁!&#34;, &#34;你好&#34; ] } data是一个数组,包含了搜索到的问题,最多只需要返回5个问题。 +参数说明: +appId - 应用ID searchKey - 搜索关键字知识库集合标签https://doc.tryfastgpt.ai/docs/guide/course/collection_tags/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/collection_tags/知识库集合标签是 FastGPT 商业版特有功能。它允许你对知识库中的数据集合添加标签进行分类,更高效地管理知识库数据。 +而进一步可以在问答中,搜索知识库时添加集合过滤,实现更精确的搜索。 +标签基础操作说明 link在知识库详情页面,可以对标签进行管理,可执行的操作有 +创建标签 修改标签名 删除标签 将一个标签赋给多个数据集合 给一个数据集合添加多个标签 也可以利用标签对数据集合进行筛选 +知识库搜索-集合过滤说明 link利用标签可以在知识库搜索时,通过填写「集合过滤」这一栏来实现更精确的搜索,具体的填写示例如下 +{ &#34;tags&#34;: { &#34;$and&#34;: [&#34;标签 1&#34;,&#34;标签 2&#34;], &#34;$or&#34;: [&#34;有 $and 标签时,and 生效,or 不生效&#34;] }, &#34;createTime&#34;: { &#34;$gte&#34;: &#34;YYYY-MM-DD HH:mm 格式即可,集合的创建时间大于该时间&#34;, &#34;$lte&#34;: &#34;YYYY-MM-DD HH:mm 格式即可,集合的创建时间小于该时间,可和 $gte 共同使用&#34; } } 在填写时有两个注意的点, +标签值可以为 string 类型的标签名,也可以为 null,而 null 代表着未设置标签的数据集合 标签过滤有 $and 和 $or 两种条件类型,在同时设置了 $and 和 $or 的情况下,只有 $and 会生效文件输入功能介绍https://doc.tryfastgpt.ai/docs/guide/course/fileinput/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/fileinput/从 4.8.9 版本起,FastGPT 支持在简易模式和工作流中,配置用户上传文件、图片功能。下面先简单介绍下如何使用文件输入功能,最后是介绍下文件解析的工作原理。 +简易模式中使用 link简易模式打开文件上传后,会使用工具调用模式,也就是由模型自行决策,是否需要读取文件内容。 +可以找到左侧文件上传的配置项,点击其右侧的开启/关闭按键,即可打开配置弹窗。 +随后,你的调试对话框中,就会出现一个文件选择的 icon,可以点击文件选择 icon,选择你需要上传的文件。 +工作模式 +从 4.8.13 版本起,简易模式的文件读取将会强制解析文件并放入 system 提示词中,避免连续对话时,模型有时候不会主动调用读取文件的工具。 +工作流中使用 link工作流中,可以在系统配置中,找到文件输入配置项,点击其右侧的开启/关闭按键,即可打开配置弹窗。 +在工作流中,使用文件的方式很多,最简单的就是类似下图中,直接通过工具调用接入文档解析,实现和简易模式一样的效果。 +当然,你也可以在工作流中,对文档进行内容提取、内容分析等,然后将分析的结果传递给 HTTP 或者其他模块,从而实现文件处理的 SOP。 +文档解析工作原理 link不同于图片识别,LLM 模型目前没有支持直接解析文档的能力,所有的文档“理解”都是通过文档转文字后拼接 prompt 实现。这里通过几个 FAQ 来解释文档解析的工作原理,理解文档解析的原理,可以更好的在工作流中使用文档解析功能。 +上传的文件如何存储在数据库中 linkFastGPT 的对话记录存储结构中,role=user 的消息,value 值会按以下结构存储: +type UserChatItemValueItemType = { type: &#39;text&#39; | &#39;file&#39; text?: { content: string; }; file?: { type: &#39;img&#39; | &#39;doc&#39; name?: string; url: string; }; }; 也就是说,上传的图片和文档,都会以 URL 的形式存储在库中,并不会存储解析后的文档内容。 +图片如何处理 link文档解析节点不会处理图片,图片链接会被过滤,图片识别请直接使用支持图片识别的 LLM 模型。 +文档解析节点如何工作 link文档解析依赖文档解析节点,这个节点会接收一个array&lt;string&gt;类型的输入,对应的是文件输入的 URL;输出的是一个string,对应的是文档解析后的内容。 \ No newline at end of file diff --git a/docs/guide/course/quick-start/index.html b/docs/guide/course/quick-start/index.html new file mode 100644 index 000000000000..b5c46c2468c3 --- /dev/null +++ b/docs/guide/course/quick-start/index.html @@ -0,0 +1,44 @@ +快速上手 | FastGPT
+
快速上手
rocket_launch

快速上手

快速体验 FastGPT 基础功能

更多使用技巧,查看视屏教程

知识库

开始前,请准备一份测试电子文档,WORD,PDF,TXT,excel,markdown 都可以,比如公司休假制度,不涉密的销售说辞,产品知识等等。

这里使用 FastGPT 中文 README 文件为例。

首先我们需要创建一个知识库。

知识库创建完之后我们需要上传一点内容。

上传内容这里有四种模式:

  • 手动输入:手动输入问答对,是最精准的数据
  • QA 拆分:选择文本文件,让AI自动生成问答对
  • 直接分段:选择文本文件,直接将其按分段进行处理
  • CSV 导入:批量导入问答对

这里,我们选择 QA 拆分,让 AI 自动生成问答,若问答质量不高,可以后期手动修改。

点击上传后我们需要等待数据处理完成,等到我们上传的文件状态为可用。

应用

点击「应用」按钮来新建一个应用,这里有四个模板,我们选择「知识库 + 对话引导」。

应用创建后来再应用详情页找到「知识库」模块,把我们刚刚创建的知识库添加进去。

添加完知识库后记得点击「保存并预览」,这样我们的应用就和知识库关联起来了。

然后我们就可以愉快的开始聊天啦。

+ + + + \ No newline at end of file diff --git a/docs/guide/dialogboxes/htmlrendering/index.html b/docs/guide/dialogboxes/htmlrendering/index.html new file mode 100644 index 000000000000..28ee7770a9eb --- /dev/null +++ b/docs/guide/dialogboxes/htmlrendering/index.html @@ -0,0 +1,65 @@ +对话框与HTML渲染 | FastGPT
+
group

对话框与HTML渲染

如何在FastGPT中通过Markdown嵌入HTML代码块,并提供全屏、源代码切换等交互功能

源码模式预览模式全屏模式

1. 设计背景

尽管Markdown本身支持嵌入HTML标签,但由于安全问题,许多平台和环境对HTML的渲染进行了限制,特别是在渲染动态内容、交互式元素以及外部资源时。这些限制大大降低了用户在撰写和展示复杂文档时的灵活性,尤其是当需要嵌入外部HTML内容时。为了应对这一问题,我们通过使用 iframe 来嵌入和渲染HTML内容,并结合 sandbox 属性,保障了外部HTML的安全渲染。

2. 功能简介

该功能模块的主要目的是扩展FastGPT在Markdown渲染中的能力,支持嵌入和渲染HTML内容。由于是利用 Iframe 渲染,所以无法确认内容的高度,FastGPT 中会给 Iframe 设置一个固定高度来进行渲染。并且不支持 HTML 中执行 js 脚本。

3. 技术实现

本模块通过以下方式实现了HTML渲染和互动功能:

  • 组件设计:该模块通过渲染 iframe 类型的代码块展示HTML内容。使用自定义的 IframeBlock 组件,结合 sandbox 属性来保障嵌入内容的安全性。sandbox 限制了外部HTML中的行为,如禁用脚本执行、限制表单提交等,确保HTML内容的安全性。通过辅助函数与渲染Markdown内容的部分结合,处理 iframe 嵌入的HTML内容。
  • 安全机制:通过 iframesandbox 属性和 referrerPolicy 来防止潜在的安全风险。sandbox 属性提供了细粒度的控制,允许特定的功能(如脚本、表单、弹出窗口等)在受限的环境中执行,以确保渲染的HTML内容不会对系统造成威胁。
  • 展示与互动功能:用户可以通过不同的展示模式(如全屏、预览、源代码模式)自由切换,以便更灵活地查看和控制嵌入的HTML内容。嵌入的 iframe 自适应父容器的宽度,同时保证 iframe嵌入的内容能够适当显示。

4. 如何使用

你只需要通过 Markdown 代码块格式,并标记语言为 html 即可。例如:

+  ```html
+<!DOCTYPE html>
+<html lang="zh-CN">
+  <head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <title>欢迎使用FastGPT</title>
+  </head>
+  <body>
+    <nav>
+      <ul>
+        <li><a href="#home">首页</a></li>
+        <li><a href="#about">关于我们</a></li>
+        <li><a href="#contact">联系我们</a></li>
+        <li><a href="#gallery">图库</a></li>
+      </ul>
+    </nav>
+  </body>
+</html>
+  
+ + + + \ No newline at end of file diff --git a/docs/guide/dialogboxes/index.html b/docs/guide/dialogboxes/index.html new file mode 100644 index 000000000000..0472380a81e9 --- /dev/null +++ b/docs/guide/dialogboxes/index.html @@ -0,0 +1,44 @@ +对话框 | FastGPT
+
对话框
chat_bubble

对话框

对话框组件,支持多种交互方式,提升用户在应用中的交互体验。


+ + + + \ No newline at end of file diff --git a/docs/guide/dialogboxes/index.xml b/docs/guide/dialogboxes/index.xml new file mode 100644 index 000000000000..e77af4d2ba63 --- /dev/null +++ b/docs/guide/dialogboxes/index.xml @@ -0,0 +1,5 @@ +对话框 on FastGPThttps://doc.tryfastgpt.ai/docs/guide/dialogboxes/Recent content in 对话框 on FastGPTHugo -- gohugo.iozh-cn对话框与HTML渲染https://doc.tryfastgpt.ai/docs/guide/dialogboxes/htmlrendering/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/dialogboxes/htmlrendering/ 源码模式 预览模式 全屏模式 1. 设计背景 link尽管Markdown本身支持嵌入HTML标签,但由于安全问题,许多平台和环境对HTML的渲染进行了限制,特别是在渲染动态内容、交互式元素以及外部资源时。这些限制大大降低了用户在撰写和展示复杂文档时的灵活性,尤其是当需要嵌入外部HTML内容时。为了应对这一问题,我们通过使用 iframe 来嵌入和渲染HTML内容,并结合 sandbox 属性,保障了外部HTML的安全渲染。 +2. 功能简介 link该功能模块的主要目的是扩展FastGPT在Markdown渲染中的能力,支持嵌入和渲染HTML内容。由于是利用 Iframe 渲染,所以无法确认内容的高度,FastGPT 中会给 Iframe 设置一个固定高度来进行渲染。并且不支持 HTML 中执行 js 脚本。 +3. 技术实现 link本模块通过以下方式实现了HTML渲染和互动功能: +组件设计:该模块通过渲染 iframe 类型的代码块展示HTML内容。使用自定义的 IframeBlock 组件,结合 sandbox 属性来保障嵌入内容的安全性。sandbox 限制了外部HTML中的行为,如禁用脚本执行、限制表单提交等,确保HTML内容的安全性。通过辅助函数与渲染Markdown内容的部分结合,处理 iframe 嵌入的HTML内容。 安全机制:通过 iframe 的 sandbox 属性和 referrerPolicy 来防止潜在的安全风险。sandbox 属性提供了细粒度的控制,允许特定的功能(如脚本、表单、弹出窗口等)在受限的环境中执行,以确保渲染的HTML内容不会对系统造成威胁。 展示与互动功能:用户可以通过不同的展示模式(如全屏、预览、源代码模式)自由切换,以便更灵活地查看和控制嵌入的HTML内容。嵌入的 iframe 自适应父容器的宽度,同时保证 iframe嵌入的内容能够适当显示。 4. 如何使用 link你只需要通过 Markdown 代码块格式,并标记语言为 html 即可。例如: +```html &lt;!DOCTYPE html&gt; &lt;html lang=&#34;zh-CN&#34;&gt; &lt;head&gt; &lt;meta charset=&#34;UTF-8&#34;&gt; &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt; &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&gt; &lt;title&gt;欢迎使用FastGPT&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;nav&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;#home&#34;&gt;首页&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#about&#34;&gt;关于我们&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#contact&#34;&gt;联系我们&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#gallery&#34;&gt;图库&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/nav&gt; &lt;/body&gt; &lt;/html&gt; \ No newline at end of file diff --git a/docs/guide/index.html b/docs/guide/index.html new file mode 100644 index 000000000000..f8539e8e8cad --- /dev/null +++ b/docs/guide/index.html @@ -0,0 +1,51 @@ +功能介绍 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/index.xml b/docs/guide/index.xml new file mode 100644 index 000000000000..2035b00240f8 --- /dev/null +++ b/docs/guide/index.xml @@ -0,0 +1 @@ +功能介绍 on FastGPThttps://doc.tryfastgpt.ai/docs/guide/Recent content in 功能介绍 on FastGPTHugo -- gohugo.iozh-cn \ No newline at end of file diff --git a/docs/guide/knowledge_base/api_dataset/index.html b/docs/guide/knowledge_base/api_dataset/index.html new file mode 100644 index 000000000000..2038756660ea --- /dev/null +++ b/docs/guide/knowledge_base/api_dataset/index.html @@ -0,0 +1,113 @@ +API 文件库 | FastGPT
+
language

API 文件库

FastGPT API 文件库功能介绍和使用方式

背景

目前 FastGPT 支持本地文件导入,但是很多时候,用户自身已经有了一套文档库,如果把文件重复导入一遍,会造成二次存储,并且不方便管理。因为 FastGPT 提供了一个 API 文件库的概念,可以通过简单的 API 接口,去拉取已有的文档库,并且可以灵活配置是否导入。

API 文件库能够让用户轻松对接已有的文档库,只需要按照 FastGPT 的 API 文件库规范,提供相应文件接口,然后将服务接口的 baseURL 和 token 填入知识库创建参数中,就能直接在页面上拿到文件库的内容,并选择性导入

如何使用 API 文件库

创建知识库时,选择 API 文件库类型,然后需要配置两个关键参数:文件服务接口的 baseURL 和用于身份验证的请求头信息。只要提供的接口规范符合 FastGPT 的要求,系统就能自动获取并展示完整的文件列表,可以根据需要选择性地将文件导入到知识库中。

你需要提供两个参数:

  • baseURL: 文件服务接口的 baseURL
  • authorization: 用于身份验证的请求头信息,实际请求格式为 Authorization: Bearer <token>

接口规范

接口响应格式:

+  type ResponseType = {
+  success: boolean;
+  message: string;
+  data: any;
+}
+  

数据类型:

+  // 文件列表中,单项的文件类型
+type FileListItem = {
+  id: string;
+  parentId: string | null;
+  name: string;
+  type: 'file' | 'folder';
+  updateTime: Date;
+  createTime: Date;
+}
+  

1. 获取文件树

2. 获取单个文件内容(文本内容或访问链接)

3. 获取文件阅读链接(用于查看原文)

+ + + + \ No newline at end of file diff --git a/docs/guide/knowledge_base/dataset_engine/index.html b/docs/guide/knowledge_base/dataset_engine/index.html new file mode 100644 index 000000000000..0434e201bafc --- /dev/null +++ b/docs/guide/knowledge_base/dataset_engine/index.html @@ -0,0 +1,44 @@ +知识库搜索方案和参数 | FastGPT
+
language

知识库搜索方案和参数

本节会详细介绍 FastGPT 知识库结构设计,理解其 QA 的存储格式和多向量映射,以便更好的构建知识库。同时会介绍每个搜索参数的功能。这篇介绍主要以使用为主,详细原理不多介绍。

理解向量

FastGPT 采用了 RAG 中的 Embedding 方案构建知识库,要使用好 FastGPT 需要简单的理解Embedding向量是如何工作的及其特点。

人类的文字、图片、视频等媒介是无法直接被计算机理解的,要想让计算机理解两段文字是否有相似性、相关性,通常需要将它们转成计算机可以理解的语言,向量是其中的一种方式。

向量可以简单理解为一个数字数组,两个向量之间可以通过数学公式得出一个距离,距离越小代表两个向量的相似度越大。从而映射到文字、图片、视频等媒介上,可以用来判断两个媒介之间的相似度。向量搜索便是利用了这个原理。

而由于文字是有多种类型,并且拥有成千上万种组合方式,因此在转成向量进行相似度匹配时,很难保障其精确性。在向量方案构建的知识库中,通常使用topk召回的方式,也就是查找前k个最相似的内容,丢给大模型去做更进一步的语义判断逻辑推理归纳总结,从而实现知识库问答。因此,在知识库问答中,向量搜索的环节是最为重要的。

影响向量搜索精度的因素非常多,主要包括:向量模型的质量、数据的质量(长度,完整性,多样性)、检索器的精度(速度与精度之间的取舍)。与数据质量对应的就是检索词的质量。

检索器的精度比较容易解决,向量模型的训练略复杂,因此数据和检索词质量优化成了一个重要的环节。

提高向量搜索精度的方法

  1. 更好分词分段:当一段话的结构和语义是完整的,并且是单一的,精度也会提高。因此,许多系统都会优化分词器,尽可能的保障每组数据的完整性。
  2. 精简index的内容,减少向量内容的长度:当index的内容更少,更准确时,检索精度自然会提高。但与此同时,会牺牲一定的检索范围,适合答案较为严格的场景。
  3. 丰富index的数量,可以为同一个chunk内容增加多组index
  4. 优化检索词:在实际使用过程中,用户的问题通常是模糊的或是缺失的,并不一定是完整清晰的问题。因此优化用户的问题(检索词)很大程度上也可以提高精度。
  5. 微调向量模型:由于市面上直接使用的向量模型都是通用型模型,在特定领域的检索精度并不高,因此微调向量模型可以很大程度上提高专业领域的检索效果。

FastGPT 构建知识库方案

数据存储结构

在 FastGPT 中,整个知识库由库、集合和数据 3 部分组成。集合可以简单理解为一个文件。一个中可以包含多个集合,一个集合中可以包含多组数据。最小的搜索单位是,也就是说,知识库搜索时,是对整个进行搜索,而集合仅是为了对数据进行分类管理,与搜索效果无关。(起码目前还是)

向量存储结构

FastGPT 采用了PostgresSQLPG Vector插件作为向量检索器,索引为HNSW。且PostgresSQL仅用于向量检索(该引擎可以替换成其它数据库),MongoDB用于其他数据的存取。

MongoDBdataset.datas表中,会存储向量原数据的信息,同时有一个indexes字段,会记录其对应的向量ID,这是一个数组,也就是说,一组数据可以对应多个向量。

PostgresSQL的表中,设置一个vector字段用于存储向量。在检索时,会先召回向量,再根据向量的ID,去MongoDB中寻找原数据内容,如果对应了同一组原数据,则进行合并,向量得分取最高得分。

多向量的目的和使用方式

在一组向量中,内容的长度和语义的丰富度通常是矛盾的,无法兼得。因此,FastGPT 采用了多向量映射的方式,将一组数据映射到多组向量中,从而保障数据的完整性和语义的丰富度。

你可以为一组较长的文本,添加多组向量,从而在检索时,只要其中一组向量被检索到,该数据也将被召回。

意味着,你可以通过标注数据块的方式,不断提高数据块的精度。

检索方案

  1. 通过问题优化实现指代消除和问题扩展,从而增加连续对话的检索能力以及语义丰富度。
  2. 通过Concat query来增加Rerank连续对话的时,排序的准确性。
  3. 通过RRF合并方式,综合多个渠道的检索效果。
  4. 通过Rerank来二次排序,提高精度。

搜索参数

搜索模式

语义检索

语义检索是通过向量距离,计算用户问题与知识库内容的距离,从而得出“相似度”,当然这并不是语文上的相似度,而是数学上的。

优点:

  • 相近语义理解
  • 跨多语言理解(例如输入中文问题匹配英文知识点)
  • 多模态理解(文本,图片,音视频等)

缺点:

  • 依赖模型训练效果
  • 精度不稳定
  • 受关键词和句子完整度影响

全文检索

采用传统的全文检索方式。适合查找关键的主谓语等。

混合检索

同时使用向量检索和全文检索,并通过 RRF 公式进行两个搜索结果合并,一般情况下搜索结果会更加丰富准确。

由于混合检索后的查找范围很大,并且无法直接进行相似度过滤,通常需要进行利用重排模型进行一次结果重新排序,并利用重排的得分进行过滤。

结果重排

利用ReRank模型对搜索结果进行重排,绝大多数情况下,可以有效提高搜索结果的准确率。不过,重排模型与问题的完整度(主谓语齐全)有一些关系,通常会先走问题优化后再进行搜索-重排。重排后可以得到一个0-1的得分,代表着搜索内容与问题的相关度,该分数通常比向量的得分更加精确,可以根据得分进行过滤。

FastGPT 会使用 RRF 对重排结果、向量搜索结果、全文检索结果进行合并,得到最终的搜索结果。

搜索过滤

引用上限

每次搜索最多引用ntokens的内容。

之所以不采用top k,是发现在混合知识库(问答库、文档库)时,不同chunk的长度差距很大,会导致top k的结果不稳定,因此采用了tokens的方式进行引用上限的控制。

最低相关度

一个0-1的数值,会过滤掉一些低相关度的搜索结果。

该值仅在语义检索或使用结果重排时生效。

问题优化

背景

在 RAG 中,我们需要根据输入的问题去数据库里执行 embedding 搜索,查找相关的内容,从而查找到相似的内容(简称知识库搜索)。

在搜索的过程中,尤其是连续对话的搜索,我们通常会发现后续的问题难以搜索到合适的内容,其中一个原因是知识库搜索只会使用“当前”的问题去执行。看下面的例子:

用户在提问“第二点是什么”的时候,只会去知识库里查找“第二点是什么”,压根查不到内容。实际上需要查询的是“QA结构是什么”。因此我们需要引入一个【问题优化】模块,来对用户当前的问题进行补全,从而使得知识库搜索能够搜索到合适的内容。使用补全后效果如下:

实现方式

在进行数据检索前,会先让模型进行指代消除问题扩展,一方面可以可以解决指代对象不明确问题,同时可以扩展问题的语义丰富度。你可以通过每次对话后的对话详情,查看补全的结果。

+ + + + \ No newline at end of file diff --git a/docs/guide/knowledge_base/externalfile/index.html b/docs/guide/knowledge_base/externalfile/index.html new file mode 100644 index 000000000000..3f8d9f557d1c --- /dev/null +++ b/docs/guide/knowledge_base/externalfile/index.html @@ -0,0 +1,44 @@ +外部文件知识库 | FastGPT
+
language

外部文件知识库

FastGPT 外部文件知识库功能介绍和使用方式

外部文件库是 FastGPT 商业版特有功能。它允许接入你现在的文件系统,无需将文件再导入一份到 FastGPT 中。

并且,阅读权限可以通过你的文件系统进行控制。

导入参数说明

  • 外部预览地址:用于跳转你的文件阅读地址,会携带“文件阅读ID”进行访问。
  • 文件访问URL:文件可访问的地址。
  • 文件阅读ID:通常情况下,文件访问URL是临时的。如果希望永久可以访问,你需要使用该文件阅读ID,并配合上“外部预览地址”,跳转至新的阅读地址进行原文件访问。
  • 文件名:默认会自动解析文件访问URL上的文件名。如果你手动填写,将会以手动填写的值为准。

点击查看API导入文档

API 文件库替代方案

4.8.15 提供了新的知识库类型 - API 文件库,对外部文件知识库做了进一步的拓展

通过对接口进行简单的调整,就能使用 API 文件库代替外部文件知识库的功能

你可以直接将外部文件知识库中的外部预览地址,作为 API 文件库接口规范中获取文件阅读链接的接口返回

然后再以相同的 baseURL 实现获取文件列表和获取单个文件内容这两个接口

这样就能轻松地使用 API 文件库替代原有的外部文件知识库,更多详细的内容见 API 文件库的文档

+ + + + \ No newline at end of file diff --git a/docs/guide/knowledge_base/index.html b/docs/guide/knowledge_base/index.html new file mode 100644 index 000000000000..c2c54a7f16a4 --- /dev/null +++ b/docs/guide/knowledge_base/index.html @@ -0,0 +1,44 @@ +知识库 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/knowledge_base/index.xml b/docs/guide/knowledge_base/index.xml new file mode 100644 index 000000000000..1a9dc00e3a9d --- /dev/null +++ b/docs/guide/knowledge_base/index.xml @@ -0,0 +1,74 @@ +知识库 on FastGPThttps://doc.tryfastgpt.ai/docs/guide/knowledge_base/Recent content in 知识库 on FastGPTHugo -- gohugo.iozh-cn知识库基础原理介绍https://doc.tryfastgpt.ai/docs/guide/knowledge_base/rag/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/rag/RAG文档 +1. 引言 link随着自然语言处理(NLP)技术的迅猛发展,生成式语言模型(如GPT、BART等)在多种文本生成任务中表现卓越,尤其在语言生成和上下文理解方面。然而,纯生成模型在处理事实类任务时存在一些固有的局限性。例如,由于这些模型依赖于固定的预训练数据,它们在回答需要最新或实时信息的问题时,可能会出现“编造”信息的现象,导致生成结果不准确或缺乏事实依据。此外,生成模型在面对长尾问题和复杂推理任务时,常因缺乏特定领域的外部知识支持而表现不佳,难以提供足够的深度和准确性。 +与此同时,检索模型(Retriever)能够通过在海量文档中快速找到相关信息,解决事实查询的问题。然而,传统检索模型(如BM25)在面对模糊查询或跨域问题时,往往只能返回孤立的结果,无法生成连贯的自然语言回答。由于缺乏上下文推理能力,检索模型生成的答案通常不够连贯和完整。 +为了解决这两类模型的不足,检索增强生成模型(Retrieval-Augmented Generation,RAG)应运而生。RAG通过结合生成模型和检索模型的优势,实时从外部知识库中获取相关信息,并将其融入生成任务中,确保生成的文本既具备上下文连贯性,又包含准确的知识。这种混合架构在智能问答、信息检索与推理、以及领域特定的内容生成等场景中表现尤为出色。 +1.1 RAG的定义 linkRAG是一种将信息检索与生成模型相结合的混合架构。首先,检索器从外部知识库或文档集中获取与用户查询相关的内容片段;然后,生成器基于这些检索到的内容生成自然语言输出,确保生成的内容既信息丰富,又具备高度的相关性和准确性。 +2. RAG模型的核心机制 linkRAG 模型由两个主要模块构成:检索器(Retriever)与生成器(Generator)。这两个模块相互配合,确保生成的文本既包含外部的相关知识,又具备自然流畅的语言表达。 +2.1 检索器(Retriever) link检索器的主要任务是从一个外部知识库或文档集中获取与输入查询最相关的内容。在RAG中,常用的技术包括: +向量检索:如BERT向量等,它通过将文档和查询转化为向量空间中的表示,并使用相似度计算来进行匹配。向量检索的优势在于能够更好地捕捉语义相似性,而不仅仅是依赖于词汇匹配。 传统检索算法:如BM25,主要基于词频和逆文档频率(TF-IDF)的加权搜索模型来对文档进行排序和检索。BM25适用于处理较为简单的匹配任务,尤其是当查询和文档中的关键词有直接匹配时。 RAG中检索器的作用是为生成器提供一个上下文背景,使生成器能够基于这些检索到的文档片段生成更为相关的答案。 +2.2 生成器(Generator) link生成器负责生成最终的自然语言输出。在RAG系统中,常用的生成器包括: +BART:BART是一种序列到序列的生成模型,专注于文本生成任务,可以通过不同层次的噪声处理来提升生成的质量 。 GPT系列:GPT是一个典型的预训练语言模型,擅长生成流畅自然的文本。它通过大规模数据训练,能够生成相对准确的回答,尤其在任务-生成任务中表现尤为突出 。 生成器在接收来自检索器的文档片段后,会利用这些片段作为上下文,并结合输入的查询,生成相关且自然的文本回答。这确保了模型的生成结果不仅仅基于已有的知识,还能够结合外部最新的信息。 +2.3 RAG的工作流程 linkRAG模型的工作流程可以总结为以下几个步骤: +输入查询:用户输入问题,系统将其转化为向量表示。 文档检索:检索器从知识库中提取与查询最相关的文档片段,通常使用向量检索技术或BM25等传统技术进行。 生成答案:生成器接收检索器提供的片段,并基于这些片段生成自然语言答案。生成器不仅基于原始的用户查询,还会利用检索到的片段提供更加丰富、上下文相关的答案。 输出结果:生成的答案反馈给用户,这个过程确保了用户能够获得基于最新和相关信息的准确回答。 3. RAG模型的工作原理 link3.1 检索阶段 link在RAG模型中,用户的查询首先被转化为向量表示,然后在知识库中执行向量检索。通常,检索器采用诸如BERT等预训练模型生成查询和文档片段的向量表示,并通过相似度计算(如余弦相似度)匹配最相关的文档片段。RAG的检索器不仅仅依赖简单的关键词匹配,而是采用语义级别的向量表示,从而在面对复杂问题或模糊查询时,能够更加准确地找到相关知识。这一步骤对于最终生成的回答至关重要,因为检索的效率和质量直接决定了生成器可利用的上下文信息 。 +3.2 生成阶段 link生成阶段是RAG模型的核心部分,生成器负责基于检索到的内容生成连贯且自然的文本回答。RAG中的生成器,如BART或GPT等模型,结合用户输入的查询和检索到的文档片段,生成更加精准且丰富的答案。与传统生成模型相比,RAG的生成器不仅能够生成语言流畅的回答,还可以根据外部知识库中的实际信息提供更具事实依据的内容,从而提高了生成的准确性 。 +3.3 多轮交互与反馈机制 linkRAG模型在对话系统中能够有效支持多轮交互。每一轮的查询和生成结果会作为下一轮的输入,系统通过分析和学习用户的反馈,逐步优化后续查询的上下文。通过这种循环反馈机制,RAG能够更好地调整其检索和生成策略,使得在多轮对话中生成的答案越来越符合用户的期望。此外,多轮交互还增强了RAG在复杂对话场景中的适应性,使其能够处理跨多轮的知识整合和复杂推理 。 +4. RAG的优势与局限 link4.1 优势 link 信息完整性:RAG 模型结合了检索与生成技术,使得生成的文本不仅语言自然流畅,还能够准确利用外部知识库提供的实时信息。这种方法能够显著提升生成任务的准确性,特别是在知识密集型场景下,如医疗问答或法律意见生成。通过从知识库中检索相关文档,RAG 模型避免了生成模型“编造”信息的风险,确保输出更具真实性 。 知识推理能力:RAG 能够利用大规模的外部知识库进行高效检索,并结合这些真实数据进行推理,生成基于事实的答案。相比传统生成模型,RAG 能处理更为复杂的任务,特别是涉及跨领域或跨文档的推理任务。例如,法律领域的复杂判例推理或金融领域的分析报告生成都可以通过RAG的推理能力得到优化 。 领域适应性强:RAG 具有良好的跨领域适应性,能够根据不同领域的知识库进行特定领域内的高效检索和生成。例如,在医疗、法律、金融等需要实时更新和高度准确性的领域,RAG 模型的表现优于仅依赖预训练的生成模型 。 4.2 局限 linkRAG(检索增强生成)模型通过结合检索器和生成器,实现了在多种任务中知识密集型内容生成的突破性进展。然而,尽管其具有较强的应用潜力和跨领域适应能力,但在实际应用中仍然面临着一些关键局限,限制了其在大规模系统中的部署和优化。以下是RAG模型的几个主要局限性: +4.2.1 检索器的依赖性与质量问题 linkRAG模型的性能很大程度上取决于检索器返回的文档质量。由于生成器主要依赖检索器提供的上下文信息,如果检索到的文档片段不相关、不准确,生成的文本可能出现偏差,甚至产生误导性的结果。尤其在多模糊查询或跨领域检索的情况下,检索器可能无法找到合适的片段,这将直接影响生成内容的连贯性和准确性。知识库搜索方案和参数https://doc.tryfastgpt.ai/docs/guide/knowledge_base/dataset_engine/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/dataset_engine/理解向量 linkFastGPT 采用了 RAG 中的 Embedding 方案构建知识库,要使用好 FastGPT 需要简单的理解Embedding向量是如何工作的及其特点。 +人类的文字、图片、视频等媒介是无法直接被计算机理解的,要想让计算机理解两段文字是否有相似性、相关性,通常需要将它们转成计算机可以理解的语言,向量是其中的一种方式。 +向量可以简单理解为一个数字数组,两个向量之间可以通过数学公式得出一个距离,距离越小代表两个向量的相似度越大。从而映射到文字、图片、视频等媒介上,可以用来判断两个媒介之间的相似度。向量搜索便是利用了这个原理。 +而由于文字是有多种类型,并且拥有成千上万种组合方式,因此在转成向量进行相似度匹配时,很难保障其精确性。在向量方案构建的知识库中,通常使用topk召回的方式,也就是查找前k个最相似的内容,丢给大模型去做更进一步的语义判断、逻辑推理和归纳总结,从而实现知识库问答。因此,在知识库问答中,向量搜索的环节是最为重要的。 +影响向量搜索精度的因素非常多,主要包括:向量模型的质量、数据的质量(长度,完整性,多样性)、检索器的精度(速度与精度之间的取舍)。与数据质量对应的就是检索词的质量。 +检索器的精度比较容易解决,向量模型的训练略复杂,因此数据和检索词质量优化成了一个重要的环节。 +提高向量搜索精度的方法 link 更好分词分段:当一段话的结构和语义是完整的,并且是单一的,精度也会提高。因此,许多系统都会优化分词器,尽可能的保障每组数据的完整性。 精简index的内容,减少向量内容的长度:当index的内容更少,更准确时,检索精度自然会提高。但与此同时,会牺牲一定的检索范围,适合答案较为严格的场景。 丰富index的数量,可以为同一个chunk内容增加多组index。 优化检索词:在实际使用过程中,用户的问题通常是模糊的或是缺失的,并不一定是完整清晰的问题。因此优化用户的问题(检索词)很大程度上也可以提高精度。 微调向量模型:由于市面上直接使用的向量模型都是通用型模型,在特定领域的检索精度并不高,因此微调向量模型可以很大程度上提高专业领域的检索效果。 FastGPT 构建知识库方案 link数据存储结构 link在 FastGPT 中,整个知识库由库、集合和数据 3 部分组成。集合可以简单理解为一个文件。一个库中可以包含多个集合,一个集合中可以包含多组数据。最小的搜索单位是库,也就是说,知识库搜索时,是对整个库进行搜索,而集合仅是为了对数据进行分类管理,与搜索效果无关。(起码目前还是) +向量存储结构 linkFastGPT 采用了PostgresSQL的PG Vector插件作为向量检索器,索引为HNSW。且PostgresSQL仅用于向量检索(该引擎可以替换成其它数据库),MongoDB用于其他数据的存取。 +在MongoDB的dataset.datas表中,会存储向量原数据的信息,同时有一个indexes字段,会记录其对应的向量ID,这是一个数组,也就是说,一组数据可以对应多个向量。 +在PostgresSQL的表中,设置一个vector字段用于存储向量。在检索时,会先召回向量,再根据向量的ID,去MongoDB中寻找原数据内容,如果对应了同一组原数据,则进行合并,向量得分取最高得分。 +多向量的目的和使用方式 link在一组向量中,内容的长度和语义的丰富度通常是矛盾的,无法兼得。因此,FastGPT 采用了多向量映射的方式,将一组数据映射到多组向量中,从而保障数据的完整性和语义的丰富度。 +你可以为一组较长的文本,添加多组向量,从而在检索时,只要其中一组向量被检索到,该数据也将被召回。 +意味着,你可以通过标注数据块的方式,不断提高数据块的精度。 +检索方案 link 通过问题优化实现指代消除和问题扩展,从而增加连续对话的检索能力以及语义丰富度。 通过Concat query来增加Rerank连续对话的时,排序的准确性。 通过RRF合并方式,综合多个渠道的检索效果。 通过Rerank来二次排序,提高精度。 搜索参数 link 搜索模式 link语义检索 link语义检索是通过向量距离,计算用户问题与知识库内容的距离,从而得出“相似度”,当然这并不是语文上的相似度,而是数学上的。 +优点: +相近语义理解 跨多语言理解(例如输入中文问题匹配英文知识点) 多模态理解(文本,图片,音视频等) 缺点: +依赖模型训练效果 精度不稳定 受关键词和句子完整度影响 全文检索 link采用传统的全文检索方式。适合查找关键的主谓语等。 +混合检索 link同时使用向量检索和全文检索,并通过 RRF 公式进行两个搜索结果合并,一般情况下搜索结果会更加丰富准确。 +由于混合检索后的查找范围很大,并且无法直接进行相似度过滤,通常需要进行利用重排模型进行一次结果重新排序,并利用重排的得分进行过滤。 +结果重排 link利用ReRank模型对搜索结果进行重排,绝大多数情况下,可以有效提高搜索结果的准确率。不过,重排模型与问题的完整度(主谓语齐全)有一些关系,通常会先走问题优化后再进行搜索-重排。重排后可以得到一个0-1的得分,代表着搜索内容与问题的相关度,该分数通常比向量的得分更加精确,可以根据得分进行过滤。 +FastGPT 会使用 RRF 对重排结果、向量搜索结果、全文检索结果进行合并,得到最终的搜索结果。API 文件库https://doc.tryfastgpt.ai/docs/guide/knowledge_base/api_dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/api_dataset/背景 link目前 FastGPT 支持本地文件导入,但是很多时候,用户自身已经有了一套文档库,如果把文件重复导入一遍,会造成二次存储,并且不方便管理。因为 FastGPT 提供了一个 API 文件库的概念,可以通过简单的 API 接口,去拉取已有的文档库,并且可以灵活配置是否导入。 +API 文件库能够让用户轻松对接已有的文档库,只需要按照 FastGPT 的 API 文件库规范,提供相应文件接口,然后将服务接口的 baseURL 和 token 填入知识库创建参数中,就能直接在页面上拿到文件库的内容,并选择性导入 +如何使用 API 文件库 link创建知识库时,选择 API 文件库类型,然后需要配置两个关键参数:文件服务接口的 baseURL 和用于身份验证的请求头信息。只要提供的接口规范符合 FastGPT 的要求,系统就能自动获取并展示完整的文件列表,可以根据需要选择性地将文件导入到知识库中。 +你需要提供两个参数: +baseURL: 文件服务接口的 baseURL authorization: 用于身份验证的请求头信息,实际请求格式为 Authorization: Bearer &lt;token&gt; 接口规范 link接口响应格式: +type ResponseType = { success: boolean; message: string; data: any; } 数据类型: +// 文件列表中,单项的文件类型 type FileListItem = { id: string; parentId: string | null; name: string; type: &#39;file&#39; | &#39;folder&#39;; updateTime: Date; createTime: Date; } 1.飞书知识库https://doc.tryfastgpt.ai/docs/guide/knowledge_base/lark_dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/lark_dataset/FastGPT v4.8.16 版本开始,商业版用户支持飞书知识库导入,用户可以通过配置飞书应用的 appId 和 appSecret,并选中一个文档空间的顶层文件夹来导入飞书知识库。目前处于测试阶段,部分交互有待优化。 +由于飞书限制,无法直接获取所有文档内容,目前仅可以获取共享空间下文件目录的内容,无法获取个人空间和知识库里的内容。 +1. 创建飞书应用 link打开 飞书开放平台,点击创建应用,选择自建应用,然后填写应用名称。 +2. 配置应用权限 link创建应用后,进入应用可以配置相关权限,这里需要增加两个权限: +获取云空间文件夹下的云文档清单 查看新版文档 3. 获取 appId 和 appSecret link 4. 给 Folder 增加权限 link可参考飞书教程: https://open.feishu.cn/document/server-docs/docs/drive-v1/faq#b02e5bfb +大致总结为: +把刚刚创建的应用拉入一个群里 给这个群增加目录权限 如果你的目录已经给全员组增加权限了,则可以跳过上面步骤,直接获取 Folder Token。 +5. 获取 Folder Token link可以页面路径上获取 Folder Token,注意不要把问号复制进来。 +6. 创建知识库 link根据 3 和 5 获取到的 3 个参数,创建知识库,选择飞书文件库类型,然后填入对应的参数,点击创建。语雀文件库https://doc.tryfastgpt.ai/docs/guide/knowledge_base/yuque_dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/yuque_dataset/FastGPT v4.8.16 版本开始,商业版用户支持语雀文件库导入,用户可以通过配置语雀的 token 和 uid 来导入语雀文档库。目前处于测试阶段,部分交互有待优化。 +1. 获取语雀的 token 和 uid link在语雀首页 - 个人头像 - 设置,可找到对应参数。 +参考下图获取 Token 和 User ID,注意给 Token 赋值权限: +获取 Token 增加权限 获取 User ID 2. 创建知识库 link使用上一步获取的 token 和 uid,创建知识库,选择语雀文件库类型,然后填入对应的参数,点击创建。 +3. 导入文档 link创建完知识库后,点击添加文件即可导入语雀的文档库,跟随引导即可。 +语雀知识库支持定时同步功能,每天会不定时的扫描一次,如果文档有更新,则会进行同步,也可以进行手动同步。Web 站点同步https://doc.tryfastgpt.ai/docs/guide/knowledge_base/websync/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/websync/该功能目前仅向商业版用户开放。 +什么是 Web 站点同步 linkWeb 站点同步利用爬虫的技术,可以通过一个入口网站,自动捕获同域名下的所有网站,目前最多支持200个子页面。出于合规与安全角度,FastGPT 仅支持静态站点的爬取,主要用于各个文档站点快速构建知识库。 +Tips: 国内的媒体站点基本不可用,公众号、csdn、知乎等。可以通过终端发送curl请求检测是否为静态站点,例如: +curl https://doc.tryfastgpt.ai/docs/intro/ 如何使用 link1. 新建知识库,选择 Web 站点同步 link 2. 点击配置站点信息 link 3. 填写网址和选择器 link 好了, 现在点击开始同步,静等系统自动抓取网站信息即可。 +创建应用,绑定知识库 link 选择器如何使用 link选择器是 HTML CSS JS 的产物,你可以通过选择器来定位到你需要抓取的具体内容,而不是整个站点。使用方式为: +首先打开浏览器调试面板(通常是 F12,或者【右键 - 检查】) link 输入对应元素的选择器 link菜鸟教程 css 选择器,具体选择器的使用方式可以参考菜鸟教程。 +上图中,我们选中了一个区域,对应的是div标签,它有 data-prismjs-copy, data-prismjs-copy-success, data-prismjs-copy-error 三个属性,这里我们用到一个就够。所以选择器是: div[data-prismjs-copy] +除了属性选择器,常见的还有类和ID选择器。例如: +上图 class 里的是类名(可能包含多个类名,都是空格隔开的,选择一个即可),选择器可以为:.docs-content +多选择器使用 link在开头的演示中,我们对 FastGPT 文档是使用了多选择器的方式来选择,通过逗号隔开了两个选择器。 +我们希望选中上图两个标签中的内容,此时就需要两组选择器。一组是:.docs-content .mb-0.d-flex,含义是 docs-content 类下同时包含 mb-0和d-flex 两个类的子元素; +另一组是.docs-content div[data-prismjs-copy],含义是docs-content 类下包含data-prismjs-copy属性的div元素。 +把两组选择器用逗号隔开即可:.docs-content .mb-0.d-flex, .docs-content div[data-prismjs-copy]外部文件知识库https://doc.tryfastgpt.ai/docs/guide/knowledge_base/externalfile/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/externalfile/外部文件库是 FastGPT 商业版特有功能。它允许接入你现在的文件系统,无需将文件再导入一份到 FastGPT 中。 +并且,阅读权限可以通过你的文件系统进行控制。 +导入参数说明 link 外部预览地址:用于跳转你的文件阅读地址,会携带“文件阅读ID”进行访问。 文件访问URL:文件可访问的地址。 文件阅读ID:通常情况下,文件访问URL是临时的。如果希望永久可以访问,你需要使用该文件阅读ID,并配合上“外部预览地址”,跳转至新的阅读地址进行原文件访问。 文件名:默认会自动解析文件访问URL上的文件名。如果你手动填写,将会以手动填写的值为准。 点击查看API导入文档 +API 文件库替代方案 link4.8.15 提供了新的知识库类型 - API 文件库,对外部文件知识库做了进一步的拓展 +通过对接口进行简单的调整,就能使用 API 文件库代替外部文件知识库的功能 +你可以直接将外部文件知识库中的外部预览地址,作为 API 文件库接口规范中获取文件阅读链接的接口返回 +然后再以相同的 baseURL 实现获取文件列表和获取单个文件内容这两个接口 +这样就能轻松地使用 API 文件库替代原有的外部文件知识库,更多详细的内容见 API 文件库的文档 \ No newline at end of file diff --git a/docs/guide/knowledge_base/lark_dataset/index.html b/docs/guide/knowledge_base/lark_dataset/index.html new file mode 100644 index 000000000000..ea04fefc9a4c --- /dev/null +++ b/docs/guide/knowledge_base/lark_dataset/index.html @@ -0,0 +1,44 @@ +飞书知识库 | FastGPT
+
language

飞书知识库

FastGPT 飞书知识库功能介绍和使用方式

alt textalt text

FastGPT v4.8.16 版本开始,商业版用户支持飞书知识库导入,用户可以通过配置飞书应用的 appId 和 appSecret,并选中一个文档空间的顶层文件夹来导入飞书知识库。目前处于测试阶段,部分交互有待优化。

由于飞书限制,无法直接获取所有文档内容,目前仅可以获取共享空间下文件目录的内容,无法获取个人空间和知识库里的内容。

1. 创建飞书应用

打开 飞书开放平台,点击创建应用,选择自建应用,然后填写应用名称。

2. 配置应用权限

创建应用后,进入应用可以配置相关权限,这里需要增加两个权限:

  1. 获取云空间文件夹下的云文档清单
  2. 查看新版文档

alt text

3. 获取 appId 和 appSecret

alt text

4. 给 Folder 增加权限

可参考飞书教程: https://open.feishu.cn/document/server-docs/docs/drive-v1/faq#b02e5bfb

大致总结为:

  1. 把刚刚创建的应用拉入一个群里
  2. 给这个群增加目录权限

如果你的目录已经给全员组增加权限了,则可以跳过上面步骤,直接获取 Folder Token。

alt text

5. 获取 Folder Token

可以页面路径上获取 Folder Token,注意不要把问号复制进来。

alt text

6. 创建知识库

根据 3 和 5 获取到的 3 个参数,创建知识库,选择飞书文件库类型,然后填入对应的参数,点击创建。

alt text

+ + + + \ No newline at end of file diff --git a/docs/guide/knowledge_base/rag/index.html b/docs/guide/knowledge_base/rag/index.html new file mode 100644 index 000000000000..751b37f0d796 --- /dev/null +++ b/docs/guide/knowledge_base/rag/index.html @@ -0,0 +1,44 @@ +知识库基础原理介绍 | FastGPT
+
language

知识库基础原理介绍

本节详细介绍RAG模型的核心机制、应用场景及其在生成任务中的优势与局限性。

RAG文档

1. 引言

随着自然语言处理(NLP)技术的迅猛发展,生成式语言模型(如GPT、BART等)在多种文本生成任务中表现卓越,尤其在语言生成和上下文理解方面。然而,纯生成模型在处理事实类任务时存在一些固有的局限性。例如,由于这些模型依赖于固定的预训练数据,它们在回答需要最新或实时信息的问题时,可能会出现“编造”信息的现象,导致生成结果不准确或缺乏事实依据。此外,生成模型在面对长尾问题和复杂推理任务时,常因缺乏特定领域的外部知识支持而表现不佳,难以提供足够的深度和准确性。

与此同时,检索模型(Retriever)能够通过在海量文档中快速找到相关信息,解决事实查询的问题。然而,传统检索模型(如BM25)在面对模糊查询或跨域问题时,往往只能返回孤立的结果,无法生成连贯的自然语言回答。由于缺乏上下文推理能力,检索模型生成的答案通常不够连贯和完整。

为了解决这两类模型的不足,检索增强生成模型(Retrieval-Augmented Generation,RAG)应运而生。RAG通过结合生成模型和检索模型的优势,实时从外部知识库中获取相关信息,并将其融入生成任务中,确保生成的文本既具备上下文连贯性,又包含准确的知识。这种混合架构在智能问答、信息检索与推理、以及领域特定的内容生成等场景中表现尤为出色。

1.1 RAG的定义

RAG是一种将信息检索与生成模型相结合的混合架构。首先,检索器从外部知识库或文档集中获取与用户查询相关的内容片段;然后,生成器基于这些检索到的内容生成自然语言输出,确保生成的内容既信息丰富,又具备高度的相关性和准确性。

2. RAG模型的核心机制

RAG 模型由两个主要模块构成:检索器(Retriever)与生成器(Generator)。这两个模块相互配合,确保生成的文本既包含外部的相关知识,又具备自然流畅的语言表达。

2.1 检索器(Retriever)

检索器的主要任务是从一个外部知识库或文档集中获取与输入查询最相关的内容。在RAG中,常用的技术包括:

  • 向量检索:如BERT向量等,它通过将文档和查询转化为向量空间中的表示,并使用相似度计算来进行匹配。向量检索的优势在于能够更好地捕捉语义相似性,而不仅仅是依赖于词汇匹配。
  • 传统检索算法:如BM25,主要基于词频和逆文档频率(TF-IDF)的加权搜索模型来对文档进行排序和检索。BM25适用于处理较为简单的匹配任务,尤其是当查询和文档中的关键词有直接匹配时。

RAG中检索器的作用是为生成器提供一个上下文背景,使生成器能够基于这些检索到的文档片段生成更为相关的答案。

2.2 生成器(Generator)

生成器负责生成最终的自然语言输出。在RAG系统中,常用的生成器包括:

  • BART:BART是一种序列到序列的生成模型,专注于文本生成任务,可以通过不同层次的噪声处理来提升生成的质量 。
  • GPT系列:GPT是一个典型的预训练语言模型,擅长生成流畅自然的文本。它通过大规模数据训练,能够生成相对准确的回答,尤其在任务-生成任务中表现尤为突出 。

生成器在接收来自检索器的文档片段后,会利用这些片段作为上下文,并结合输入的查询,生成相关且自然的文本回答。这确保了模型的生成结果不仅仅基于已有的知识,还能够结合外部最新的信息。

2.3 RAG的工作流程

RAG模型的工作流程可以总结为以下几个步骤:

  1. 输入查询:用户输入问题,系统将其转化为向量表示。
  2. 文档检索:检索器从知识库中提取与查询最相关的文档片段,通常使用向量检索技术或BM25等传统技术进行。
  3. 生成答案:生成器接收检索器提供的片段,并基于这些片段生成自然语言答案。生成器不仅基于原始的用户查询,还会利用检索到的片段提供更加丰富、上下文相关的答案。
  4. 输出结果:生成的答案反馈给用户,这个过程确保了用户能够获得基于最新和相关信息的准确回答。

3. RAG模型的工作原理

3.1 检索阶段

在RAG模型中,用户的查询首先被转化为向量表示,然后在知识库中执行向量检索。通常,检索器采用诸如BERT等预训练模型生成查询和文档片段的向量表示,并通过相似度计算(如余弦相似度)匹配最相关的文档片段。RAG的检索器不仅仅依赖简单的关键词匹配,而是采用语义级别的向量表示,从而在面对复杂问题或模糊查询时,能够更加准确地找到相关知识。这一步骤对于最终生成的回答至关重要,因为检索的效率和质量直接决定了生成器可利用的上下文信息 。

3.2 生成阶段

生成阶段是RAG模型的核心部分,生成器负责基于检索到的内容生成连贯且自然的文本回答。RAG中的生成器,如BART或GPT等模型,结合用户输入的查询和检索到的文档片段,生成更加精准且丰富的答案。与传统生成模型相比,RAG的生成器不仅能够生成语言流畅的回答,还可以根据外部知识库中的实际信息提供更具事实依据的内容,从而提高了生成的准确性 。

3.3 多轮交互与反馈机制

RAG模型在对话系统中能够有效支持多轮交互。每一轮的查询和生成结果会作为下一轮的输入,系统通过分析和学习用户的反馈,逐步优化后续查询的上下文。通过这种循环反馈机制,RAG能够更好地调整其检索和生成策略,使得在多轮对话中生成的答案越来越符合用户的期望。此外,多轮交互还增强了RAG在复杂对话场景中的适应性,使其能够处理跨多轮的知识整合和复杂推理 。

4. RAG的优势与局限

4.1 优势

  • 信息完整性:RAG 模型结合了检索与生成技术,使得生成的文本不仅语言自然流畅,还能够准确利用外部知识库提供的实时信息。这种方法能够显著提升生成任务的准确性,特别是在知识密集型场景下,如医疗问答或法律意见生成。通过从知识库中检索相关文档,RAG 模型避免了生成模型“编造”信息的风险,确保输出更具真实性 。
  • 知识推理能力:RAG 能够利用大规模的外部知识库进行高效检索,并结合这些真实数据进行推理,生成基于事实的答案。相比传统生成模型,RAG 能处理更为复杂的任务,特别是涉及跨领域或跨文档的推理任务。例如,法律领域的复杂判例推理或金融领域的分析报告生成都可以通过RAG的推理能力得到优化 。
  • 领域适应性强:RAG 具有良好的跨领域适应性,能够根据不同领域的知识库进行特定领域内的高效检索和生成。例如,在医疗、法律、金融等需要实时更新和高度准确性的领域,RAG 模型的表现优于仅依赖预训练的生成模型 。

4.2 局限

RAG(检索增强生成)模型通过结合检索器和生成器,实现了在多种任务中知识密集型内容生成的突破性进展。然而,尽管其具有较强的应用潜力和跨领域适应能力,但在实际应用中仍然面临着一些关键局限,限制了其在大规模系统中的部署和优化。以下是RAG模型的几个主要局限性:

4.2.1 检索器的依赖性与质量问题

RAG模型的性能很大程度上取决于检索器返回的文档质量。由于生成器主要依赖检索器提供的上下文信息,如果检索到的文档片段不相关、不准确,生成的文本可能出现偏差,甚至产生误导性的结果。尤其在多模糊查询或跨领域检索的情况下,检索器可能无法找到合适的片段,这将直接影响生成内容的连贯性和准确性。

  • 挑战:当知识库庞大且内容多样时,如何提高检索器在复杂问题下的精确度是一大挑战。当前的方法如BM25等在特定任务上有局限,尤其是在面对语义模糊的查询时,传统的关键词匹配方式可能无法提供语义上相关的内容。
  • 解决途径:引入混合检索技术,如结合稀疏检索(BM25)与密集检索(如向量检索)。例如,Faiss的底层实现允许通过BERT等模型生成密集向量表示,显著提升语义级别的匹配效果。通过这种方式,检索器可以捕捉深层次的语义相似性,减少无关文档对生成器的负面影响。

4.2.2 生成器的计算复杂度与性能瓶颈

RAG模型将检索和生成模块结合,尽管生成结果更加准确,但也大大增加了模型的计算复杂度。尤其在处理大规模数据集或长文本时,生成器需要处理来自多个文档片段的信息,导致生成时间明显增加,推理速度下降。对于实时问答系统或其他需要快速响应的应用场景,这种高计算复杂度是一个主要瓶颈。

  • 挑战:当知识库规模扩大时,检索过程中的计算开销以及生成器在多片段上的整合能力都会显著影响系统的效率。同时,生成器也面临着资源消耗的问题,尤其是在多轮对话或复杂生成任务中,GPU和内存的消耗会成倍增加。
  • 解决途径:使用模型压缩技术和知识蒸馏来减少生成器的复杂度和推理时间。此外,分布式计算与模型并行化技术的引入,如DeepSpeed和模型压缩工具,可以有效应对生成任务的高计算复杂度,提升大规模应用场景中的推理效率。

4.2.3 知识库的更新与维护

RAG模型通常依赖于一个预先建立的外部知识库,该知识库可能包含文档、论文、法律条款等各类信息。然而,知识库内容的时效性和准确性直接影响到RAG生成结果的可信度。随着时间推移,知识库中的内容可能过时,导致生成的回答不能反映最新的信息。这对于需要实时信息的场景(如医疗、金融)尤其明显。

  • 挑战:知识库需要频繁更新,但手动更新知识库既耗时又容易出错。如何在不影响系统性能的情况下实现知识库的持续自动更新是当前的一大挑战。
  • 解决途径:利用自动化爬虫和信息提取系统,可以实现对知识库的自动化更新,例如,Scrapy等爬虫框架可以自动抓取网页数据并更新知识库。结合动态索引技术,可以帮助检索器实时更新索引,确保知识库反映最新信息。同时,结合增量学习技术,生成器可以逐步吸收新增的信息,避免生成过时答案。此外,动态索引技术也可以帮助检索器实时更新索引,确保知识库检索到的文档反映最新的内容。

4.2.4 生成内容的可控性与透明度

RAG模型结合了检索与生成模块,在生成内容的可控性和透明度上存在一定问题。特别是在复杂任务或多义性较强的用户输入情况下,生成器可能会基于不准确的文档片段生成错误的推理,导致生成的答案偏离实际问题。此外,由于RAG模型的“黑箱”特性,用户难以理解生成器如何利用检索到的文档信息,这在高敏感领域如法律或医疗中尤为突出,可能导致用户对生成内容产生不信任感。

  • 挑战:模型透明度不足使得用户难以验证生成答案的来源和可信度。对于需要高可解释性的任务(如医疗问诊、法律咨询等),无法追溯生成答案的知识来源会导致用户不信任模型的决策。
  • 解决途径:为提高透明度,可以引入可解释性AI(XAI)技术,如LIME或SHAP(链接),为每个生成答案提供详细的溯源信息,展示所引用的知识片段。这种方法能够帮助用户理解模型的推理过程,从而增强对模型输出的信任。此外,针对生成内容的控制,可以通过加入规则约束或用户反馈机制,逐步优化生成器的输出,确保生成内容更加可信。

5. RAG整体改进方向

RAG模型的整体性能依赖于知识库的准确性和检索的效率,因此在数据采集、内容分块、精准检索和回答生成等环节进行优化,是提升模型效果的关键。通过加强数据来源、改进内容管理、优化检索策略及提升回答生成的准确性,RAG模型能够更加适应复杂且动态的实际应用需求。

5.1 数据采集与知识库构建

RAG模型的核心依赖在于知识库的数据质量和广度,知识库在某种程度上充当着“外部记忆”的角色。因此,高质量的知识库不仅应包含广泛领域的内容,更要确保数据来源的权威性、可靠性以及时效性。知识库的数据源应涵盖多种可信的渠道,例如科学文献数据库(如PubMed、IEEE Xplore)、权威新闻媒体、行业标准和报告等,这样才能提供足够的背景信息支持RAG在不同任务中的应用。此外,为了确保RAG模型能够提供最新的回答,知识库需要具备自动化更新的能力,以避免数据内容老旧,导致回答失准或缺乏现实参考。

  • 挑战:
    • 尽管数据采集是构建知识库的基础,但在实际操作中仍存在以下几方面的不足:
    • 数据采集来源单一或覆盖不全
      1. RAG模型依赖多领域数据的支持,然而某些知识库过度依赖单一或有限的数据源,通常集中在某些领域,导致在多任务需求下覆盖不足。例如,依赖医学领域数据而缺乏法律和金融数据会使RAG模型在跨领域问答中表现不佳。这种局限性削弱了RAG模型在处理不同主题或多样化查询时的准确性,使得系统在应对复杂或跨领域任务时能力欠缺。
    • 数据质量参差不齐
      1. 数据源的质量差异直接影响知识库的可靠性。一些数据可能来源于非权威或低质量渠道,存在偏见、片面或不准确的内容。这些数据若未经筛选录入知识库,会导致RAG模型生成偏差或不准确的回答。例如,在医学领域中,如果引入未经验证的健康信息,可能导致模型给出误导性回答,产生负面影响。数据质量不一致的知识库会大大降低模型输出的可信度和适用性。
    • 缺乏定期更新机制
      1. 许多知识库缺乏自动化和频繁的更新机制,特别是在信息变动频繁的领域,如法律、金融和科技。若知识库长期未更新,则RAG模型无法提供最新信息,生成的回答可能过时或不具备实时参考价值。对于用户而言,特别是在需要实时信息的场景下,滞后的知识库会显著影响RAG模型的可信度和用户体验。
    • 数据处理耗时且易出错
      1. 数据的采集、清洗、分类和结构化处理是一项繁琐而复杂的任务,尤其是当数据量巨大且涉及多种格式时。通常,大量数据需要人工参与清洗和结构化,而自动化处理流程也存在缺陷,可能会产生错误或遗漏关键信息。低效和易出错的数据处理流程会导致知识库内容不准确、不完整,进而影响RAG模型生成的答案的准确性和连贯性。
    • 数据敏感性和隐私问题
      1. 一些特定领域的数据(如医疗、法律、金融)包含敏感信息,未经适当的隐私保护直接引入知识库可能带来隐私泄露的风险。此外,某些敏感数据需要严格的授权和安全存储,以确保在知识库使用中避免违规或隐私泄漏。若未能妥善处理数据隐私问题,不仅会影响系统的合规性,还可能对用户造成严重后果。
  • 改进:
    • 针对以上不足,可以从以下几个方面进行改进,以提高数据采集和知识库构建的有效性:
    • 扩大数据源覆盖范围,增加数据的多样性
      1. 具体实施:将知识库的数据源扩展至多个重要领域,确保包含医疗、法律、金融等关键领域的专业数据库,如PubMed、LexisNexis和金融数据库。使用具有开放许可的开源数据库和经过认证的数据,确保来源多样化且权威性强。
      2. 目的与效果:通过跨领域数据覆盖,知识库的广度和深度得以增强,确保RAG模型能够在多任务场景下提供可靠回答。借助多领域合作机构的数据支持,在应对多样化需求时将更具优势。
    • 构建数据质量审查与过滤机制
      1. 具体实施:采用自动化数据质量检测算法,如文本相似度检查、情感偏差检测等工具,结合人工审查过滤不符合标准的数据。为数据打分并构建“数据可信度评分”,基于来源可信度、内容完整性等指标筛选数据。
      2. 目的与效果:减少低质量、偏见数据的干扰,确保知识库内容的可靠性。此方法保障了RAG模型输出的权威性,特别在回答复杂或专业问题时,用户能够获得更加精准且中立的答案。
    • 实现知识库的自动化更新
      1. 具体实施:引入自动化数据更新系统,如网络爬虫,定期爬取可信站点、行业数据库的最新数据,并利用变化检测算法筛选出与已有知识库重复或已失效的数据。更新机制可以结合智能筛选算法,仅采纳与用户查询高相关性或时效性强的数据。
      2. 目的与效果:知识库保持及时更新,确保模型在快速变化的领域(如金融、政策、科技)中提供最新信息。用户体验将因此大幅提升,特别是在需要动态或最新信息的领域,输出的内容将更具时效性。
    • 采用高效的数据清洗与分类流程
      1. 具体实施:使用自然语言处理技术,如BERT等模型进行数据分类、实体识别和文本去噪,结合去重算法清理重复内容。采用自动化的数据标注和分类算法,将不同数据类型分领域存储。
      2. 目的与效果:数据清洗和分领域管理可以大幅提高数据处理的准确性,减少低质量数据的干扰。此改进确保RAG模型的回答生成更流畅、上下文更连贯,提升用户对生成内容的理解和信赖。
    • 强化数据安全与隐私保护措施
      1. 具体实施:针对医疗、法律等敏感数据,采用去标识化处理技术(如数据脱敏、匿名化等),并结合差分隐私保护。建立数据权限管理和加密存储机制,对敏感信息进行严格管控。
      2. 目的与效果:在保护用户隐私的前提下,确保使用的数据合规、安全,适用于涉及个人或敏感数据的应用场景。此措施进一步保证了系统的法律合规性,并有效防止隐私泄露风险。
    • 优化数据格式与结构的标准化
      1. 具体实施:建立统一的数据格式与标准编码格式,例如使用JSON、XML或知识图谱形式组织结构化数据,以便于检索系统在查询时高效利用。同时,使用知识图谱等结构化工具,将复杂数据间的关系进行系统化存储。
      2. 目的与效果:提高数据检索效率,确保模型在生成回答时能够高效使用数据的关键信息。标准化的数据结构支持高效的跨领域检索,并提高了RAG模型的内容准确性和知识关系的透明度。
    • 用户反馈机制
      1. 具体实施:通过用户反馈系统,记录用户对回答的满意度、反馈意见及改进建议。使用机器学习算法从反馈中识别知识库中的盲区与信息误差,反馈至数据管理流程中进行更新和优化。
      2. 目的与效果:利用用户反馈作为数据质量的调整依据,帮助知识库持续优化内容。此方法不仅提升了RAG模型的实际效用,还使知识库更贴合用户需求,确保输出内容始终符合用户期望。

5.2 数据分块与内容管理

RAG模型的数据分块与内容管理是优化检索与生成流程的关键。合理的分块策略能够帮助模型高效定位目标信息,并在回答生成时提供清晰的上下文支持。通常情况下,将数据按段落、章节或主题进行分块,不仅有助于检索效率的提升,还能避免冗余数据对生成内容造成干扰。尤其在复杂、长文本中,适当的分块策略可保证模型生成的答案具备连贯性、精确性,避免出现内容跳跃或上下文断裂的问题。

  • 挑战:
    • 在实际操作中,数据分块与内容管理环节存在以下问题:
    • 分块不合理导致的信息断裂
      1. 部分文本过度切割或分块策略不合理,可能导致信息链条被打断,使得模型在回答生成时缺乏必要的上下文支持。这会使生成内容显得零散,不具备连贯性,影响用户对答案的理解。例如,将法律文本或技术文档随意切割成小段落会导致重要的上下文关系丢失,降低模型的回答质量。
    • 冗余数据导致生成内容重复或信息过载
      1. 数据集中往往包含重复信息,若不去重或优化整合,冗余数据可能导致生成内容的重复或信息过载。这不仅影响用户体验,还会浪费计算资源。例如,在新闻数据或社交媒体内容中,热点事件的描述可能重复出现,模型在生成回答时可能反复引用相同信息。
    • 分块粒度选择不当影响检索精度
      1. 如果分块粒度过细,模型可能因缺乏足够的上下文而生成不准确的回答;若分块过大,检索时将难以定位具体信息,导致回答内容冗长且含有无关信息。选择适当的分块粒度对生成答案的准确性和相关性至关重要,特别是在问答任务中需要精确定位答案的情况下,粗放的分块策略会明显影响用户的阅读体验和回答的可读性。
    • 难以实现基于主题或内容逻辑的分块
      1. 某些复杂文本难以直接按主题或逻辑结构进行分块,尤其是内容密集或领域专业性较强的数据。基于关键字或简单的规则切割往往难以识别不同主题和信息层次,导致模型在回答生成时信息杂乱。对内容逻辑或主题的错误判断,尤其是在医学、金融等场景下,会大大影响生成答案的准确度和专业性。
  • 改进:
    • 为提高数据分块和内容管理的有效性,可以从以下几方面进行优化:
    • 引入NLP技术进行自动化分块和上下文分析
      1. 具体实施:借助自然语言处理(NLP)技术,通过句法分析、语义分割等方式对文本进行逻辑切割,以确保分块的合理性。可以基于BERT等预训练模型实现主题识别和上下文分析,确保每个片段均具备完整的信息链,避免信息断裂。
      2. 目的与效果:确保文本切割基于逻辑或语义关系,避免信息链条被打断,生成答案时能够更具连贯性,尤其适用于长文本和复杂结构的内容,使模型在回答时上下文更加完整、连贯。
    • 去重与信息整合,优化内容简洁性
      1. 具体实施:利用相似度算法(如TF-IDF、余弦相似度)识别冗余内容,并结合聚类算法自动合并重复信息。针对内容频繁重复的情况,可设置内容标记或索引,避免生成时多次引用相同片段。
      2. 目的与效果:通过去重和信息整合,使数据更具简洁性,避免生成答案中出现重复信息。减少冗余信息的干扰,使用户获得简明扼要的回答,增强阅读体验,同时提升生成过程的计算效率。
    • 根据任务需求动态调整分块粒度
      1. 具体实施:根据模型任务的不同,设置动态分块策略。例如,在问答任务中对关键信息较短的内容可采用小粒度分块,而在长文本或背景性内容中采用较大粒度。分块策略可基于查询需求或内容复杂度自动调整。
      2. 目的与效果:分块粒度的动态调整确保模型在检索和生成时既能准确定位关键内容,又能为回答提供足够的上下文支持,提升生成内容的精准性和相关性,确保用户获取的信息既准确又不冗长。
    • 引入基于主题的分块方法以提升上下文完整性
      1. 具体实施:使用主题模型(如LDA)或嵌入式文本聚类技术,对文本内容按主题进行自动分类与分块。基于相同主题内容的聚合分块,有助于模型识别不同内容层次,尤其适用于复杂的学术文章或多章节的长篇报告。
      2. 目的与效果:基于主题的分块确保同一主题的内容保持在一个片段内,提升模型在回答生成时的上下文连贯性。适用于主题复杂、层次清晰的内容场景,提高回答的专业性和条理性,使用户更容易理解生成内容的逻辑关系。
    • 实时评估分块策略与内容呈现效果的反馈机制
      1. 具体实施:通过用户反馈机制和生成质量评估系统实时监测生成内容的连贯性和准确性。对用户反馈中涉及分块效果差的部分进行重新分块,通过用户使用数据优化分块策略。
      2. 目的与效果:用户反馈帮助识别不合理的分块和内容呈现问题,实现分块策略的动态优化,持续提升生成内容的质量和用户满意度。

5.3 检索优化

在RAG模型中,检索模块决定了生成答案的相关性和准确性。有效的检索策略可确保模型获取到最适合的上下文片段,使生成的回答更加精准且贴合查询需求。常用的混合检索策略(如BM25和DPR结合)能够在关键词匹配和语义检索方面实现优势互补:BM25适合高效地处理关键字匹配任务,而DPR在理解深层语义上表现更为优异。因此,合理选用检索策略有助于在不同任务场景下达到计算资源和检索精度的平衡,以高效提供相关上下文供生成器使用。

  • 挑战:
    • 检索优化过程中,仍面临以下不足之处:
    • 检索策略单一导致的回答偏差
      1. 当仅依赖BM25或DPR等单一技术时,模型可能难以平衡关键词匹配与语义理解。BM25在处理具象关键字时表现良好,但在面对复杂、含义丰富的语义查询时效果欠佳;相反,DPR虽然具备深度语义匹配能力,但对高频关键词匹配的敏感度较弱。检索策略单一将导致模型难以适应复杂的用户查询,回答中出现片面性或不够精准的情况。
    • 检索效率与资源消耗的矛盾
      1. 检索模块需要在短时间内处理大量查询,而语义检索(如DPR)需要进行大量的计算和存储操作,计算资源消耗高,影响系统响应速度。特别是对于需要实时响应的应用场景,DPR的计算复杂度往往难以满足实际需求,因此在实时性和资源利用率上亟需优化。
    • 检索结果的冗余性导致内容重复
      1. 当检索策略未对结果进行去重或排序优化时,RAG模型可能从知识库中检索出相似度高但内容冗余的文档片段。这会导致生成的回答中包含重复信息,影响阅读体验,同时增加无效信息的比例,使用户难以迅速获取核心答案。
    • 不同任务需求下检索策略的适配性差
      1. RAG模型应用场景丰富,但不同任务对检索精度、速度和上下文长度的需求不尽相同。固定检索策略难以灵活应对多样化的任务需求,导致在应对不同任务时,模型检索效果受限。例如,面向精确性较高的医疗问答场景时,检索策略应偏向语义准确性,而在热点新闻场景中则应偏重检索速度。
  • 改进:
    • 针对上述不足,可以从以下几个方面优化检索模块:
    • 结合BM25与DPR的混合检索策略
      1. 具体实施:采用BM25进行关键词初筛,快速排除无关信息,然后使用DPR进行深度语义匹配筛选。这样可以有效提升检索精度,平衡关键词匹配和语义理解。
      2. 目的与效果:通过多层筛选过程,确保检索结果在语义理解和关键词匹配方面互补,提升生成内容的准确性,特别适用于多意图查询或复杂的长文本检索。
    • 优化检索效率,控制计算资源消耗
      1. 具体实施:利用缓存机制存储近期高频查询结果,避免对相似查询的重复计算。同时,可基于分布式计算结构,将DPR的语义计算任务分散至多节点并行处理。
      2. 目的与效果:缓存与分布式计算结合可显著减少检索计算压力,使系统能够在有限资源下提高响应速度,适用于高并发、实时性要求高的应用场景。
    • 引入去重和排序优化算法
      1. 具体实施:在检索结果中应用余弦相似度去重算法,筛除冗余内容,并基于用户偏好或时间戳对检索结果排序,以确保输出内容的丰富性和新鲜度。
      2. 目的与效果:通过去重和优化排序,确保生成内容更加简洁、直接,减少重复信息的干扰,提高用户获取信息的效率和体验。
    • 动态调整检索策略适应多任务需求
      1. 具体实施:设置不同检索策略模板,根据任务类型自动调整检索权重、片段长度和策略组合。例如在医疗场景中偏向语义检索,而在金融新闻场景中更重视快速关键词匹配。
      2. 目的与效果:动态调整检索策略使RAG模型更加灵活,能够适应不同任务需求,确保检索的精准性和生成答案的上下文适配性,显著提升多场景下的用户体验。
    • 借助Haystack等检索优化框架
      1. 具体实施:在RAG模型中集成Haystack框架,以实现更高效的检索效果,并利用框架中的插件生态系统来增强检索模块的可扩展性和可调节性。
      2. 目的与效果:Haystack提供了检索和生成的整合接口,有助于快速优化检索模块,并适应复杂多样的用户需求,在多任务环境中提供更稳定的性能表现。

5.4 回答生成与优化

在RAG模型中,生成器负责基于检索模块提供的上下文,为用户查询生成自然语言答案。生成内容的准确性和逻辑性直接决定了用户的体验,因此优化生成器的表现至关重要。通过引入知识图谱等结构化信息,生成器能够更准确地理解和关联上下文,从而生成逻辑连贯、准确的回答。此外,生成器的生成逻辑可结合用户反馈持续优化,使回答风格和内容更加符合用户需求。

  • 挑战:
    • 在回答生成过程中,RAG模型仍面临以下不足:
    • 上下文不充分导致的逻辑不连贯
      1. 当生成器在上下文缺失或信息不完整的情况下生成回答时,生成内容往往不够连贯,特别是在处理复杂、跨领域任务时。这种缺乏上下文支持的问题,容易导致生成器误解或忽略关键信息,最终生成内容的逻辑性和完整性欠佳。如在医学场景中,若生成器缺少对病例或症状的全面理解,可能导致回答不准确或不符合逻辑,影响专业性和用户信任度。
    • 专业领域回答的准确性欠佳
      1. 在医学、法律等高专业领域中,生成器的回答需要高度的准确性。然而,生成器可能因缺乏特定知识而生成不符合领域要求的回答,出现内容偏差或理解错误,尤其在涉及专业术语和复杂概念时更为明显。如在法律咨询中,生成器可能未能正确引用相关法条或判例,导致生成的答案不够精确,甚至可能产生误导。
    • 难以有效整合多轮用户反馈
      1. 生成器缺乏有效机制来利用多轮用户反馈进行自我优化。用户反馈可能涉及回答内容的准确性、逻辑性以及风格适配等方面,但生成器在连续对话中缺乏充分的调节机制,难以持续调整生成策略和回答风格。如在客服场景中,生成器可能连续生成不符合用户需求的回答,降低了用户满意度。
    • 生成内容的可控性和一致性不足
      1. 在特定领域回答生成中,生成器的输出往往不具备足够的可控性和一致性。由于缺乏领域特定的生成规则和约束,生成内容的专业性和风格一致性欠佳,难以满足高要求的应用场景。如在金融报告生成中,生成内容需要确保一致的风格和术语使用,否则会影响输出的专业性和可信度。
  • 改进:
    • 针对以上不足,可以从以下方面优化回答生成模块:
    • 引入知识图谱与结构化数据,增强上下文理解
      1. 具体实施:结合知识图谱或知识库,将医学、法律等专业领域的信息整合到生成过程中。生成器在生成回答时,可以从知识图谱中提取关键信息和关联知识点,确保回答具备连贯的逻辑链条。
      2. 目的与效果:知识图谱的引入提升了生成内容的连贯性和准确性,尤其在高专业性领域中,通过丰富的上下文理解,使生成器能够产生符合逻辑的回答。
    • 设计专业领域特定的生成规则和约束
      1. 具体实施:在生成模型中加入领域特定的生成规则和用语约束,特别针对医学、法律等领域的常见问答场景,设定回答模板、术语库等,以提高生成内容的准确性和一致性。
      2. 目的与效果:生成内容更具领域特征,输出风格和内容的专业性增强,有效降低了生成器在专业领域中的回答偏差,满足用户对专业性和可信度的要求。
    • 优化用户反馈机制,实现动态生成逻辑调整
      1. 具体实施:利用机器学习算法对用户反馈进行分析,从反馈中提取生成错误或用户需求的调整信息,动态调节生成器的生成逻辑和策略。同时,在多轮对话中逐步适应用户的需求和风格偏好。
      2. 目的与效果:用户反馈的高效利用能够帮助生成器优化生成内容,提高连续对话中的响应质量,提升用户体验,并使回答更贴合用户需求。
    • 引入生成器与检索器的协同优化机制
      1. 具体实施:通过协同优化机制,在生成器生成答案之前,允许生成器请求检索器补充缺失的上下文信息。生成器可基于回答需求自动向检索器发起上下文补充请求,从而获取完整的上下文。
      2. 目的与效果:协同优化机制保障了生成器在回答时拥有足够的上下文支持,避免信息断层或缺失,提升回答的完整性和准确性。
    • 实施生成内容的一致性检测和语义校正
      1. 具体实施:通过一致性检测算法对生成内容进行术语、风格的统一管理,并结合语义校正模型检测生成内容是否符合用户需求的逻辑结构。在复杂回答生成中,使用语义校正对不符合逻辑的生成内容进行自动优化。
      2. 目的与效果:生成内容具备高度一致性和逻辑性,特别是在多轮对话和专业领域生成中,保障了内容的稳定性和专业水准,提高了生成答案的可信度和用户满意度。

5.5 RAG流程

  1. 数据加载与查询输入:
    1. 用户通过界面或API提交自然语言查询,系统接收查询作为输入。
    2. 输入被传递至向量化器,利用向量化技术(如BERT或Sentence Transformer)将自然语言查询转换为向量表示。
  2. 文档检索:
    1. 向量化后的查询会传递给检索器,检索器通过在知识库中查找最相关的文档片段。
    2. 检索可以基于稀疏检索技术(如BM25)或密集检索技术(如DPR)来提高匹配效率和精度。
  3. 生成器处理与自然语言生成:
    1. 检索到的文档片段作为生成器的输入,生成器(如GPT、BART或T5)基于查询和文档内容生成自然语言回答。
    2. 生成器结合了外部检索结果和预训练模型的语言知识,使回答更加精准、自然。
  4. 结果输出:
    1. 系统生成的答案通过API或界面返回给用户,确保答案连贯且知识准确。
  5. 反馈与优化:
    1. 用户可以对生成的答案进行反馈,系统根据反馈优化检索与生成过程。
    2. 通过微调模型参数或调整检索权重,系统逐步改进其性能,确保未来查询时更高的准确性与效率。

6. RAG相关案例整合

各种分类领域下的RAG

7. RAG模型的应用

RAG模型已在多个领域得到广泛应用,主要包括:

7.1 智能问答系统中的应用

  • RAG通过实时检索外部知识库,生成包含准确且详细的答案,避免传统生成模型可能产生的错误信息。例如,在医疗问答系统中,RAG能够结合最新的医学文献,生成包含最新治疗方案的准确答案,避免生成模型提供过时或错误的建议。这种方法帮助医疗专家快速获得最新的研究成果和诊疗建议,提升医疗决策的质量。
    • 医疗问答系统案例
      • 用户通过Web应用程序发起查询:
        1. 用户在一个Web应用上输入查询请求,这个请求进入后端系统,启动了整个数据处理流程。
      • 使用Azure AD进行身份验证:
        1. 系统通过Azure Active Directory (Azure AD) 对用户进行身份验证,确保只有经过授权的用户才能访问系统和数据。
      • 用户权限检查:
        1. 系统根据用户的组权限(由Azure AD管理)过滤用户能够访问的内容。这个步骤保证了用户只能看到他们有权限查看的信息。
      • Azure AI搜索服务:
        1. 过滤后的用户查询被传递给Azure AI搜索服务,该服务会在已索引的数据库或文档中查找与查询相关的内容。这个搜索引擎通过语义搜索技术检索最相关的信息。
      • 文档智能处理:
        1. 系统使用OCR(光学字符识别)和文档提取等技术处理输入的文档,将非结构化数据转换为结构化、可搜索的数据,便于Azure AI进行检索。
      • 文档来源:
        1. 这些文档来自预先存储的输入文档集合,这些文档在被用户查询之前已经通过文档智能处理进行了准备和索引。
      • Azure Open AI生成响应:
        1. 在检索到相关信息后,数据会被传递到Azure Open AI,该模块利用自然语言生成(NLG)技术,根据用户的查询和检索结果生成连贯的回答。
      • 响应返回用户:
        1. 最终生成的回答通过Web应用程序返回给用户,完成整个查询到响应的流程。
      • 整个流程展示了Azure AI技术的集成,通过文档检索、智能处理以及自然语言生成来处理复杂的查询,并确保了数据的安全和合规性。

7.2 信息检索与文本生成

  • 文本生成:RAG不仅可以检索相关文档,还能根据这些文档生成总结、报告或文档摘要,从而增强生成内容的连贯性和准确性。例如,法律领域中,RAG可以整合相关法条和判例,生成详细的法律意见书,确保内容的全面性和严谨性。这在法律咨询和文件生成过程中尤为重要,可以帮助律师和法律从业者提高工作效率。
    • 法律领域检索增强生成案例
      • 内容总结:
      • 背景: 传统的大语言模型 (LLMs) 在生成任务中表现优异,但在处理法律领域中的复杂任务时存在局限。法律文档具有独特的结构和术语,标准的检索评估基准往往无法充分捕捉这些领域特有的复杂性。为了弥补这一不足,LegalBench-RAG 旨在提供一个评估法律文档检索效果的专用基准。
      • LegalBench-RAG 的结构:
        1. 工作流程:
        2. 用户输入问题(Q: ?,A: ?):用户通过界面输入查询问题,提出需要答案的具体问题。
        3. 嵌入与检索模块(Embed + Retrieve):该模块接收到用户的查询后,会对问题进行嵌入(将其转化为向量),并在外部知识库或文档中执行相似度检索。通过检索算法,系统找到与查询相关的文档片段或信息。
        4. 生成答案(A):基于检索到的最相关信息,生成模型(如GPT或类似的语言模型)根据检索的结果生成连贯的自然语言答案。
        5. 对比和返回结果:生成的答案会与之前的相关问题答案进行对比,并最终将生成的答案返回给用户。
        6. 该基准基于 LegalBench 的数据集,构建了 6858 个查询-答案对,并追溯到其原始法律文档的确切位置。
        7. LegalBench-RAG 侧重于精确地检索法律文本中的小段落,而非宽泛的、上下文不相关的片段。
        8. 数据集涵盖了合同、隐私政策等不同类型的法律文档,确保涵盖多个法律应用场景。
      • 意义: LegalBench-RAG 是第一个专门针对法律检索系统的公开可用的基准。它为研究人员和公司提供了一个标准化的框架,用于比较不同的检索算法的效果,特别是在需要高精度的法律任务中,例如判决引用、条款解释等。
      • 关键挑战:
        1. RAG 系统的生成部分依赖检索到的信息,错误的检索结果可能导致错误的生成输出。
        2. 法律文档的长度和术语复杂性增加了模型检索和生成的难度。
      • 质量控制: 数据集的构建过程确保了高质量的人工注释和文本精确性,特别是在映射注释类别和文档ID到具体文本片段时进行了多次人工校验。

7.3 其它应用场景

RAG还可以应用于多模态生成场景,如图像、音频和3D内容生成。例如,跨模态应用如ReMoDiffuse和Make-An-Audio利用RAG技术实现不同数据形式的生成。此外,在企业决策支持中,RAG能够快速检索外部资源(如行业报告、市场数据),生成高质量的前瞻性报告,从而提升企业战略决策的能力。

8 总结

本文档系统阐述了检索增强生成(RAG)模型的核心机制、优势与应用场景。通过结合生成模型与检索模型,RAG解决了传统生成模型在面对事实性任务时的“编造”问题和检索模型难以生成连贯自然语言输出的不足。RAG模型能够实时从外部知识库获取信息,使生成内容既包含准确的知识,又具备流畅的语言表达,适用于医疗、法律、智能问答系统等多个知识密集型领域。

在应用实践中,RAG模型虽然有着信息完整性、推理能力和跨领域适应性等显著优势,但也面临着数据质量、计算资源消耗和知识库更新等挑战。为进一步提升RAG的性能,提出了针对数据采集、内容分块、检索策略优化以及回答生成的全面改进措施,如引入知识图谱、优化用户反馈机制、实施高效去重算法等,以增强模型的适用性和效率。

RAG在智能问答、信息检索与文本生成等领域展现了出色的应用潜力,并在不断发展的技术支持下进一步拓展至多模态生成和企业决策支持等场景。通过引入混合检索技术、知识图谱以及动态反馈机制,RAG能够更加灵活地应对复杂的用户需求,生成具有事实支撑和逻辑连贯性的回答。未来,RAG将通过增强模型透明性与可控性,进一步提升在专业领域中的可信度和实用性,为智能信息检索与内容生成提供更广泛的应用空间。

+ + + + \ No newline at end of file diff --git a/docs/guide/knowledge_base/websync/index.html b/docs/guide/knowledge_base/websync/index.html new file mode 100644 index 000000000000..3ec03396896e --- /dev/null +++ b/docs/guide/knowledge_base/websync/index.html @@ -0,0 +1,47 @@ +Web 站点同步 | FastGPT
+
language

Web 站点同步

FastGPT Web 站点同步功能介绍和使用方式

该功能目前仅向商业版用户开放。

什么是 Web 站点同步

Web 站点同步利用爬虫的技术,可以通过一个入口网站,自动捕获同域名下的所有网站,目前最多支持200个子页面。出于合规与安全角度,FastGPT 仅支持静态站点的爬取,主要用于各个文档站点快速构建知识库。

Tips: 国内的媒体站点基本不可用,公众号、csdn、知乎等。可以通过终端发送curl请求检测是否为静态站点,例如:

+  curl https://doc.tryfastgpt.ai/docs/intro/
+  

如何使用

1. 新建知识库,选择 Web 站点同步

2. 点击配置站点信息

3. 填写网址和选择器

好了, 现在点击开始同步,静等系统自动抓取网站信息即可。

创建应用,绑定知识库

选择器如何使用

选择器是 HTML CSS JS 的产物,你可以通过选择器来定位到你需要抓取的具体内容,而不是整个站点。使用方式为:

首先打开浏览器调试面板(通常是 F12,或者【右键 - 检查】)

输入对应元素的选择器

菜鸟教程 css 选择器,具体选择器的使用方式可以参考菜鸟教程。

上图中,我们选中了一个区域,对应的是div标签,它有 data-prismjs-copy, data-prismjs-copy-success, data-prismjs-copy-error 三个属性,这里我们用到一个就够。所以选择器是: +div[data-prismjs-copy]

除了属性选择器,常见的还有类和ID选择器。例如:

上图 class 里的是类名(可能包含多个类名,都是空格隔开的,选择一个即可),选择器可以为:.docs-content

多选择器使用

在开头的演示中,我们对 FastGPT 文档是使用了多选择器的方式来选择,通过逗号隔开了两个选择器。

我们希望选中上图两个标签中的内容,此时就需要两组选择器。一组是:.docs-content .mb-0.d-flex,含义是 docs-content 类下同时包含 mb-0d-flex 两个类的子元素;

另一组是.docs-content div[data-prismjs-copy],含义是docs-content 类下包含data-prismjs-copy属性的div元素。

把两组选择器用逗号隔开即可:.docs-content .mb-0.d-flex, .docs-content div[data-prismjs-copy]

+ + + + \ No newline at end of file diff --git a/docs/guide/knowledge_base/yuque_dataset/index.html b/docs/guide/knowledge_base/yuque_dataset/index.html new file mode 100644 index 000000000000..0934fafbf558 --- /dev/null +++ b/docs/guide/knowledge_base/yuque_dataset/index.html @@ -0,0 +1,44 @@ +语雀文件库 | FastGPT
+
language

语雀文件库

FastGPT 语雀文件库功能介绍和使用方式

alt textalt text

FastGPT v4.8.16 版本开始,商业版用户支持语雀文件库导入,用户可以通过配置语雀的 token 和 uid 来导入语雀文档库。目前处于测试阶段,部分交互有待优化。

1. 获取语雀的 token 和 uid

在语雀首页 - 个人头像 - 设置,可找到对应参数。

alt text

参考下图获取 Token 和 User ID,注意给 Token 赋值权限:

获取 Token增加权限获取 User ID
alt textalt textalt text

2. 创建知识库

使用上一步获取的 token 和 uid,创建知识库,选择语雀文件库类型,然后填入对应的参数,点击创建。

alt text

alt text

3. 导入文档

创建完知识库后,点击添加文件即可导入语雀的文档库,跟随引导即可。

语雀知识库支持定时同步功能,每天会不定时的扫描一次,如果文档有更新,则会进行同步,也可以进行手动同步。

alt text

+ + + + \ No newline at end of file diff --git a/docs/guide/plugins/bing_search_plugin/index.html b/docs/guide/plugins/bing_search_plugin/index.html new file mode 100644 index 000000000000..13295c5fdfe2 --- /dev/null +++ b/docs/guide/plugins/bing_search_plugin/index.html @@ -0,0 +1,44 @@ +Bing 搜索插件填写说明 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/plugins/doc2x_plugin_guide/index.html b/docs/guide/plugins/doc2x_plugin_guide/index.html new file mode 100644 index 000000000000..885c5c31c93c --- /dev/null +++ b/docs/guide/plugins/doc2x_plugin_guide/index.html @@ -0,0 +1,44 @@ +Doc2x 插件填写说明 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/plugins/google_search_plugin_guide/index.html b/docs/guide/plugins/google_search_plugin_guide/index.html new file mode 100644 index 000000000000..b527e53ddf2c --- /dev/null +++ b/docs/guide/plugins/google_search_plugin_guide/index.html @@ -0,0 +1,44 @@ +Google 搜索插件填写说明 | FastGPT
+
google_search

Google 搜索插件填写说明

FastGPT Google 搜索插件配置指南

  1. 创建Google Custom Search Engine

https://programmablesearchengine.google.com/

我们连到Custom Search Engine control panel 建立Search Engine

取得搜索引擎的ID,即cx

  1. 获取api key

https://developers.google.com/custom-search/v1/overview?hl=zh-cn

  1. 填入插件输入参数

将搜索引擎ID填入cx字段,api key填入key字段

+ + + + \ No newline at end of file diff --git a/docs/guide/plugins/how_to_submit_system_plugin/index.html b/docs/guide/plugins/how_to_submit_system_plugin/index.html new file mode 100644 index 000000000000..32616bc1a274 --- /dev/null +++ b/docs/guide/plugins/how_to_submit_system_plugin/index.html @@ -0,0 +1,62 @@ +如何提交系统插件 | FastGPT
+
plugin_submission

如何提交系统插件

FastGPT 系统插件提交指南

如何向 FastGPT 社区提交系统插件

系统插件原则

  • 尽可能的轻量简洁,以解决实际问题的工具为主
  • 不允许有密集 cpu 计算,不会占用大量内存占用或网络消耗
  • 不允许操作数据库
  • 不允许往固定的私人地址发送请求(不包含请求某些在线服务,例如 gapier, firecrawl等)
  • 不允许使用私人包,可使用主流的开源包

什么插件可以合并

由于目前未采用按需安装的模式,合并进仓库的插件会全部展示给用户使用。

为了控制插件的质量以及避免数量过多带来的繁琐,并不是所有的插件都会被合并到开源仓库中,你可以提前 PR 与我们沟通插件的内容。

后续实现插件按需安装后,我们会允许更多的社区插件合入。

如何写一个系统插件 - 初步

FastGPT 系统插件和用户工作台的插件效果是一致的,所以你需要提前了解“插件”的定义和功能。

在 FastGPT 中,插件是一种特殊的工作流,它允许你将一个工作流封装起来,并自定义入口参数和出口参数,类似于代码里的 “子函数”。

  1. 跑通 FastGPT dev 环境

需要在 dev 环境下执行下面的操作。

  1. 在 FastGPT 工作台中,创建一个插件

选择基础模板即可。

  1. 创建系统插件配置

系统插件配置以及自定义代码,都会在 packages/plugins 目录下。

  1. packages/plugins/src 下,复制一份 template 目录,并修改名字。
  2. 打开目录里面的 template.json 文件,配置如下:
  3. 目录还有一个 index.ts 文件,下文再提。
+  {
+  "author": "填写你的名字", 
+  "version": "当前系统版本号",
+  "name": "插件名",
+  "avatar": "插件头像,需要配成 icon 格式。直接把 logo 图在 pr 评论区提交即可,我们会帮你加入。",
+  "intro": " 插件的描述,这个描述会影响工具调用",
+  "showStatus": false, // 是否在对话过程展示状态
+  "weight": 10, // 排序权重,均默认 10
+
+  "isTool": true, // 是否作为工具调用节点
+  "templateType": "tools", // 都填写 tools 即可,由官方来分类
+
+  "workflow": { // 这个对象先不管,待会直接粘贴导出的工作流即可
+    "nodes": [],
+    "edges": []
+  }
+}
+  
  1. 打开 packages/plugins/register 文件,注册你的插件。在 list 数组中,加入一个你插件目录的名字,如下图的例子。如需构建插件组(带目录),可参考 DuckDuckGo 插件。

无需额外写代码的插件,直接放在 staticPluginList 内,需要在项目内额外写代码的,写在 packagePluginList 中。

  1. 完成工作流编排并测试

完成工作流编排后,可以点击右上角的发布,并在其他工作流中引入进行测试(此时属于团队插件)。

  1. 复制配置到 template.json

鼠标放置在左上角插件的头像和名称上,会出现对于下拉框操作,可以导出工作流配置。

导出的配置,会自动到剪切板,可以直接到 template.json 文件中粘贴使用,替换步骤 2 中,workflow 的值。

  1. 验证插件是否加载成功

刷新页面,打开系统插件,看其是否成功加载,并将其添加到工作流中使用。

  1. 提交 PR

如果你觉得你的插件需要提交到开源仓库,可以通过 PR 形式向我们提交。

  • 写清楚插件的介绍和功能
  • 配上插件运行的效果图
  • 插件参数填写说明,需要在 PR 中写清楚。例如,有些插件需要去某个提供商申请 key,需要附上对应的地址和教材,后续我们会加入到文档中。

写一个复杂的系统插件 - 进阶

这一章会介绍如何增加一些无法单纯通过编排实现的插件。因为可能需要用到网络请求或第三方包。

上一章提到,在插件的 template 目录下,还有一个 index.ts 文件,这个文件就是用来执行一些插件的代码的。你可以通过在 HTTP 节点中的 URL,填写插件的名字,即可触发该方法,下面以 duckduckgo/search 这个插件为例:

参考上面 3 张图片,当 HTTP 节点的 URL 为系统插件注册的名字时,该请求不会以 HTTP 形式发送,而是会请求到 index.ts 文件中的 main 方法。出入参则对应了 body 和自定义输出的字段名。

由于目前插件会默认插件输出均作为“工具调用”的结果,无法单独指定某些字段作为工具输出,所以,请避免插件的自定义输出携带大量说明字段。

+ + + + \ No newline at end of file diff --git a/docs/guide/plugins/index.html b/docs/guide/plugins/index.html new file mode 100644 index 000000000000..2b82d26ca8f1 --- /dev/null +++ b/docs/guide/plugins/index.html @@ -0,0 +1,44 @@ +系统插件 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/plugins/index.xml b/docs/guide/plugins/index.xml new file mode 100644 index 000000000000..5e2fd79e46e2 --- /dev/null +++ b/docs/guide/plugins/index.xml @@ -0,0 +1,27 @@ +系统插件 on FastGPThttps://doc.tryfastgpt.ai/docs/guide/plugins/Recent content in 系统插件 on FastGPTHugo -- gohugo.iozh-cn如何提交系统插件https://doc.tryfastgpt.ai/docs/guide/plugins/how_to_submit_system_plugin/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/how_to_submit_system_plugin/如何向 FastGPT 社区提交系统插件 +系统插件原则 link 尽可能的轻量简洁,以解决实际问题的工具为主 不允许有密集 cpu 计算,不会占用大量内存占用或网络消耗 不允许操作数据库 不允许往固定的私人地址发送请求(不包含请求某些在线服务,例如 gapier, firecrawl等) 不允许使用私人包,可使用主流的开源包 什么插件可以合并 link由于目前未采用按需安装的模式,合并进仓库的插件会全部展示给用户使用。 +为了控制插件的质量以及避免数量过多带来的繁琐,并不是所有的插件都会被合并到开源仓库中,你可以提前 PR 与我们沟通插件的内容。 +后续实现插件按需安装后,我们会允许更多的社区插件合入。 +如何写一个系统插件 - 初步 linkFastGPT 系统插件和用户工作台的插件效果是一致的,所以你需要提前了解“插件”的定义和功能。 +在 FastGPT 中,插件是一种特殊的工作流,它允许你将一个工作流封装起来,并自定义入口参数和出口参数,类似于代码里的 “子函数”。 +跑通 FastGPT dev 环境 link 需要在 dev 环境下执行下面的操作。 +在 FastGPT 工作台中,创建一个插件 link 选择基础模板即可。 +创建系统插件配置 link 系统插件配置以及自定义代码,都会在 packages/plugins 目录下。 +在 packages/plugins/src 下,复制一份 template 目录,并修改名字。 打开目录里面的 template.json 文件,配置如下: 目录还有一个 index.ts 文件,下文再提。 { &#34;author&#34;: &#34;填写你的名字&#34;, &#34;version&#34;: &#34;当前系统版本号&#34;, &#34;name&#34;: &#34;插件名&#34;, &#34;avatar&#34;: &#34;插件头像,需要配成 icon 格式。直接把 logo 图在 pr 评论区提交即可,我们会帮你加入。&#34;, &#34;intro&#34;: &#34; 插件的描述,这个描述会影响工具调用&#34;, &#34;showStatus&#34;: false, // 是否在对话过程展示状态 &#34;weight&#34;: 10, // 排序权重,均默认 10 &#34;isTool&#34;: true, // 是否作为工具调用节点 &#34;templateType&#34;: &#34;tools&#34;, // 都填写 tools 即可,由官方来分类 &#34;workflow&#34;: { // 这个对象先不管,待会直接粘贴导出的工作流即可 &#34;nodes&#34;: [], &#34;edges&#34;: [] } } 打开 packages/plugins/register 文件,注册你的插件。在 list 数组中,加入一个你插件目录的名字,如下图的例子。如需构建插件组(带目录),可参考 DuckDuckGo 插件。 无需额外写代码的插件,直接放在 staticPluginList 内,需要在项目内额外写代码的,写在 packagePluginList 中。SearXNG 搜索插件配置与使用说明https://doc.tryfastgpt.ai/docs/guide/plugins/searxng_plugin_guide/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/searxng_plugin_guide/SearXNG是一款免费的互联网元搜索引擎,它汇总了来自各种搜索服务和数据库的结果。它不会跟踪或分析用户。用户可以自行部署它进行使用。本文介绍 Searxng 的部署以及接入 FastGPT 插件。 +1. 部署应用 link这里介绍在 Sealos 中部署 SearXNG 的方法。Docker 部署,可以直接参考 SearXNG 官方教程。 +点击打开 Sealos 北京区,点击应用部署,并新建一个应用: +打开应用部署 点击新建应用 2. 部署配置 link把下面参数,填入配置中: +镜像名: searxng/searxng:latest CPU: 0.2 内存: 512M 容器暴露端口: 8080 开启公网访问 点击高级配置,填写环境变量和配置文件 环境变量 +填下面两个内容,主要是为了减小并发,不然内存占用非常大。 +UWSGI_WORKERS=4 UWSGI_THREADS=4 配置文件 +新增一个配置文件,文件名:/etc/searx/settings.yml 文件内容: +general: debug: false instance_name: &#34;searxng&#34; privacypolicy_url: false donation_url: false contact_url: false enable_metrics: true open_metrics: &#39;&#39; brand: new_issue_url: https://github.com/searxng/searxng/issues/new docs_url: https://docs.searxng.org/ public_instances: https://searx.space wiki_url: https://github.com/searxng/searxng/wiki issue_url: https://github.com/searxng/searxng/issues search: safe_search: 0 autocomplete: &#34;&#34; autocomplete_min: 4 default_lang: &#34;auto&#34; ban_time_on_fail: 5 max_ban_time_on_fail: 120 formats: - html server: port: 8080 bind_address: &#34;0.Google 搜索插件填写说明https://doc.tryfastgpt.ai/docs/guide/plugins/google_search_plugin_guide/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/google_search_plugin_guide/创建Google Custom Search Engine link https://programmablesearchengine.google.com/ +我们连到Custom Search Engine control panel 建立Search Engine +取得搜索引擎的ID,即cx +获取api key link https://developers.google.com/custom-search/v1/overview?hl=zh-cn +填入插件输入参数 link 将搜索引擎ID填入cx字段,api key填入key字段Bing 搜索插件填写说明https://doc.tryfastgpt.ai/docs/guide/plugins/bing_search_plugin/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/bing_search_plugin/ 打开微软Azure官网,登陆账号 link https://portal.azure.com/ +创建bing web搜索资源 link 搜索Bing Search v7,点击创建 +https://portal.azure.com/#create/Microsoft.BingSearch +进入资源详情点击管理密钥 link 4. 复制任意一个密钥填入插件输入 linkDoc2x 插件填写说明https://doc.tryfastgpt.ai/docs/guide/plugins/doc2x_plugin_guide/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/doc2x_plugin_guide/打开docx官网,创建账号,并复制 apikey link https://doc2x.noedgeai.com/ +填写apikey到fastgpt中 link 工作流****中: +简易模式使用: \ No newline at end of file diff --git a/docs/guide/plugins/searxng_plugin_guide/index.html b/docs/guide/plugins/searxng_plugin_guide/index.html new file mode 100644 index 000000000000..d2d0d57784b7 --- /dev/null +++ b/docs/guide/plugins/searxng_plugin_guide/index.html @@ -0,0 +1,153 @@ +SearXNG 搜索插件配置与使用说明 | FastGPT
+
search

SearXNG 搜索插件配置与使用说明

FastGPT SearXNG 搜索插件配置指南

SearXNG是一款免费的互联网元搜索引擎,它汇总了来自各种搜索服务和数据库的结果。它不会跟踪或分析用户。用户可以自行部署它进行使用。本文介绍 Searxng 的部署以及接入 FastGPT 插件。

1. 部署应用

这里介绍在 Sealos 中部署 SearXNG 的方法。Docker 部署,可以直接参考 SearXNG 官方教程

点击打开 Sealos 北京区,点击应用部署,并新建一个应用:

打开应用部署点击新建应用
alt text

2. 部署配置

把下面参数,填入配置中:

  • 镜像名: searxng/searxng:latest
  • CPU: 0.2
  • 内存: 512M
  • 容器暴露端口: 8080
  • 开启公网访问
  • 点击高级配置,填写环境变量和配置文件

alt text

环境变量

填下面两个内容,主要是为了减小并发,不然内存占用非常大。

+  UWSGI_WORKERS=4
+UWSGI_THREADS=4
+  

配置文件

新增一个配置文件,文件名:/etc/searx/settings.yml +文件内容:

+  general:
+  debug: false
+  instance_name: "searxng"
+  privacypolicy_url: false
+  donation_url: false
+  contact_url: false
+  enable_metrics: true
+  open_metrics: ''
+
+brand:
+  new_issue_url: https://github.com/searxng/searxng/issues/new
+  docs_url: https://docs.searxng.org/
+  public_instances: https://searx.space
+  wiki_url: https://github.com/searxng/searxng/wiki
+  issue_url: https://github.com/searxng/searxng/issues
+
+search:
+  safe_search: 0
+  autocomplete: ""
+  autocomplete_min: 4
+  default_lang: "auto"
+  ban_time_on_fail: 5
+  max_ban_time_on_fail: 120
+  formats:
+    - html
+
+server:
+  port: 8080
+  bind_address: "0.0.0.0"
+  base_url: false
+  limiter: false
+  public_instance: false
+  secret_key: "example"
+  image_proxy: false
+  http_protocol_version: "1.0"
+  method: "POST"
+  default_http_headers:
+    X-Content-Type-Options: nosniff
+    X-Download-Options: noopen
+    X-Robots-Tag: noindex, nofollow
+    Referrer-Policy: no-referrer
+
+redis:
+  url: false
+
+ui:
+  static_path: ""
+  static_use_hash: false
+  templates_path: ""
+  default_theme: simple
+  default_locale: ""
+  query_in_title: false
+  infinite_scroll: false
+  center_alignment: false
+  theme_args:
+    simple_style: auto
+
+outgoing:
+  request_timeout: 30.0
+  max_request_timeout: 40.0
+  pool_connections: 200
+  pool_maxsize: 50
+  enable_http2: false
+  retries: 5
+
+engines:
+
+  - name: bing
+    engine: bing
+    shortcut: bi
+
+doi_resolvers:
+  oadoi.org: 'https://oadoi.org/'
+  doi.org: 'https://doi.org/'
+  doai.io: 'https://dissem.in/'
+  sci-hub.se: 'https://sci-hub.se/'
+  sci-hub.st: 'https://sci-hub.st/'
+  sci-hub.ru: 'https://sci-hub.ru/'
+
+default_doi_resolver: 'oadoi.org'
+  

国内目前只有 Bing 引擎可以正常用,所以上面的配置只配置了 bing 引擎。如果在海外部署,可以使用Sealos 新加坡可用区,并配置其他搜索引擎,可以参考SearXNG 默认配置文件, 从里面复制一些 engine 配置。例如:

+    - name: duckduckgo
+    engine: duckduckgo
+    shortcut: ddg
+
+  - name: google
+    engine: google
+    shortcut: go
+  

3. FastGPT 使用

复制 Sealos 部署后提供的公网地址,填入 FastGPT 的 SearXNG 插件的 URL 中。

复制公网地址填入 URL
alt textalt text

返回格式

  • 成功时返回搜索结果数组:
+  {
+  "result": "[{\"title\":\"标题1\",\"link\":\"链接1\",\"snippet\":\"摘要1\"}, ...]"
+}
+  
  • 搜索结果为空时会返回友好提示:
+  {
+  "result": "[]",
+  "error": {
+    "message": "No search results",
+    "code": 500
+  }
+}
+  
  • 失败时通过 Promise.reject 可能返回错误信息:
+  - "缺少查询参数"
+- "缺少url"
+- "Failed to fetch data from Search XNG"
+  

一般问题来源于参数缺失与服务部署,如有更多问题可在用户群提问。

FAQ

无搜索结果

  1. 先直接打开外网地址,测试是否可以正常搜索。
  2. 检查是否有超时的搜索引擎,通过 API 调用时不会返回结果。
+ + + + \ No newline at end of file diff --git a/docs/guide/team_permissions/index.html b/docs/guide/team_permissions/index.html new file mode 100644 index 000000000000..3ccc4983c607 --- /dev/null +++ b/docs/guide/team_permissions/index.html @@ -0,0 +1,44 @@ +团队与权限 | FastGPT
+
团队与权限
group

团队与权限

团队管理、成员组与权限设置,确保团队协作中的数据安全和权限分配合理。


+ + + + \ No newline at end of file diff --git a/docs/guide/team_permissions/index.xml b/docs/guide/team_permissions/index.xml new file mode 100644 index 000000000000..328486a19735 --- /dev/null +++ b/docs/guide/team_permissions/index.xml @@ -0,0 +1 @@ +团队与权限 on FastGPThttps://doc.tryfastgpt.ai/docs/guide/team_permissions/Recent content in 团队与权限 on FastGPTHugo -- gohugo.iozh-cn团队&成员组&权限https://doc.tryfastgpt.ai/docs/guide/team_permissions/team_roles_permissions/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/team_permissions/team_roles_permissions/ \ No newline at end of file diff --git a/docs/guide/team_permissions/team_roles_permissions/index.html b/docs/guide/team_permissions/team_roles_permissions/index.html new file mode 100644 index 000000000000..81749bb54493 --- /dev/null +++ b/docs/guide/team_permissions/team_roles_permissions/index.html @@ -0,0 +1,44 @@ +团队&成员组&权限 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/basic-mode/index.html b/docs/guide/workbench/basic-mode/index.html new file mode 100644 index 000000000000..1201765eb644 --- /dev/null +++ b/docs/guide/workbench/basic-mode/index.html @@ -0,0 +1,44 @@ +简易模式 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/gapier/index.html b/docs/guide/workbench/gapier/index.html new file mode 100644 index 000000000000..c5d588b11046 --- /dev/null +++ b/docs/guide/workbench/gapier/index.html @@ -0,0 +1,44 @@ +使用 Gapier 快速导入Agent工具 | FastGPT
+
build

使用 Gapier 快速导入Agent工具

FastGPT 使用 Gapier 快速导入Agent工具

FastGPT V4.7版本加入了工具调用,可以兼容 GPTs 的 Actions。这意味着,你可以直接导入兼容 GPTs 的 Agent 工具。

Gapier 是一个在线 GPTs Actions工具,提供了50多种现成工具,并且每天有免费额度进行测试,方便用户试用,官方地址为:https://gapier.com/

现在,我们开始把 Gapier 的工具导入到 FastGPT 中。

1. 创建插件

Step1Step2Step3
登录Gapier 复制相关参数
Step4Step5Step6
自定义请求头: Authorization
请求值: Bearer 复制的key

创建完后,如果需要变更,无需重新创建,只需要修改对应参数即可,会自动做差值比较更新。

2. 应用绑定工具

简易模式

Step1Step2
Step3Step4

高级编排

Step1Step2
Step3Step4

3. 工具调用说明

不同模型的区别

不同模型调用工具采用不同的方法,有些模型支持 toolChoice 和 functionCall 效果会更好。不支持这两种方式的模型通过提示词调用,但是效果不是很好,并且为了保证顺利调用,FastGPT内置的提示词,仅支持每次调用一个工具。

具体哪些模型支持 functionCall 可以官网查看(当然,也需要OneAPI支持),同时需要调整模型配置文件中的对应字段(详细看配置字段说明)。

线上版用户,可以在模型选择时,看到是否支持函数调用的标识。

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/index.html b/docs/guide/workbench/index.html new file mode 100644 index 000000000000..4617f1aa52f7 --- /dev/null +++ b/docs/guide/workbench/index.html @@ -0,0 +1,45 @@ +工作台 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/index.xml b/docs/guide/workbench/index.xml new file mode 100644 index 000000000000..fe750d7b217f --- /dev/null +++ b/docs/guide/workbench/index.xml @@ -0,0 +1,21 @@ +工作台 on FastGPThttps://doc.tryfastgpt.ai/docs/guide/workbench/Recent content in 工作台 on FastGPTHugo -- gohugo.iozh-cn简易模式https://doc.tryfastgpt.ai/docs/guide/workbench/basic-mode/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/basic-mode/工作流&插件https://doc.tryfastgpt.ai/docs/guide/workbench/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/intro/FastGPT 从 V4 版本开始采用新的交互方式来构建 AI 应用。使用了 Flow 节点编排(工作流)的方式来实现复杂工作流,提高可玩性和扩展性。但同时也提高了上手的门槛,有一定开发背景的用户使用起来会比较容易。 +查看视频教程 +什么是节点? link在程序中,节点可以理解为一个个 Function 或者接口。可以理解为它就是一个步骤。将多个节点一个个拼接起来,即可一步步的去实现最终的 AI 输出。 +如下图,这是一个最简单的 AI 对话。它由用流程开始和 AI 对话节点组成。 +执行流程如下: +用户输入问题后,【流程开始】节点执行,用户问题被保存。 【AI 对话】节点执行,此节点有两个必填参数“聊天记录” “用户问题”,聊天记录的值是默认输入的6条,表示此模块上下文长度。用户问题选择的是【流程开始】模块中保存的用户问题。 【AI 对话】节点根据传入的聊天记录和用户问题,调用对话接口,从而实现回答。 节点分类 link从功能上,节点可以分为 2 类: +系统节点:用户引导(配置一些对话框信息)、用户问题(流程入口)。 功能节点:知识库搜索、AI 对话等剩余节点。(这些节点都有输入和输出,可以自由组合)。 节点的组成 link每个节点会包含 3 个核心部分:输入、输出和触发器。 +AI模型、提示词、聊天记录、用户问题,知识库引用为输入,节点的输入可以是手动输入也可以是变量引用,变量引用的范围包括“全局变量”和之前任意一个节点的输出。 新的上下文和AI回复内容为输出,输出可以被之后任意节点变量引用。 节点的上下左右有四个“触发器”可以被用来连接,被连接的节点按顺序决定是否执行。 重点 - 工作流是如何运行的 linkFastGPT的工作流从【流程开始】节点开始执行,可以理解为从用户输入问题开始,没有固定的出口,是以节点运行结束作为出口,如果在一个轮调用中,所有节点都不再运行,则工作流结束。 +下面我们来看下,工作流是如何运行的,以及每个节点何时被触发执行。 +如上图所示节点会“被连接”也会“连接其他节点”,我们称“被连接”的那根线为前置线,“连接其他节点的线”为后置线。上图例子中【知识库搜索】模块左侧有一根前置线,右侧有一根后置线。而【AI对话】节点只有左侧一根前置线。 +FastGPT工作流中的线有以下几种状态: +waiting:被连接的节点等待执行。 active:被连接的节点可以执行。 skip:被连接的节点不需要执行跳过。 节点执行的原则: +判断前置线中有没有状态为 waiting 的,如果有则等待。 判断前置线中状态有没有状态为 active 如果有则执行。 如果前置线中状态即没有 waiting 也没有 active 则认为此节点需要跳过。 节点执行完毕后,需要根据实际情况更改后置线的状态为active或skip并且更改前置线状态为waiting等待下一轮执行。 让我们看一下上面例子的执行过程: +【流程开始】节点执行完毕,更改后置线为active。 【知识库搜索】节点判断前置线状态为active开始执行,执行完毕后更改后置线状态为active 前置线状态为waiting。 【AI对话】节点判断前置线状态为active开始执行,流程执行结束。 如何连接节点 link 为了方便连接,FastGPT 每个节点的上下左右都有连接点,左和上是前置线连接点,右和下是后置线连接点。 可以点击连接线中间的 x 来删除连接线。 可以左键点击选中连接线 如何阅读? link 建议从左往右阅读。 从 用户问题 节点开始。用户问题节点,代表的是用户发送了一段文本,触发任务开始。 关注【AI 对话】和【指定回复】节点,这两个节点是输出答案的地方。 FAQ link想合并多个输出结果怎么实现? link 文本加工,可以对字符串进行合并。 知识库搜索合并,可以合并多个知识库搜索结果 其他结果,无法直接合并,可以考虑传入到HTTP节点中进行合并,使用[Laf](https://laf.使用 Gapier 快速导入Agent工具https://doc.tryfastgpt.ai/docs/guide/workbench/gapier/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/gapier/FastGPT V4.7版本加入了工具调用,可以兼容 GPTs 的 Actions。这意味着,你可以直接导入兼容 GPTs 的 Agent 工具。 +Gapier 是一个在线 GPTs Actions工具,提供了50多种现成工具,并且每天有免费额度进行测试,方便用户试用,官方地址为:https://gapier.com/。 +现在,我们开始把 Gapier 的工具导入到 FastGPT 中。 +1. 创建插件 link Step1 Step2 Step3 登录Gapier 复制相关参数 Step4 Step5 Step6 自定义请求头: Authorization +请求值: Bearer 复制的key 创建完后,如果需要变更,无需重新创建,只需要修改对应参数即可,会自动做差值比较更新。 +2. 应用绑定工具 link简易模式 link Step1 Step2 Step3 Step4 高级编排 link Step1 Step2 Step3 Step4 3. 工具调用说明 link不同模型的区别 link不同模型调用工具采用不同的方法,有些模型支持 toolChoice 和 functionCall 效果会更好。不支持这两种方式的模型通过提示词调用,但是效果不是很好,并且为了保证顺利调用,FastGPT内置的提示词,仅支持每次调用一个工具。 +具体哪些模型支持 functionCall 可以官网查看(当然,也需要OneAPI支持),同时需要调整模型配置文件中的对应字段(详细看配置字段说明)。 +线上版用户,可以在模型选择时,看到是否支持函数调用的标识。 \ No newline at end of file diff --git a/docs/guide/workbench/intro/index.html b/docs/guide/workbench/intro/index.html new file mode 100644 index 000000000000..d784bfb88f22 --- /dev/null +++ b/docs/guide/workbench/intro/index.html @@ -0,0 +1,44 @@ +工作流&插件 | FastGPT
+
extension

工作流&插件

快速了解 FastGPT 工作流和插件的使用

FastGPT 从 V4 版本开始采用新的交互方式来构建 AI 应用。使用了 Flow 节点编排(工作流)的方式来实现复杂工作流,提高可玩性和扩展性。但同时也提高了上手的门槛,有一定开发背景的用户使用起来会比较容易。

查看视频教程

什么是节点?

在程序中,节点可以理解为一个个 Function 或者接口。可以理解为它就是一个步骤。将多个节点一个个拼接起来,即可一步步的去实现最终的 AI 输出。

如下图,这是一个最简单的 AI 对话。它由用流程开始和 AI 对话节点组成。

执行流程如下:

  1. 用户输入问题后,【流程开始】节点执行,用户问题被保存。
  2. 【AI 对话】节点执行,此节点有两个必填参数“聊天记录” “用户问题”,聊天记录的值是默认输入的6条,表示此模块上下文长度。用户问题选择的是【流程开始】模块中保存的用户问题。
  3. 【AI 对话】节点根据传入的聊天记录和用户问题,调用对话接口,从而实现回答。

节点分类

从功能上,节点可以分为 2 类:

  1. 系统节点:用户引导(配置一些对话框信息)、用户问题(流程入口)。
  2. 功能节点:知识库搜索、AI 对话等剩余节点。(这些节点都有输入和输出,可以自由组合)。

节点的组成

每个节点会包含 3 个核心部分:输入、输出和触发器。

  • AI模型、提示词、聊天记录、用户问题,知识库引用为输入,节点的输入可以是手动输入也可以是变量引用,变量引用的范围包括“全局变量”和之前任意一个节点的输出。
  • 新的上下文和AI回复内容为输出,输出可以被之后任意节点变量引用。
  • 节点的上下左右有四个“触发器”可以被用来连接,被连接的节点按顺序决定是否执行。

重点 - 工作流是如何运行的

FastGPT的工作流从【流程开始】节点开始执行,可以理解为从用户输入问题开始,没有固定的出口,是以节点运行结束作为出口,如果在一个轮调用中,所有节点都不再运行,则工作流结束。

下面我们来看下,工作流是如何运行的,以及每个节点何时被触发执行。

如上图所示节点会“被连接”也会“连接其他节点”,我们称“被连接”的那根线为前置线,“连接其他节点的线”为后置线。上图例子中【知识库搜索】模块左侧有一根前置线,右侧有一根后置线。而【AI对话】节点只有左侧一根前置线。

FastGPT工作流中的线有以下几种状态:

  • waiting:被连接的节点等待执行。
  • active:被连接的节点可以执行。
  • skip:被连接的节点不需要执行跳过。

节点执行的原则:

  1. 判断前置线中有没有状态为 waiting 的,如果有则等待。
  2. 判断前置线中状态有没有状态为 active 如果有则执行。
  3. 如果前置线中状态即没有 waiting 也没有 active 则认为此节点需要跳过。
  4. 节点执行完毕后,需要根据实际情况更改后置线的状态为activeskip并且更改前置线状态为waiting等待下一轮执行。

让我们看一下上面例子的执行过程:

  1. 【流程开始】节点执行完毕,更改后置线为active
  2. 【知识库搜索】节点判断前置线状态为active开始执行,执行完毕后更改后置线状态为active 前置线状态为waiting
  3. 【AI对话】节点判断前置线状态为active开始执行,流程执行结束。

如何连接节点

  1. 为了方便连接,FastGPT 每个节点的上下左右都有连接点,左和上是前置线连接点,右和下是后置线连接点。
  2. 可以点击连接线中间的 x 来删除连接线。
  3. 可以左键点击选中连接线

如何阅读?

  1. 建议从左往右阅读。
  2. 用户问题 节点开始。用户问题节点,代表的是用户发送了一段文本,触发任务开始。
  3. 关注【AI 对话】和【指定回复】节点,这两个节点是输出答案的地方。

FAQ

想合并多个输出结果怎么实现?

  1. 文本加工,可以对字符串进行合并。
  2. 知识库搜索合并,可以合并多个知识库搜索结果
  3. 其他结果,无法直接合并,可以考虑传入到HTTP节点中进行合并,使用[Laf](https://laf.run/)可以快速实现一个无服务器HTTP接口。
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/ai_chat/index.html b/docs/guide/workbench/workflow/ai_chat/index.html new file mode 100644 index 000000000000..7eed3224054d --- /dev/null +++ b/docs/guide/workbench/workflow/ai_chat/index.html @@ -0,0 +1,44 @@ +AI 对话 | FastGPT
+
chat

AI 对话

FastGPT AI 对话模块介绍

特点

  • 可重复添加
  • 触发执行
  • 核心模块

参数说明

AI模型

可以通过 config.json 配置可选的对话模型,通过 one-api 来实现多模型接入。

点击AI模型后,可以配置模型的相关参数。

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/content_extract/index.html b/docs/guide/workbench/workflow/content_extract/index.html new file mode 100644 index 000000000000..6e5716a48225 --- /dev/null +++ b/docs/guide/workbench/workflow/content_extract/index.html @@ -0,0 +1,44 @@ +文本内容提取 | FastGPT
+
content_paste_go

文本内容提取

FastGPT 内容提取模块介绍

特点

  • 可重复添加
  • 需要手动配置
  • 触发执行
  • function_call 模块
  • 核心模块

功能

从文本中提取结构化数据,通常是配合 HTTP 模块实现扩展。也可以做一些直接提取操作,例如:翻译。

参数说明

提取要求描述

顾名思义,给模型设置一个目标,需要提取哪些内容。

示例 1

你是实验室预约助手,从对话中提取出姓名,预约时间,实验室号。当前时间 {{cTime}}

示例 2

你是谷歌搜索助手,从对话中提取出搜索关键词

示例 3

将我的问题直接翻译成英文,不要回答问题

历史记录

通常需要一些历史记录,才能更完整的提取用户问题。例如上图中需要提供姓名、时间和实验室名,用户可能一开始只给了时间和实验室名,没有提供自己的姓名。再经过一轮缺失提示后,用户输入了姓名,此时需要结合上一次的记录才能完整的提取出 3 个内容。

目标字段

目标字段与提取的结果相对应,从上图可以看到,每增加一个字段,输出会增加一个对应的出口。

  • key: 字段的唯一标识,不可重复!
  • 字段描述:描述该字段是关于什么的,例如:姓名、时间、搜索词等等。
  • 必须:是否强制模型提取该字段,可能提取出来是空字符串。

输出介绍

  • 完整提取结果: 一个 JSON 字符串,包含所有字段的提取结果。
  • 目标字段提取结果:类型均为字符串。
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/coreferenceresolution/index.html b/docs/guide/workbench/workflow/coreferenceresolution/index.html new file mode 100644 index 000000000000..6997288e4c06 --- /dev/null +++ b/docs/guide/workbench/workflow/coreferenceresolution/index.html @@ -0,0 +1,44 @@ +问题优化 | FastGPT
+
input

问题优化

问题优化模块介绍和使用

特点

  • 可重复添加
  • 有外部输入
  • 触发执行

背景

在 RAG 中,我们需要根据输入的问题去数据库里执行 embedding 搜索,查找相关的内容,从而查找到相似的内容(简称知识库搜索)。

在搜索的过程中,尤其是连续对话的搜索,我们通常会发现后续的问题难以搜索到合适的内容,其中一个原因是知识库搜索只会使用“当前”的问题去执行。看下面的例子:

用户在提问“第二点是什么”的时候,只会去知识库里查找“第二点是什么”,压根查不到内容。实际上需要查询的是“QA结构是什么”。因此我们需要引入一个【问题优化】模块,来对用户当前的问题进行补全,从而使得知识库搜索能够搜索到合适的内容。使用补全后效果如下:

功能

调用 AI 去对用户当前的问题进行补全。目前主要是补全“指代”词,使得检索词更加的完善可靠,从而增强上下文连续对话的知识库搜索能力。

遇到最大的难题在于:模型对于【补全】的概念可能不清晰,且对于长上下文往往无法准确的知道应该如何补全。

示例

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/custom_feedback/index.html b/docs/guide/workbench/workflow/custom_feedback/index.html new file mode 100644 index 000000000000..96cc868b1332 --- /dev/null +++ b/docs/guide/workbench/workflow/custom_feedback/index.html @@ -0,0 +1,44 @@ +自定义反馈 | FastGPT
+
自定义反馈
feedback

自定义反馈

自定义反馈模块介绍

该模块为临时模块,后续会针对该模块进行更全面的设计。

特点

  • 可重复添加
  • 无外部输入
  • 自动执行

介绍

自定义反馈模块,可以为你的对话增加一个反馈标记,从而方便在后台更好的分析对话的数据。

在调试模式下,不会记录反馈内容,而是直接提示: 自动反馈测试: 反馈内容

在对话模式(对话、分享窗口、带 chatId 的 API 调用)时,会将反馈内容记录到对话日志中。(会延迟60s记录)

作用

自定义反馈模块的功能类似于程序开发的埋点,便于你观测的对话中的数据。

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/dataset_search/index.html b/docs/guide/workbench/workflow/dataset_search/index.html new file mode 100644 index 000000000000..86ce888e7cc9 --- /dev/null +++ b/docs/guide/workbench/workflow/dataset_search/index.html @@ -0,0 +1,44 @@ +知识库搜索 | FastGPT
+
chat

知识库搜索

FastGPT AI 知识库搜索模块介绍

知识库搜索具体参数说明,以及内部逻辑请移步:FastGPT知识库搜索方案

特点

  • 可重复添加(复杂编排时防止线太乱,可以更美观)
  • 有外部输入
  • 有静态配置
  • 触发执行
  • 核心模块

参数说明

输入 - 关联的知识库

可以选择一个或多个相同向量模型的知识库,用于向量搜索。

输入 - 搜索参数

点击查看参数介绍

输出 - 引用内容

以数组格式输出引用,长度可以为 0。意味着,即使没有搜索到内容,这个输出链路也会走通。

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/document_parsing/index.html b/docs/guide/workbench/workflow/document_parsing/index.html new file mode 100644 index 000000000000..6cc597114081 --- /dev/null +++ b/docs/guide/workbench/workflow/document_parsing/index.html @@ -0,0 +1,45 @@ +文档解析 | FastGPT
+
文档解析
document_analysis

文档解析

FastGPT 文档解析模块介绍

文档解析示例 1 +文档解析示例 2

开启文件上传后,可使用文档解析组件。

功能

作用

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/form_input/index.html b/docs/guide/workbench/workflow/form_input/index.html new file mode 100644 index 000000000000..dc5a34448ba5 --- /dev/null +++ b/docs/guide/workbench/workflow/form_input/index.html @@ -0,0 +1,44 @@ +表单输入 | FastGPT
+
表单输入
form_input

表单输入

FastGPT 表单输入模块介绍

特点

  • 用户交互
  • 可重复添加
  • 触发执行

功能

「表单输入」节点属于用户交互节点,当触发这个节点时,对话会进入“交互”状态,会记录工作流的状态,等用户完成交互后,继续向下执行工作流

比如上图中的例子,当触发表单输入节点时,对话框隐藏,对话进入“交互状态”

当用户填完必填的信息并点击提交后,节点能够收集用户填写的表单信息,传递到后续的节点中使用

作用

能够精准收集需要的用户信息,再根据用户信息进行后续操作

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/http/index.html b/docs/guide/workbench/workflow/http/index.html new file mode 100644 index 000000000000..81c6b834a097 --- /dev/null +++ b/docs/guide/workbench/workflow/http/index.html @@ -0,0 +1,153 @@ +HTTP 请求 | FastGPT
+
http

HTTP 请求

FastGPT HTTP 模块介绍

特点

  • 可重复添加
  • 手动配置
  • 触发执行
  • 核中核模块

介绍

HTTP 模块会向对应的地址发送一个 HTTP 请求,实际操作与 Postman 和 ApiFox 这类直流工具使用差不多。

  • Params 为路径请求参数,GET请求中用的居多。
  • Body 为请求体,POST/PUT请求中用的居多。
  • Headers 为请求头,用于传递一些特殊的信息。
  • 自定义变量中可以接收前方节点的输出作为变量
  • 3 种数据中均可以通过 {{}} 来引用变量。
  • url 也可以通过 {{}} 来引用变量。
  • 变量来自于全局变量系统变量前方节点输出

参数结构

系统变量说明

你可以将鼠标放置在请求参数旁边的问号中,里面会提示你可用的变量。

  • appId: 应用的ID
  • chatId: 当前对话的ID,测试模式下不存在。
  • responseChatItemId: 当前对话中,响应的消息ID,测试模式下不存在。
  • variables: 当前对话的全局变量。
  • cTime: 当前时间。
  • histories: 历史记录(默认最多取10条,无法修改长度)

Params, Headers

不多描述,使用方法和Postman, ApiFox 基本一致。

可通过 {{key}} 来引入变量。例如:

keyvalue
appId{{appId}}
AuthorizationBearer {{token}}

Body

只有特定请求类型下会生效。

可以写一个自定义的 Json,并通过 {{key}} 来引入变量。例如:

如何获取返回值

从图中可以看出,FastGPT可以添加多个返回值,这个返回值并不代表接口的返回值,而是代表如何解析接口返回值,可以通过 JSON path 的语法,来提取接口响应的值。

语法可以参考: https://github.com/JSONPath-Plus/JSONPath?tab=readme-ov-file

你可以配置对应的key来从FastGPT 转化后的格式获取需要的值,该规则遵守 JS 的对象取值规则。例如:

  1. 获取message的内容,那么你可以配置messagekeymessage,这样就可以获取到message的内容。
  2. 获取user的name,则key可以为:data.user.name
  3. 获取list中第二个元素,则key可以为:data.list[1],然后输出类型选择字符串,则获自动获取到[ { "test": 22 } ]json字符串。

自动格式化输出

FastGPT v4.6.8 后,加入了出参格式化功能,主要以json格式化成字符串为主。如果你的输出类型选择了字符串,则会将HTTP对应key的值,转成json字符串进行输出。因此,未来你可以直接从HTTP接口输出内容至文本加工中,然后拼接适当的提示词,最终输入给AI对话

laf 对接 HTTP 示例

下面是在 Laf 编写的 POST 请求示例:

+  import cloud from '@lafjs/cloud'
+const db = cloud.database()
+
+type RequestType = {
+  appId: string;
+  appointment: string;
+  action: 'post' | 'delete' | 'put' | 'get'
+}
+
+export default async function (ctx: FunctionContext) {
+  try {
+    // 从 body 中获取参数
+    const { appId, appointment, action } = ctx.body as RequestType
+
+    const parseBody = JSON.parse(appointment)
+    if (action === 'get') {
+      return await getRecord(parseBody)
+    }
+    if (action === 'post') {
+      return await createRecord(parseBody)
+    }
+    if (action === 'put') {
+      return await putRecord(parseBody)
+    }
+    if (action === 'delete') {
+      return await removeRecord(parseBody)
+    }
+
+
+    return {
+      response: "异常"
+    }
+  } catch (err) {
+    return {
+      response: "异常"
+    }
+  }
+}
+  

作用

通过 HTTP 模块你可以无限扩展,比如:

  • 操作数据库
  • 调用外部数据源
  • 执行联网搜索
  • 发送邮箱
  • ….

相关示例

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/index.html b/docs/guide/workbench/workflow/index.html new file mode 100644 index 000000000000..20a37398727b --- /dev/null +++ b/docs/guide/workbench/workflow/index.html @@ -0,0 +1,44 @@ +工作流节点 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/index.xml b/docs/guide/workbench/workflow/index.xml new file mode 100644 index 000000000000..280830996134 --- /dev/null +++ b/docs/guide/workbench/workflow/index.xml @@ -0,0 +1,99 @@ +工作流节点 on FastGPThttps://doc.tryfastgpt.ai/docs/guide/workbench/workflow/Recent content in 工作流节点 on FastGPTHugo -- gohugo.iozh-cnAI 对话https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/ai_chat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/ai_chat/特点 link 可重复添加 触发执行 核心模块 参数说明 linkAI模型 link可以通过 config.json 配置可选的对话模型,通过 one-api 来实现多模型接入。 +点击AI模型后,可以配置模型的相关参数。 +🍅 +具体配置参数介绍可以参考: AI参数配置说明知识库搜索https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/dataset_search/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/dataset_search/知识库搜索具体参数说明,以及内部逻辑请移步:FastGPT知识库搜索方案 +特点 link 可重复添加(复杂编排时防止线太乱,可以更美观) 有外部输入 有静态配置 触发执行 核心模块 参数说明 link输入 - 关联的知识库 link可以选择一个或多个相同向量模型的知识库,用于向量搜索。 +输入 - 搜索参数 link点击查看参数介绍 +输出 - 引用内容 link以数组格式输出引用,长度可以为 0。意味着,即使没有搜索到内容,这个输出链路也会走通。工具调用&终止https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/tool/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/tool/ 什么是工具 link工具可以是一个系统模块,例如:AI对话、知识库搜索、HTTP模块等。也可以是一个插件。 +工具调用可以让 LLM 更动态的决策流程,而不都是固定的流程。(当然,缺点就是费tokens) +工具的组成 link 工具介绍。通常是模块的介绍或插件的介绍,这个介绍会告诉LLM,这个工具的作用是什么。 工具参数。对于系统模块来说,工具参数已经是固定的,无需额外配置。对于插件来说,工具参数是一个可配置项。 工具是如何运行的 link要了解工具如何运行的,首先需要知道它的运行条件。 +需要工具的介绍(或者叫描述)。这个介绍会告诉LLM,这个工具的作用是什么,LLM会根据上下文语义,决定是否需要调用这个工具。 工具的参数。有些工具调用时,可能需要一些特殊的参数。参数中有2个关键的值:参数介绍和是否必须。 结合工具的介绍、参数介绍和参数是否必须,LLM会决定是否调用这个工具。有以下几种情况: +无参数的工具:直接根据工具介绍,决定是否需要执行。例如:获取当前时间。 有参数的工具: 无必须的参数:尽管上下文中,没有适合的参数,也可以调用该工具。但有时候,LLM会自己伪造一个参数。 有必须的参数:如果没有适合的参数,LLM可能不会调用该工具。可以通过提示词,引导用户提供参数。 工具调用逻辑 link在支持函数调用的模型中,可以一次性调用多个工具,调用逻辑如下: +怎么用 link 高级编排中,拖动工具调用的连接点,可用的工具头部会出现一个菱形,可以将它与工具调用模块底部的菱形相连接。 +被连接的工具,会自动分离工具输入与普通的输入,并且可以编辑介绍,可以通过调整介绍,使得该工具调用时机更加精确。 +关于工具调用,如何调试仍然是一个玄学,所以建议,不要一次性增加太多工具,选择少量工具调优后再进一步尝试。 +用途 link默认情况下,工具调用节点,在决定调用工具后,会将工具运行的结果,返回给AI,让 AI 对工具运行的结果进行总结输出。有时候,如果你不需要 AI 进行进一步的总结输出,可以使用该节点,将其接入对于工具流程的末尾。 +如下图,在执行知识库搜索后,发送给了 HTTP 请求,搜索将不会返回搜索的结果给工具调用进行 AI 总结。 +附加节点 link当您使用了工具调用节点,同时就会出现工具调用终止节点和自定义变量节点,能够进一步提升工具调用的使用体验。 +工具调用终止 link工具调用终止可用于结束本次调用,即可以接在某个工具后面,当工作流执行到这个节点时,便会强制结束本次工具调用,不再调用其他工具,也不会再调用 AI 针对工具调用结果回答问题。 +自定义工具变量 link自定义变量可以扩展工具的变量输入,即对于一些未被视作工具参数或无法工具调用的节点,可以自定义工具变量,填上对应的参数描述,那么工具调用便会相对应的调用这个节点,进而调用其之后的工作流。 +相关示例 link 谷歌搜索 发送飞书webhook问题分类https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/question_classify/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/question_classify/特点 link 可重复添加 有外部输入 需要手动配置 触发执行 function_call 模块 功能 link可以将用户的问题进行分类,分类后执行不同操作。在一些较模糊的场景中,分类效果不是很明显。 +参数说明 link系统提示词 link被放置在对话最前面,可用于补充说明分类内容的定义。例如问题会被分为: +打招呼 Laf 常见问题 其他问题 由于 Laf 不是一个明确的东西,需要给它一个定义,此时提示词里可以填入 Laf 的定义: +Laf 是云开发平台,可以快速的开发应用 Laf 是一个开源的 BaaS 开发平台(Backend as a Service) Laf 是一个开箱即用的 serverless 开发平台 Laf 是一个集「函数计算」、「数据库」、「对象存储」等于一身的一站式开发平台 Laf 可以是开源版的腾讯云开发、开源版的 Google Firebase、开源版的 UniCloud 聊天记录 link适当增加一些聊天记录,可以联系上下文进行分类。 +用户问题 link用户输入的内容。 +分类内容 link依然以这 3 个分类为例,可以看到最终组成的 Function。其中返回值由系统随机生成,不需要关心。 +打招呼 Laf 常见问题 其他问题 const agentFunction = { name: agentFunName, description: &#39;判断用户问题的类型属于哪方面,返回对应的枚举字段&#39;, parameters: { type: &#39;object&#39;, properties: { type: { type: &#39;string&#39;, description: `打招呼,返回: abc;Laf 常见问题,返回:vvv;其他问题,返回:aaa` enum: [&#34;abc&#34;,&#34;vvv&#34;,&#34;aaa&#34;] } }, required: [&#39;type&#39;] } }; 上面的 Function 必然会返回 type = abc,vvv,aaa 其中一个值,从而实现分类判断。文本内容提取https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/content_extract/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/content_extract/特点 link 可重复添加 需要手动配置 触发执行 function_call 模块 核心模块 功能 link从文本中提取结构化数据,通常是配合 HTTP 模块实现扩展。也可以做一些直接提取操作,例如:翻译。 +参数说明 link提取要求描述 link顾名思义,给模型设置一个目标,需要提取哪些内容。 +示例 1 +你是实验室预约助手,从对话中提取出姓名,预约时间,实验室号。当前时间 {{cTime}} +示例 2 +你是谷歌搜索助手,从对话中提取出搜索关键词 +示例 3 +将我的问题直接翻译成英文,不要回答问题 +历史记录 link通常需要一些历史记录,才能更完整的提取用户问题。例如上图中需要提供姓名、时间和实验室名,用户可能一开始只给了时间和实验室名,没有提供自己的姓名。再经过一轮缺失提示后,用户输入了姓名,此时需要结合上一次的记录才能完整的提取出 3 个内容。 +目标字段 link目标字段与提取的结果相对应,从上图可以看到,每增加一个字段,输出会增加一个对应的出口。 +key: 字段的唯一标识,不可重复! 字段描述:描述该字段是关于什么的,例如:姓名、时间、搜索词等等。 必须:是否强制模型提取该字段,可能提取出来是空字符串。 输出介绍 link 完整提取结果: 一个 JSON 字符串,包含所有字段的提取结果。 目标字段提取结果:类型均为字符串。用户选择https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/user-selection/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/user-selection/特点 link 用户交互 可重复添加 触发执行 功能 link「用户选择」节点属于用户交互节点,当触发这个节点时,对话会进入“交互”状态,会记录工作流的状态,等用户完成交互后,继续向下执行工作流 +比如上图中的例子,当触发用户选择节点时,对话框隐藏,对话进入“交互状态” +当用户做出选择时,节点会判断用户的选择,执行“是”的分支 +作用 link基础的用法为提出需要用户做抉择的问题,然后根据用户的反馈设计不同的工作流流程表单输入https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/form_input/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/form_input/特点 link 用户交互 可重复添加 触发执行 功能 link「表单输入」节点属于用户交互节点,当触发这个节点时,对话会进入“交互”状态,会记录工作流的状态,等用户完成交互后,继续向下执行工作流 +比如上图中的例子,当触发表单输入节点时,对话框隐藏,对话进入“交互状态” +当用户填完必填的信息并点击提交后,节点能够收集用户填写的表单信息,传递到后续的节点中使用 +作用 link能够精准收集需要的用户信息,再根据用户信息进行后续操作文本拼接https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/text_editor/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/text_editor/特点 link 可重复添加 有外部输入 触发执行 手动配置 功能 link对输入文本进行固定加工处理,入参仅支持字符串和数字格式,入参以变量形式使用在文本编辑区域。 +根据上方示例图的处理方式,对任何输入都会在前面拼接“用户的问题是:”。 +作用 link给任意模块输入自定格式文本,或处理 AI 模块系统提示词。 +示例 link 接入谷歌搜索指定回复https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/reply/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/reply/特点 link 可重复添加(防止复杂编排时线太乱,重复添加可以更美观) 可手动输入 可外部输入 会输出结果给客户端 指定回复模块通常用户特殊状态回复,回复内容有两种: +一种是手动输入固定内容。 一种是通过变量引用。 图 1文档解析https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/document_parsing/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/document_parsing/ 开启文件上传后,可使用文档解析组件。 +功能 link作用 linkHTTP 请求https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/http/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/http/特点 link 可重复添加 手动配置 触发执行 核中核模块 介绍 linkHTTP 模块会向对应的地址发送一个 HTTP 请求,实际操作与 Postman 和 ApiFox 这类直流工具使用差不多。 +Params 为路径请求参数,GET请求中用的居多。 Body 为请求体,POST/PUT请求中用的居多。 Headers 为请求头,用于传递一些特殊的信息。 自定义变量中可以接收前方节点的输出作为变量 3 种数据中均可以通过 {{}} 来引用变量。 url 也可以通过 {{}} 来引用变量。 变量来自于全局变量、系统变量、前方节点输出 参数结构 link系统变量说明 link你可以将鼠标放置在请求参数旁边的问号中,里面会提示你可用的变量。 +appId: 应用的ID chatId: 当前对话的ID,测试模式下不存在。 responseChatItemId: 当前对话中,响应的消息ID,测试模式下不存在。 variables: 当前对话的全局变量。 cTime: 当前时间。 histories: 历史记录(默认最多取10条,无法修改长度) Params, Headers link不多描述,使用方法和Postman, ApiFox 基本一致。 +可通过 {{key}} 来引入变量。例如: +key value appId {{appId}} Authorization Bearer {{token}} Body link只有特定请求类型下会生效。 +可以写一个自定义的 Json,并通过 {{key}} 来引入变量。例如: +假设有一组变量 Http 模块中的Body声明 最终得到的解析 { &#34;string&#34;: &#34;字符串&#34;, &#34;number&#34;: 123, &#34;boolean&#34;: true, &#34;array&#34;: [1, 2, 3], &#34;obj&#34;: { &#34;name&#34;: &#34;FastGPT&#34;, &#34;url&#34;: &#34;https://tryfastgpt.判断器https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/tfswitch/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/tfswitch/特点 link 可重复添加 有外部输入 触发执行 功能 link对任意变量进行IF判断,若满足条件则执行IF分支,不满足条件执行ELSE分支。 +上述例子中若「知识库引用」变量的长度等于0则执行IF分支,否则执行ELSE分支。 +支持增加更多的判断条件和分支,同编程语言中的IF语句逻辑相同。 +作用 link适用场景有:让大模型做判断后输出固定内容,根据大模型回复内容判断是否触发后续模块。变量更新https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/variable_update/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/variable_update/特点 link 可重复添加 有外部输入 触发执行 手动配置 功能 link 更新指定节点的输出值 更新全局变量 作用 link最基础的使用场景为 +给一个「自定义变量」类型的全局变量赋值,从而实现全局变量无需用户输入 更新「变量更新」节点前的工作流节点输出,在后续使用中,使用的节点输出值为新的输出代码运行https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/sandbox/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/sandbox/功能 link可用于执行一段简单的 js 代码,用于进行一些复杂的数据处理。代码运行在沙盒中,无法进行网络请求、dom和异步操作。如需复杂操作,需外挂 HTTP 实现。 +注意事项 +私有化用户需要部署fastgpt-sandbox 镜像,并配置SANDBOX_URL环境变量。 沙盒最大运行 10s, 32M 内存限制。 变量输入 link可在自定义输入中添加代码运行需要的变量,在代码的 main 函数中,可解构出相同名字的变量。 +如上图,自定义输入中有 data1 和 data2 两个变量,main 函数中可以解构出相同名字的变量。 +结果输出 link务必返回一个 object 对象 +自定义输出中,可以添加变量名来获取 object 对应 key 下的值。例如上图中,返回了一个对象: +{ result: data1, data2 } 他有 2 个 key:result和 data2(js 缩写,key=data2,value=data2)。这时候自定义输出中就可以添加 2 个变量来获取对应 key 下的 value。 +内置 JS 全局变量 linkdelay 延迟 link延迟 1 秒后返回 +async function main({data1, data2}){ await delay(1000) return { result: &#34;111&#34; } } countToken 统计 token link function main({input}){ return { result: countToken(input) } } strToBase64 字符串转 base64(4.循环执行https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/loop/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/loop/节点概述 link【循环运行】节点是 FastGPT V4.8.11 版本新增的一个重要功能模块。它允许工作流对数组类型的输入数据进行迭代处理,每次处理数组中的一个元素,并自动执行后续节点,直到完成整个数组的处理。 +这个节点的设计灵感来自编程语言中的循环结构,但以可视化的方式呈现。 +在程序中,节点可以理解为一个个 Function 或者接口。可以理解为它就是一个步骤。将多个节点一个个拼接起来,即可一步步的去实现最终的 AI 输出。 +【循环运行】节点本质上也是一个 Function,它的主要职责是自动化地重复执行特定的工作流程。 +核心特性 link 数组批量处理 +支持输入数组类型数据 自动遍历数组元素 保持处理顺序 支持并行处理 (性能优化) 自动迭代执行 +自动触发后续节点 支持条件终止 支持循环计数 维护执行上下文 与其他节点协同 +支持与 AI 对话节点配合 支持与 HTTP 节点配合 支持与内容提取节点配合 支持与判断器节点配合 应用场景 link【循环运行】节点的主要作用是通过自动化的方式扩展工作流的处理能力,使 FastGPT 能够更好地处理批量任务和复杂的数据处理流程。特别是在处理大规模数据或需要多轮迭代的场景下,循环运行节点能显著提升工作流的效率和自动化程度。 +【循环运行】节点特别适合以下场景: +批量数据处理 +批量翻译文本 批量总结文档 批量生成内容 数据流水线处理 +对搜索结果逐条分析 对知识库检索结果逐条处理 对 HTTP 请求返回的数组数据逐项处理 递归或迭代任务 +长文本分段处理 多轮优化内容 链式数据处理 使用方法 link输入参数设置 link【循环运行】节点需要配置两个核心输入参数: +数组 (必填):接收一个数组类型的输入,可以是: +字符串数组 (Array&lt;string&gt;) 数字数组 (Array&lt;number&gt;) 布尔数组 (Array&lt;boolean&gt;) 对象数组 (Array&lt;object&gt;) 循环体 (必填):定义每次循环需要执行的节点流程,包含: +循环体开始:标记循环开始的位置。 循环体结束:标记循环结束的位置,并可选择输出结果变量。 循环体配置 link 在循环体内部,可以添加任意类型的节点,如:知识库搜索引用合并https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/knowledge_base_search_merge/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/knowledge_base_search_merge/ 作用 link将多个知识库搜索结果合并成一个结果进行输出,并会通过 RRF 进行重新排序(根据排名情况),并且支持最大 tokens 过滤。 +使用方法 linkAI对话只能接收一个知识库引用内容。因此,如果调用了多个知识库,无法直接引用所有知识库(如下图) +使用知识库搜索引用合并,可以把多个知识库的搜索结果合在一起。 +可用例子: link 经过问题分类后对不同知识库进行检索,然后统一给一个 AI 进行回答,此时可以用到合并,不需要每个分支都添加一个 AI 对话。问题优化https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/coreferenceresolution/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/coreferenceresolution/特点 link 可重复添加 有外部输入 触发执行 背景 link在 RAG 中,我们需要根据输入的问题去数据库里执行 embedding 搜索,查找相关的内容,从而查找到相似的内容(简称知识库搜索)。 +在搜索的过程中,尤其是连续对话的搜索,我们通常会发现后续的问题难以搜索到合适的内容,其中一个原因是知识库搜索只会使用“当前”的问题去执行。看下面的例子: +用户在提问“第二点是什么”的时候,只会去知识库里查找“第二点是什么”,压根查不到内容。实际上需要查询的是“QA结构是什么”。因此我们需要引入一个【问题优化】模块,来对用户当前的问题进行补全,从而使得知识库搜索能够搜索到合适的内容。使用补全后效果如下: +功能 link调用 AI 去对用户当前的问题进行补全。目前主要是补全“指代”词,使得检索词更加的完善可靠,从而增强上下文连续对话的知识库搜索能力。 +遇到最大的难题在于:模型对于【补全】的概念可能不清晰,且对于长上下文往往无法准确的知道应该如何补全。 +示例 link 接入谷歌搜索Laf 函数调用https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/laf/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/laf/介绍 linkLaf 函数调用模块可以调用 Laf 账号下的云函数,其工作原理与 HTTP 模块相同,有以下特殊特征: +只能使用 POST 请求 请求自带系统参数 systemParams,无需通过变量传递。 绑定 Laf 账号 link要调用 Laf 云函数,首先需要绑定 Laf 账号和应用,并且在应用中创建云函数。 +Laf 提供了 PAT(访问凭证) 来实现 Laf 平台外的快捷登录,可以访问 Laf 文档查看详细如何获取 PAT。 +在获取到 PAT 后,我们可以进入 FastGPT 的账号页或是在高级编排中的 Laf模块 对 Laf 账号进行绑定。Laf 账号是团队共享的,仅团队管理员可配置。 +填入 PAT 验证后,选择需要绑定的应用(应用需要是 Running 状态),即可调用该应用下的云函数。 +编写云函数 linkLaf 云函数拥有根据 interface 自动生成 OpenAPI 的能力,可以参照下面的代码编写云函数,以便自动生成 OpenAPI 文档。 +Laf模块可以根据 OpenAPI 文档,自动识别出入参,无需手动添加数据类型。如果不会写 TS,可忽略,手动在 FastGPT 中添加参数即可。 +import cloud from &#39;@lafjs/cloud&#39; interface IRequestBody { // 自定义入参,FastGPT 传入的均为POST请求。 data1: string // 必填参数 data2?自定义反馈https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/custom_feedback/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/custom_feedback/该模块为临时模块,后续会针对该模块进行更全面的设计。 +特点 link 可重复添加 无外部输入 自动执行 介绍 link自定义反馈模块,可以为你的对话增加一个反馈标记,从而方便在后台更好的分析对话的数据。 +在调试模式下,不会记录反馈内容,而是直接提示: 自动反馈测试: 反馈内容。 +在对话模式(对话、分享窗口、带 chatId 的 API 调用)时,会将反馈内容记录到对话日志中。(会延迟60s记录) +作用 link自定义反馈模块的功能类似于程序开发的埋点,便于你观测的对话中的数据。 \ No newline at end of file diff --git a/docs/guide/workbench/workflow/knowledge_base_search_merge/index.html b/docs/guide/workbench/workflow/knowledge_base_search_merge/index.html new file mode 100644 index 000000000000..458eaaddd89a --- /dev/null +++ b/docs/guide/workbench/workflow/knowledge_base_search_merge/index.html @@ -0,0 +1,44 @@ +知识库搜索引用合并 | FastGPT
+
知识库搜索引用合并
knowledge_merge

知识库搜索引用合并

FastGPT 知识库搜索引用合并模块介绍

作用

将多个知识库搜索结果合并成一个结果进行输出,并会通过 RRF 进行重新排序(根据排名情况),并且支持最大 tokens 过滤。

使用方法

AI对话只能接收一个知识库引用内容。因此,如果调用了多个知识库,无法直接引用所有知识库(如下图)

使用知识库搜索引用合并,可以把多个知识库的搜索结果合在一起。

可用例子:

  1. 经过问题分类后对不同知识库进行检索,然后统一给一个 AI 进行回答,此时可以用到合并,不需要每个分支都添加一个 AI 对话。
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/laf/index.html b/docs/guide/workbench/workflow/laf/index.html new file mode 100644 index 000000000000..a9fc1eed04bd --- /dev/null +++ b/docs/guide/workbench/workflow/laf/index.html @@ -0,0 +1,86 @@ +Laf 函数调用 | FastGPT
+
code

Laf 函数调用

FastGPT Laf 函数调用模块介绍

介绍

Laf 函数调用模块可以调用 Laf 账号下的云函数,其工作原理与 HTTP 模块相同,有以下特殊特征:

  • 只能使用 POST 请求
  • 请求自带系统参数 systemParams,无需通过变量传递。

绑定 Laf 账号

要调用 Laf 云函数,首先需要绑定 Laf 账号和应用,并且在应用中创建云函数。

Laf 提供了 PAT(访问凭证) 来实现 Laf 平台外的快捷登录,可以访问 Laf 文档查看详细如何获取 PAT。

在获取到 PAT 后,我们可以进入 FastGPT 的账号页或是在高级编排中的 Laf模块 对 Laf 账号进行绑定。Laf 账号是团队共享的,仅团队管理员可配置。

填入 PAT 验证后,选择需要绑定的应用(应用需要是 Running 状态),即可调用该应用下的云函数。

编写云函数

Laf 云函数拥有根据 interface 自动生成 OpenAPI 的能力,可以参照下面的代码编写云函数,以便自动生成 OpenAPI 文档。

Laf模块可以根据 OpenAPI 文档,自动识别出入参,无需手动添加数据类型。如果不会写 TS,可忽略,手动在 FastGPT 中添加参数即可。

+  import cloud from '@lafjs/cloud'
+
+interface IRequestBody { // 自定义入参,FastGPT 传入的均为POST请求。
+  data1: string    // 必填参数
+  data2?: string    // 可选参数
+}
+
+interface RequestProps extends IRequestBody { // 完整入参,这个无需改动。
+  systemParams: { // 这是FastGPT默认会传递过来的参数
+    appId: string,
+    variables: string,
+    histories: string,
+    cTime: string,
+    chatId: string,
+    responseChatItemId: string
+  }
+}
+
+interface IResponse { // 响应内容
+  message: string // 必返回的参数
+  msg?: string; // 可选的返回参数
+}
+
+export default async function (ctx: FunctionContext): Promise<IResponse> {  
+  const {
+    data1,
+    data2,
+    systemParams
+  }: RequestProps = ctx.body;
+  
+  console.log({
+    data1,
+    data2,
+    systemParams
+  });
+
+  return { 
+    message: 'ok',
+    msg: 'msg'
+  };
+}
+  

当然,你也可以在 Laf 平台上选择 fastgpt_template,快速生成该函数模板。

具体操作可以是,进入 Laf 的函数页面,新建函数(注意 fastgpt 只会调用 post 请求的函数),然后复制上面的代码或者点击更多模板搜索“fastgpt”,使用下面的模板

FastGPT 中使用

在选择函数后,可以通过点击“同步参数”,自动同步云函数的参数到 FastGPT 中。当然也可以手动添加,手动修改后的参数不会被“同步参数”修改。

使用注意事项

调用报错

先在 laf 中调试函数,看是否正常调用。可以通过 console.log,打印入参,将入参放在 Laf 测试页面的 Body 中进行测试。

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/loop/index.html b/docs/guide/workbench/workflow/loop/index.html new file mode 100644 index 000000000000..8383e1c76a48 --- /dev/null +++ b/docs/guide/workbench/workflow/loop/index.html @@ -0,0 +1,174 @@ +循环执行 | FastGPT
+
input

循环执行

FastGPT 循环运行节点介绍和使用

节点概述

循环运行】节点是 FastGPT V4.8.11 版本新增的一个重要功能模块。它允许工作流对数组类型的输入数据进行迭代处理,每次处理数组中的一个元素,并自动执行后续节点,直到完成整个数组的处理。

这个节点的设计灵感来自编程语言中的循环结构,但以可视化的方式呈现。

循环运行节点

在程序中,节点可以理解为一个个 Function 或者接口。可以理解为它就是一个步骤。将多个节点一个个拼接起来,即可一步步的去实现最终的 AI 输出。

循环运行】节点本质上也是一个 Function,它的主要职责是自动化地重复执行特定的工作流程。

核心特性

  1. 数组批量处理

    • 支持输入数组类型数据
    • 自动遍历数组元素
    • 保持处理顺序
    • 支持并行处理 (性能优化)
  2. 自动迭代执行

    • 自动触发后续节点
    • 支持条件终止
    • 支持循环计数
    • 维护执行上下文
  3. 与其他节点协同

    • 支持与 AI 对话节点配合
    • 支持与 HTTP 节点配合
    • 支持与内容提取节点配合
    • 支持与判断器节点配合

应用场景

循环运行】节点的主要作用是通过自动化的方式扩展工作流的处理能力,使 FastGPT 能够更好地处理批量任务和复杂的数据处理流程。特别是在处理大规模数据或需要多轮迭代的场景下,循环运行节点能显著提升工作流的效率和自动化程度。

循环运行】节点特别适合以下场景:

  1. 批量数据处理

    • 批量翻译文本
    • 批量总结文档
    • 批量生成内容
  2. 数据流水线处理

    • 对搜索结果逐条分析
    • 对知识库检索结果逐条处理
    • 对 HTTP 请求返回的数组数据逐项处理
  3. 递归或迭代任务

    • 长文本分段处理
    • 多轮优化内容
    • 链式数据处理

使用方法

输入参数设置

循环运行】节点需要配置两个核心输入参数:

  1. 数组 (必填):接收一个数组类型的输入,可以是:

    • 字符串数组 (Array<string>)
    • 数字数组 (Array<number>)
    • 布尔数组 (Array<boolean>)
    • 对象数组 (Array<object>)
  2. 循环体 (必填):定义每次循环需要执行的节点流程,包含:

    • 循环体开始:标记循环开始的位置。
    • 循环体结束:标记循环结束的位置,并可选择输出结果变量。

循环体配置

循环体配置

  1. 在循环体内部,可以添加任意类型的节点,如:

    • AI 对话节点
    • HTTP 请求节点
    • 内容提取节点
    • 文本加工节点等
  2. 循环体结束节点配置:

    • 通过下拉菜单选择要输出的变量
    • 该变量将作为当前循环的结果被收集
    • 所有循环的结果将组成一个新的数组作为最终输出

场景示例

批量处理数组

假设我们有一个包含多个文本的数组,需要对每个文本进行 AI 处理。这是循环运行节点最基础也最常见的应用场景。

实现步骤

  1. 准备输入数组

    准备输入数组

    使用【代码运行】节点创建测试数组:

    +  const texts = [
    +  "这是第一段文本",
    +  "这是第二段文本",
    +  "这是第三段文本"
    +];
    +return { textArray: texts };
    +  
  2. 配置循环运行节点

    配置循环运行节点

    • 数组输入:选择上一步代码运行节点的输出变量 textArray
    • 循环体内添加一个【AI 对话】节点,用于处理每个文本。这里我们输入的 prompt 为:请将这段文本翻译成英文
    • 再添加一个【指定回复】节点,用于输出翻译后的文本。
    • 循环体结束节点选择输出变量为 AI 回复内容。

运行流程

运行流程

  1. 【代码运行】节点执行,生成测试数组
  2. 【循环运行】节点接收数组,开始遍历
  3. 对每个数组元素:
    • 【AI 对话】节点处理当前元素
    • 【指定回复】节点输出翻译后的文本
    • 【循环体结束】节点收集处理结果
  4. 完成所有元素处理后,输出结果数组

长文本翻译

在处理长文本翻译时,我们经常会遇到以下挑战:

  • 文本长度超出 LLM 的 token 限制
  • 需要保持翻译风格的一致性
  • 需要维护上下文的连贯性
  • 翻译质量需要多轮优化

循环运行】节点可以很好地解决这些问题。

实现步骤

  1. 文本预处理与分段

    文本预处理与分段

    使用【代码运行】节点进行文本分段,代码如下:

    +  const MAX_HEADING_LENGTH = 7; // 最大标题长度
    +const MAX_HEADING_CONTENT_LENGTH = 200; // 最大标题内容长度
    +const MAX_HEADING_UNDERLINE_LENGTH = 200; // 最大标题下划线长度
    +const MAX_HTML_HEADING_ATTRIBUTES_LENGTH = 100; // 最大HTML标题属性长度
    +const MAX_LIST_ITEM_LENGTH = 200; // 最大列表项长度
    +const MAX_NESTED_LIST_ITEMS = 6; // 最大嵌套列表项数
    +const MAX_LIST_INDENT_SPACES = 7; // 最大列表缩进空格数
    +const MAX_BLOCKQUOTE_LINE_LENGTH = 200; // 最大块引用行长度
    +const MAX_BLOCKQUOTE_LINES = 15; // 最大块引用行数
    +const MAX_CODE_BLOCK_LENGTH = 1500; // 最大代码块长度
    +const MAX_CODE_LANGUAGE_LENGTH = 20; // 最大代码语言长度
    +const MAX_INDENTED_CODE_LINES = 20; // 最大缩进代码行数
    +const MAX_TABLE_CELL_LENGTH = 200; // 最大表格单元格长度
    +const MAX_TABLE_ROWS = 20; // 最大表格行数
    +const MAX_HTML_TABLE_LENGTH = 2000; // 最大HTML表格长度
    +const MIN_HORIZONTAL_RULE_LENGTH = 3; // 最小水平分隔线长度
    +const MAX_SENTENCE_LENGTH = 400; // 最大句子长度
    +const MAX_QUOTED_TEXT_LENGTH = 300; // 最大引用文本长度
    +const MAX_PARENTHETICAL_CONTENT_LENGTH = 200; // 最大括号内容长度
    +const MAX_NESTED_PARENTHESES = 5; // 最大嵌套括号数
    +const MAX_MATH_INLINE_LENGTH = 100; // 最大行内数学公式长度
    +const MAX_MATH_BLOCK_LENGTH = 500; // 最大数学公式块长度
    +const MAX_PARAGRAPH_LENGTH = 1000; // 最大段落长度
    +const MAX_STANDALONE_LINE_LENGTH = 800; // 最大独立行长度
    +const MAX_HTML_TAG_ATTRIBUTES_LENGTH = 100; // 最大HTML标签属性长度
    +const MAX_HTML_TAG_CONTENT_LENGTH = 1000; // 最大HTML标签内容长度
    +const LOOKAHEAD_RANGE = 100;  // 向前查找句子边界的字符数
    +
    +const AVOID_AT_START = `[\\s\\]})>,']`; // 避免在开头匹配的字符
    +const PUNCTUATION = `[.!?…]|\\.{3}|[\\u2026\\u2047-\\u2049]|[\\p{Emoji_Presentation}\\p{Extended_Pictographic}]`; // 标点符号
    +const QUOTE_END = `(?:'(?=\`)|''(?=\`\`))`; // 引号结束
    +const SENTENCE_END = `(?:${PUNCTUATION}(?<!${AVOID_AT_START}(?=${PUNCTUATION}))|${QUOTE_END})(?=\\S|$)`; // 句子结束
    +const SENTENCE_BOUNDARY = `(?:${SENTENCE_END}|(?=[\\r\\n]|$))`; // 句子边界
    +const LOOKAHEAD_PATTERN = `(?:(?!${SENTENCE_END}).){1,${LOOKAHEAD_RANGE}}${SENTENCE_END}`; // 向前查找句子结束的模式
    +const NOT_PUNCTUATION_SPACE = `(?!${PUNCTUATION}\\s)`; // 非标点符号空格
    +const SENTENCE_PATTERN = `${NOT_PUNCTUATION_SPACE}(?:[^\\r\\n]{1,{MAX_LENGTH}}${SENTENCE_BOUNDARY}|[^\\r\\n]{1,{MAX_LENGTH}}(?=${PUNCTUATION}|$   {QUOTE_END})(?:${LOOKAHEAD_PATTERN})?)${AVOID_AT_START}*`; // 句子模式
    +
    +const regex = new RegExp(
    +  "(" +
    +  // 1. Headings (Setext-style, Markdown, and HTML-style, with length constraints)
    +  `(?:^(?:[#*=-]{1,${MAX_HEADING_LENGTH}}|\\w[^\\r\\n]{0,${MAX_HEADING_CONTENT_LENGTH}}\\r?\\n[-=]{2,${MAX_HEADING_UNDERLINE_LENGTH}}|<h[1-6][^>]   {0,${MAX_HTML_HEADING_ATTRIBUTES_LENGTH}}>)[^\\r\\n]{1,${MAX_HEADING_CONTENT_LENGTH}}(?:</h[1-6]>)?(?:\\r?\\n|$))` +
    +  "|" +
    +  // New pattern for citations
    +  `(?:\\[[0-9]+\\][^\\r\\n]{1,${MAX_STANDALONE_LINE_LENGTH}})` +
    +  "|" +
    +  // 2. List items (bulleted, numbered, lettered, or task lists, including nested, up to three levels, with length constraints)
    +  `(?:(?:^|\\r?\\n)[ \\t]{0,3}(?:[-*+•]|\\d{1,3}\\.\\w\\.|\\[[ xX]\\])[ \\t]+${SENTENCE_PATTERN.replace(/{MAX_LENGTH}/g, String   (MAX_LIST_ITEM_LENGTH))}` +
    +  `(?:(?:\\r?\\n[ \\t]{2,5}(?:[-*+•]|\\d{1,3}\\.\\w\\.|\\[[ xX]\\])[ \\t]+${SENTENCE_PATTERN.replace(/{MAX_LENGTH}/g, String   (MAX_LIST_ITEM_LENGTH))}){0,${MAX_NESTED_LIST_ITEMS}}` +
    +  `(?:\\r?\\n[ \\t]{4,${MAX_LIST_INDENT_SPACES}}(?:[-*+•]|\\d{1,3}\\.\\w\\.|\\[[ xX]\\])[ \\t]+${SENTENCE_PATTERN.replace(/{MAX_LENGTH}/g, String   (MAX_LIST_ITEM_LENGTH))}){0,${MAX_NESTED_LIST_ITEMS}})?)` +
    +  "|" +
    +  // 3. Block quotes (including nested quotes and citations, up to three levels, with length constraints)
    +  `(?:(?:^>(?:>|\\s{2,}){0,2}${SENTENCE_PATTERN.replace(/{MAX_LENGTH}/g, String(MAX_BLOCKQUOTE_LINE_LENGTH))}\\r?\\n?){1,$   {MAX_BLOCKQUOTE_LINES}})` +
    +  "|" +
    +  // 4. Code blocks (fenced, indented, or HTML pre/code tags, with length constraints)
    +  `(?:(?:^|\\r?\\n)(?:\`\`\`|~~~)(?:\\w{0,${MAX_CODE_LANGUAGE_LENGTH}})?\\r?\\n[\\s\\S]{0,${MAX_CODE_BLOCK_LENGTH}}?(?:\`\`\`|~~~)\\r?\\n?` +
    +  `|(?:(?:^|\\r?\\n)(?: {4}|\\t)[^\\r\\n]{0,${MAX_LIST_ITEM_LENGTH}}(?:\\r?\\n(?: {4}|\\t)[^\\r\\n]{0,${MAX_LIST_ITEM_LENGTH}}){0,$   {MAX_INDENTED_CODE_LINES}}\\r?\\n?)` +
    +  `|(?:<pre>(?:<code>)?[\\s\\S]{0,${MAX_CODE_BLOCK_LENGTH}}?(?:</code>)?</pre>))` +
    +  "|" +
    +  // 5. Tables (Markdown, grid tables, and HTML tables, with length constraints)
    +  `(?:(?:^|\\r?\\n)(?:\\|[^\\r\\n]{0,${MAX_TABLE_CELL_LENGTH}}\\|(?:\\r?\\n\\|[-:]{1,${MAX_TABLE_CELL_LENGTH}}\\|){0,1}(?:\\r?\\n\\|[^\\r\\n]{0,$   {MAX_TABLE_CELL_LENGTH}}\\|){0,${MAX_TABLE_ROWS}}` +
    +  `|<table>[\\s\\S]{0,${MAX_HTML_TABLE_LENGTH}}?</table>))` +
    +  "|" +
    +  // 6. Horizontal rules (Markdown and HTML hr tag)
    +  `(?:^(?:[-*_]){${MIN_HORIZONTAL_RULE_LENGTH},}\\s*$|<hr\\s*/?>)` +
    +  "|" +
    +  // 10. Standalone lines or phrases (including single-line blocks and HTML elements, with length constraints)
    +  `(?!${AVOID_AT_START})(?:^(?:<[a-zA-Z][^>]{0,${MAX_HTML_TAG_ATTRIBUTES_LENGTH}}>)?${SENTENCE_PATTERN.replace(/{MAX_LENGTH}/g, String   (MAX_STANDALONE_LINE_LENGTH))}(?:</[a-zA-Z]+>)?(?:\\r?\\n|$))` +
    +  "|" +
    +  // 7. Sentences or phrases ending with punctuation (including ellipsis and Unicode punctuation)
    +  `(?!${AVOID_AT_START})${SENTENCE_PATTERN.replace(/{MAX_LENGTH}/g, String(MAX_SENTENCE_LENGTH))}` +
    +  "|" +
    +  // 8. Quoted text, parenthetical phrases, or bracketed content (with length constraints)
    +  "(?:" +
    +  `(?<!\\w)\"\"\"[^\"]{0,${MAX_QUOTED_TEXT_LENGTH}}\"\"\"(?!\\w)` +
    +  `|(?<!\\w)(?:['\"\`'"])[^\\r\\n]{0,${MAX_QUOTED_TEXT_LENGTH}}\\1(?!\\w)` +
    +  `|(?<!\\w)\`[^\\r\\n]{0,${MAX_QUOTED_TEXT_LENGTH}}'(?!\\w)` +
    +  `|(?<!\\w)\`\`[^\\r\\n]{0,${MAX_QUOTED_TEXT_LENGTH}}''(?!\\w)` +
    +  `|\\([^\\r\\n()]{0,${MAX_PARENTHETICAL_CONTENT_LENGTH}}(?:\\([^\\r\\n()]{0,${MAX_PARENTHETICAL_CONTENT_LENGTH}}\\)[^\\r\\n()]{0,$   {MAX_PARENTHETICAL_CONTENT_LENGTH}}){0,${MAX_NESTED_PARENTHESES}}\\)` +
    +  `|\\[[^\\r\\n\\[\\]]{0,${MAX_PARENTHETICAL_CONTENT_LENGTH}}(?:\\[[^\\r\\n\\[\\]]{0,${MAX_PARENTHETICAL_CONTENT_LENGTH}}\\][^\\r\\n\\[\\]]{0,$   {MAX_PARENTHETICAL_CONTENT_LENGTH}}){0,${MAX_NESTED_PARENTHESES}}\\]` +
    +  `|\\$[^\\r\\n$]{0,${MAX_MATH_INLINE_LENGTH}}\\$` +
    +  `|\`[^\`\\r\\n]{0,${MAX_MATH_INLINE_LENGTH}}\`` +
    +  ")" +
    +  "|" +
    +  // 9. Paragraphs (with length constraints)
    +  `(?!${AVOID_AT_START})(?:(?:^|\\r?\\n\\r?\\n)(?:<p>)?${SENTENCE_PATTERN.replace(/{MAX_LENGTH}/g, String(MAX_PARAGRAPH_LENGTH))}(?:</p>)?(?=\\r?   \\n\\r?\\n|$))` +
    +  "|" +
    +  // 11. HTML-like tags and their content (including self-closing tags and attributes, with length constraints)
    +  `(?:<[a-zA-Z][^>]{0,${MAX_HTML_TAG_ATTRIBUTES_LENGTH}}(?:>[\\s\\S]{0,${MAX_HTML_TAG_CONTENT_LENGTH}}?</[a-zA-Z]+>|\\s*/>))` +
    +  "|" +
    +  // 12. LaTeX-style math expressions (inline and block, with length constraints)
    +  `(?:(?:\\$\\$[\\s\\S]{0,${MAX_MATH_BLOCK_LENGTH}}?\\$\\$)|(?:\\$[^\\$\\r\\n]{0,${MAX_MATH_INLINE_LENGTH}}\\$))` +
    +  "|" +
    +  // 14. Fallback for any remaining content (with length constraints)
    +  `(?!${AVOID_AT_START})${SENTENCE_PATTERN.replace(/{MAX_LENGTH}/g, String(MAX_STANDALONE_LINE_LENGTH))}` +
    +  ")",
    +  "gmu"
    +);
    +
    +function main({text}){
    +  const chunks = [];
    +  let currentChunk = '';
    +  const tokens = countToken(text)
    +
    +  const matches = text.match(regex);
    +  if (matches) {
    +    matches.forEach((match) => {
    +      if (currentChunk.length + match.length <= 1000) {
    +        currentChunk += match;
    +      } else {
    +        if (currentChunk) {
    +          chunks.push(currentChunk);
    +        }
    +        currentChunk = match;
    +      }
    +    });
    +    if (currentChunk) {
    +      chunks.push(currentChunk);
    +    }
    +  }
    +
    +  return {chunks, tokens};
    +}
    +  

    这里我们用到了 Jina AI 开源的一个强大的正则表达式,它能利用所有可能的边界线索和启发式方法来精确切分文本。

  2. 配置循环运行节点

    配置循环运行节点

    • 数组输入:选择上一步代码运行节点的输出变量 chunks
    • 循环体内添加一个【代码运行】节点,对源文本进行格式化。
    • 添加一个【搜索词库】节点,将专有名词的词库作为知识库,在翻译前进行搜索。
    • 添加一个【AI 对话】节点,使用 CoT 思维链,让 LLM 显式地、系统地生成推理链条,展示翻译的完整思考过程。
    • 添加一个【代码运行】节点,将【AI 对话】节点最后一轮的翻译结果提取出来。
    • 添加一个【指定回复】节点,输出翻译后的文本。
    • 循环体结束节点选择输出变量为【取出翻译文本】的输出变量 result
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/question_classify/index.html b/docs/guide/workbench/workflow/question_classify/index.html new file mode 100644 index 000000000000..65f7018c443d --- /dev/null +++ b/docs/guide/workbench/workflow/question_classify/index.html @@ -0,0 +1,66 @@ +问题分类 | FastGPT
+
quiz

问题分类

FastGPT 问题分类模块介绍

特点

  • 可重复添加
  • 有外部输入
  • 需要手动配置
  • 触发执行
  • function_call 模块

功能

可以将用户的问题进行分类,分类后执行不同操作。在一些较模糊的场景中,分类效果不是很明显。

参数说明

系统提示词

被放置在对话最前面,可用于补充说明分类内容的定义。例如问题会被分为:

  1. 打招呼
  2. Laf 常见问题
  3. 其他问题

由于 Laf 不是一个明确的东西,需要给它一个定义,此时提示词里可以填入 Laf 的定义:

+  Laf 是云开发平台,可以快速的开发应用
+Laf 是一个开源的 BaaS 开发平台(Backend as a Service)
+Laf 是一个开箱即用的 serverless 开发平台
+Laf 是一个集「函数计算」、「数据库」、「对象存储」等于一身的一站式开发平台
+Laf 可以是开源版的腾讯云开发、开源版的 Google Firebase、开源版的 UniCloud
+  

聊天记录

适当增加一些聊天记录,可以联系上下文进行分类。

用户问题

用户输入的内容。

分类内容

依然以这 3 个分类为例,可以看到最终组成的 Function。其中返回值由系统随机生成,不需要关心。

  1. 打招呼
  2. Laf 常见问题
  3. 其他问题
+  const agentFunction = {
+    name: agentFunName,
+    description: '判断用户问题的类型属于哪方面,返回对应的枚举字段',
+    parameters: {
+      type: 'object',
+      properties: {
+        type: {
+          type: 'string',
+          description: `打招呼,返回: abc;Laf 常见问题,返回:vvv;其他问题,返回:aaa`
+          enum: ["abc","vvv","aaa"]
+        }
+      },
+      required: ['type']
+    }
+};
+  

上面的 Function 必然会返回 type = abc,vvv,aaa 其中一个值,从而实现分类判断。

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/reply/index.html b/docs/guide/workbench/workflow/reply/index.html new file mode 100644 index 000000000000..7bc2e2d33212 --- /dev/null +++ b/docs/guide/workbench/workflow/reply/index.html @@ -0,0 +1,44 @@ +指定回复 | FastGPT
+
指定回复
reply

指定回复

FastGPT 指定回复模块介绍

特点

  • 可重复添加(防止复杂编排时线太乱,重复添加可以更美观)
  • 可手动输入
  • 可外部输入
  • 会输出结果给客户端

指定回复模块通常用户特殊状态回复,回复内容有两种:

  1. 一种是手动输入固定内容。
  2. 一种是通过变量引用。
图 1
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/sandbox/index.html b/docs/guide/workbench/workflow/sandbox/index.html new file mode 100644 index 000000000000..74920cda2db8 --- /dev/null +++ b/docs/guide/workbench/workflow/sandbox/index.html @@ -0,0 +1,81 @@ +代码运行 | FastGPT
+
input

代码运行

FastGPT 代码运行节点介绍

alt text

功能

可用于执行一段简单的 js 代码,用于进行一些复杂的数据处理。代码运行在沙盒中,无法进行网络请求、dom和异步操作。如需复杂操作,需外挂 HTTP 实现。

注意事项

  • 私有化用户需要部署fastgpt-sandbox 镜像,并配置SANDBOX_URL环境变量。
  • 沙盒最大运行 10s, 32M 内存限制。

变量输入

可在自定义输入中添加代码运行需要的变量,在代码的 main 函数中,可解构出相同名字的变量。

如上图,自定义输入中有 data1 和 data2 两个变量,main 函数中可以解构出相同名字的变量。

结果输出

务必返回一个 object 对象

自定义输出中,可以添加变量名来获取 object 对应 key 下的值。例如上图中,返回了一个对象:

+  {
+  result: data1,
+  data2
+}
+  

他有 2 个 key:result和 data2(js 缩写,key=data2,value=data2)。这时候自定义输出中就可以添加 2 个变量来获取对应 key 下的 value。

内置 JS 全局变量

delay 延迟

延迟 1 秒后返回

+  async function main({data1, data2}){
+    await delay(1000)
+    return {
+        result: "111"
+    }
+}
+  

countToken 统计 token

+  function main({input}){
+    return {
+        result: countToken(input)
+    }
+}
+  

alt text

strToBase64 字符串转 base64(4.8.11 版本新增)

可用于将 SVG 图片转换为 base64 格式展示。

+  function main({input}){
+     
+    return {
+        /* 
+            param1: input 需要转换的字符串
+            param2: base64 prefix 前缀
+        */
+        result: strToBase64(input,'data:image/svg+xml;base64,')
+    }
+}
+  

alt text

createHmac 加密

与 node 中 crypto 的 createHmac 方法一致。

+  function main({secret}){
+    const {sign,timestamp} = createHmac('sha256',secret)
+
+    return {
+        sign,timestamp
+    }
+}
+  
+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/text_editor/index.html b/docs/guide/workbench/workflow/text_editor/index.html new file mode 100644 index 000000000000..055b70bda07d --- /dev/null +++ b/docs/guide/workbench/workflow/text_editor/index.html @@ -0,0 +1,44 @@ +文本拼接 | FastGPT
+
input

文本拼接

FastGPT 文本加工模块介绍

特点

  • 可重复添加
  • 有外部输入
  • 触发执行
  • 手动配置

功能

对输入文本进行固定加工处理,入参仅支持字符串和数字格式,入参以变量形式使用在文本编辑区域。

根据上方示例图的处理方式,对任何输入都会在前面拼接“用户的问题是:”。

作用

给任意模块输入自定格式文本,或处理 AI 模块系统提示词。

示例

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/tfswitch/index.html b/docs/guide/workbench/workflow/tfswitch/index.html new file mode 100644 index 000000000000..006246f015c2 --- /dev/null +++ b/docs/guide/workbench/workflow/tfswitch/index.html @@ -0,0 +1,44 @@ +判断器 | FastGPT
+
input

判断器

FastGPT 判断器模块介绍

特点

  • 可重复添加
  • 有外部输入
  • 触发执行

功能

对任意变量进行IF判断,若满足条件则执行IF分支,不满足条件执行ELSE分支。

上述例子中若「知识库引用」变量的长度等于0则执行IF分支,否则执行ELSE分支。

支持增加更多的判断条件和分支,同编程语言中的IF语句逻辑相同。

作用

适用场景有:让大模型做判断后输出固定内容,根据大模型回复内容判断是否触发后续模块。

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/tool/index.html b/docs/guide/workbench/workflow/tool/index.html new file mode 100644 index 000000000000..39690f903eb9 --- /dev/null +++ b/docs/guide/workbench/workflow/tool/index.html @@ -0,0 +1,45 @@ +工具调用&终止 | FastGPT
+
build

工具调用&终止

FastGPT 工具调用模块介绍

什么是工具

工具可以是一个系统模块,例如:AI对话、知识库搜索、HTTP模块等。也可以是一个插件。

工具调用可以让 LLM 更动态的决策流程,而不都是固定的流程。(当然,缺点就是费tokens)

工具的组成

  1. 工具介绍。通常是模块的介绍或插件的介绍,这个介绍会告诉LLM,这个工具的作用是什么。
  2. 工具参数。对于系统模块来说,工具参数已经是固定的,无需额外配置。对于插件来说,工具参数是一个可配置项。

工具是如何运行的

要了解工具如何运行的,首先需要知道它的运行条件。

  1. 需要工具的介绍(或者叫描述)。这个介绍会告诉LLM,这个工具的作用是什么,LLM会根据上下文语义,决定是否需要调用这个工具。
  2. 工具的参数。有些工具调用时,可能需要一些特殊的参数。参数中有2个关键的值:参数介绍是否必须

结合工具的介绍、参数介绍和参数是否必须,LLM会决定是否调用这个工具。有以下几种情况:

  1. 无参数的工具:直接根据工具介绍,决定是否需要执行。例如:获取当前时间。
  2. 有参数的工具:
    1. 无必须的参数:尽管上下文中,没有适合的参数,也可以调用该工具。但有时候,LLM会自己伪造一个参数。
    2. 有必须的参数:如果没有适合的参数,LLM可能不会调用该工具。可以通过提示词,引导用户提供参数。

工具调用逻辑

在支持函数调用的模型中,可以一次性调用多个工具,调用逻辑如下:

怎么用

工具调用模块示例 3 +工具调用模块示例 4

高级编排中,拖动工具调用的连接点,可用的工具头部会出现一个菱形,可以将它与工具调用模块底部的菱形相连接。

被连接的工具,会自动分离工具输入与普通的输入,并且可以编辑介绍,可以通过调整介绍,使得该工具调用时机更加精确。

关于工具调用,如何调试仍然是一个玄学,所以建议,不要一次性增加太多工具,选择少量工具调优后再进一步尝试。

用途

默认情况下,工具调用节点,在决定调用工具后,会将工具运行的结果,返回给AI,让 AI 对工具运行的结果进行总结输出。有时候,如果你不需要 AI 进行进一步的总结输出,可以使用该节点,将其接入对于工具流程的末尾。

如下图,在执行知识库搜索后,发送给了 HTTP 请求,搜索将不会返回搜索的结果给工具调用进行 AI 总结。

附加节点

当您使用了工具调用节点,同时就会出现工具调用终止节点和自定义变量节点,能够进一步提升工具调用的使用体验。

工具调用终止

工具调用终止可用于结束本次调用,即可以接在某个工具后面,当工作流执行到这个节点时,便会强制结束本次工具调用,不再调用其他工具,也不会再调用 AI 针对工具调用结果回答问题。

自定义工具变量

自定义变量可以扩展工具的变量输入,即对于一些未被视作工具参数或无法工具调用的节点,可以自定义工具变量,填上对应的参数描述,那么工具调用便会相对应的调用这个节点,进而调用其之后的工作流。

相关示例

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/user-selection/index.html b/docs/guide/workbench/workflow/user-selection/index.html new file mode 100644 index 000000000000..52a807b8c2b6 --- /dev/null +++ b/docs/guide/workbench/workflow/user-selection/index.html @@ -0,0 +1,44 @@ +用户选择 | FastGPT
+
用户选择
user_check

用户选择

FastGPT 用户选择模块的使用说明

特点

  • 用户交互
  • 可重复添加
  • 触发执行

功能

「用户选择」节点属于用户交互节点,当触发这个节点时,对话会进入“交互”状态,会记录工作流的状态,等用户完成交互后,继续向下执行工作流

比如上图中的例子,当触发用户选择节点时,对话框隐藏,对话进入“交互状态”

当用户做出选择时,节点会判断用户的选择,执行“是”的分支

作用

基础的用法为提出需要用户做抉择的问题,然后根据用户的反馈设计不同的工作流流程

+ + + + \ No newline at end of file diff --git a/docs/guide/workbench/workflow/variable_update/index.html b/docs/guide/workbench/workflow/variable_update/index.html new file mode 100644 index 000000000000..86f2a99c25f3 --- /dev/null +++ b/docs/guide/workbench/workflow/variable_update/index.html @@ -0,0 +1,44 @@ +变量更新 | FastGPT
+
变量更新
variable_update

变量更新

FastGPT 变量更新模块介绍

特点

  • 可重复添加
  • 有外部输入
  • 触发执行
  • 手动配置

功能

  • 更新指定节点的输出值

  • 更新全局变量

作用

最基础的使用场景为

  • 给一个「自定义变量」类型的全局变量赋值,从而实现全局变量无需用户输入
  • 更新「变量更新」节点前的工作流节点输出,在后续使用中,使用的节点输出值为新的输出
+ + + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000000..0733ef67a5f1 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,50 @@ +文档 | FastGPT
+
+ + + + \ No newline at end of file diff --git a/docs/index.xml b/docs/index.xml new file mode 100644 index 000000000000..605c9d1e688f --- /dev/null +++ b/docs/index.xml @@ -0,0 +1,13 @@ +文档 on FastGPThttps://doc.tryfastgpt.ai/docs/Recent content in 文档 on FastGPTHugo -- gohugo.iozh-cn快速了解 FastGPThttps://doc.tryfastgpt.ai/docs/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/intro/FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! +🤖 +FastGPT 在线使用:https://tryfastgpt.ai +FastGPT 能力 link1. 专属 AI 客服 link通过导入文档或已有问答对进行训练,让 AI 模型能根据你的文档以交互式对话方式回答问题。 +2. 简单易用的可视化界面 linkFastGPT 采用直观的可视化界面设计,为各种应用场景提供了丰富实用的功能。通过简洁易懂的操作步骤,可以轻松完成 AI 客服的创建和训练流程。 +3. 自动数据预处理 link提供手动输入、直接分段、LLM 自动处理和 CSV 等多种数据导入途径,其中“直接分段”支持通过 PDF、WORD、Markdown 和 CSV 文档内容作为上下文。FastGPT 会自动对文本数据进行预处理、向量化和 QA 分割,节省手动训练时间,提升效能。 +4. 工作流编排 link基于 Flow 模块的工作流编排,可以帮助你设计更加复杂的问答流程。例如查询数据库、查询库存、预约实验室等。 +5. 强大的 API 集成 linkFastGPT 对外的 API 接口对齐了 OpenAI 官方接口,可以直接接入现有的 GPT 应用,也可以轻松集成到企业微信、公众号、飞书等平台。 +FastGPT 特点 link 项目开源 +FastGPT 遵循附加条件 Apache License 2.0 开源协议,你可以 Fork 之后进行二次开发和发布。FastGPT 社区版将保留核心功能,商业版仅在社区版基础上使用 API 的形式进行扩展,不影响学习使用。 +独特的 QA 结构加入社区https://doc.tryfastgpt.ai/docs/community/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/community/FastGPT 是一个由用户和贡献者参与推动的开源项目,如果您对产品使用存在疑问和建议,可尝试以下方式寻求支持。我们的团队与社区会竭尽所能为您提供帮助。 +📱 扫码加入社区微信交流群👇 +🐞 请将任何 FastGPT 的 Bug、问题和需求提交到 GitHub Issue。 \ No newline at end of file diff --git a/docs/intro/index.html b/docs/intro/index.html new file mode 100644 index 000000000000..84af1e5c391a --- /dev/null +++ b/docs/intro/index.html @@ -0,0 +1,44 @@ +快速了解 FastGPT | FastGPT
+
rocket_launch

快速了解 FastGPT

FastGPT 的能力与优势

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!

FastGPT 能力

1. 专属 AI 客服

通过导入文档或已有问答对进行训练,让 AI 模型能根据你的文档以交互式对话方式回答问题。

2. 简单易用的可视化界面

FastGPT 采用直观的可视化界面设计,为各种应用场景提供了丰富实用的功能。通过简洁易懂的操作步骤,可以轻松完成 AI 客服的创建和训练流程。

3. 自动数据预处理

提供手动输入、直接分段、LLM 自动处理和 CSV 等多种数据导入途径,其中“直接分段”支持通过 PDF、WORD、Markdown 和 CSV 文档内容作为上下文。FastGPT 会自动对文本数据进行预处理、向量化和 QA 分割,节省手动训练时间,提升效能。

4. 工作流编排

基于 Flow 模块的工作流编排,可以帮助你设计更加复杂的问答流程。例如查询数据库、查询库存、预约实验室等。

5. 强大的 API 集成

FastGPT 对外的 API 接口对齐了 OpenAI 官方接口,可以直接接入现有的 GPT 应用,也可以轻松集成到企业微信、公众号、飞书等平台。

FastGPT 特点

  1. 项目开源

    FastGPT 遵循附加条件 Apache License 2.0 开源协议,你可以 Fork 之后进行二次开发和发布。FastGPT 社区版将保留核心功能,商业版仅在社区版基础上使用 API 的形式进行扩展,不影响学习使用。

  2. 独特的 QA 结构

    针对客服问答场景设计的 QA 结构,提高在大量数据场景中的问答准确性。

  3. 可视化工作流

    通过 Flow 模块展示了从问题输入到模型输出的完整流程,便于调试和设计复杂流程。

  4. 无限扩展

    基于 API 进行扩展,无需修改 FastGPT 源码,也可快速接入现有的程序中。

  5. 便于调试

    提供搜索测试、引用修改、完整对话预览等多种调试途径。

  6. 支持多种模型

    支持 GPT、Claude、文心一言等多种 LLM 模型,未来也将支持自定义的向量模型。

知识库核心流程图

+ + + + \ No newline at end of file diff --git a/docs/js/bootstrap.58faa4dc6cac13820c8a72b1fdd5d716641b3129ef981b1956fa23d69ad59f180fed6d42cb92030ac272ba85e7f8247d.js b/docs/js/bootstrap.58faa4dc6cac13820c8a72b1fdd5d716641b3129ef981b1956fa23d69ad59f180fed6d42cb92030ac272ba85e7f8247d.js new file mode 100644 index 000000000000..e67096917d4f --- /dev/null +++ b/docs/js/bootstrap.58faa4dc6cac13820c8a72b1fdd5d716641b3129ef981b1956fa23d69ad59f180fed6d42cb92030ac272ba85e7f8247d.js @@ -0,0 +1 @@ +(()=>{var Vr=Object.create;var dn=Object.defineProperty;var Hr=Object.getOwnPropertyDescriptor;var jr=Object.getOwnPropertyNames;var Br=Object.getPrototypeOf,Wr=Object.prototype.hasOwnProperty;var Fr=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports);var Kr=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of jr(t))!Wr.call(n,i)&&i!==e&&dn(n,i,{get:()=>t[i],enumerable:!(r=Hr(t,i))||r.enumerable});return n};var hn=(n,t,e)=>(e=n!=null?Vr(Br(n)):{},Kr(t||!n||!n.__esModule?dn(e,"default",{value:n,enumerable:!0}):e,n));var qe=Fr(P=>{"use strict";Object.defineProperty(P,"__esModule",{value:!0});function z(n){if(n==null)return window;if(n.toString()!=="[object Window]"){var t=n.ownerDocument;return t&&t.defaultView||window}return n}function Et(n){var t=z(n).Element;return n instanceof t||n instanceof Element}function K(n){var t=z(n).HTMLElement;return n instanceof t||n instanceof HTMLElement}function ir(n){if(typeof ShadowRoot=="undefined")return!1;var t=z(n).ShadowRoot;return n instanceof t||n instanceof ShadowRoot}var ft=Math.max,ee=Math.min,bt=Math.round;function yt(n,t){t===void 0&&(t=!1);var e=n.getBoundingClientRect(),r=1,i=1;if(K(n)&&t){var s=n.offsetHeight,o=n.offsetWidth;o>0&&(r=bt(e.width)/o||1),s>0&&(i=bt(e.height)/s||1)}return{width:e.width/r,height:e.height/i,top:e.top/i,right:e.right/r,bottom:e.bottom/i,left:e.left/r,x:e.left/r,y:e.top/i}}function ke(n){var t=z(n),e=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:e,scrollTop:r}}function po(n){return{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}}function ho(n){return n===z(n)||!K(n)?ke(n):po(n)}function Q(n){return n?(n.nodeName||"").toLowerCase():null}function rt(n){return((Et(n)?n.ownerDocument:n.document)||window.document).documentElement}function $e(n){return yt(rt(n)).left+ke(n).scrollLeft}function X(n){return z(n).getComputedStyle(n)}function Ve(n){var t=X(n),e=t.overflow,r=t.overflowX,i=t.overflowY;return/auto|scroll|overlay|hidden/.test(e+i+r)}function mo(n){var t=n.getBoundingClientRect(),e=bt(t.width)/n.offsetWidth||1,r=bt(t.height)/n.offsetHeight||1;return e!==1||r!==1}function go(n,t,e){e===void 0&&(e=!1);var r=K(t),i=K(t)&&mo(t),s=rt(t),o=yt(n,i),a={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(r||!r&&!e)&&((Q(t)!=="body"||Ve(s))&&(a=ho(t)),K(t)?(l=yt(t,!0),l.x+=t.clientLeft,l.y+=t.clientTop):s&&(l.x=$e(s))),{x:o.left+a.scrollLeft-l.x,y:o.top+a.scrollTop-l.y,width:o.width,height:o.height}}function He(n){var t=yt(n),e=n.offsetWidth,r=n.offsetHeight;return Math.abs(t.width-e)<=1&&(e=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:n.offsetLeft,y:n.offsetTop,width:e,height:r}}function ne(n){return Q(n)==="html"?n:n.assignedSlot||n.parentNode||(ir(n)?n.host:null)||rt(n)}function or(n){return["html","body","#document"].indexOf(Q(n))>=0?n.ownerDocument.body:K(n)&&Ve(n)?n:or(ne(n))}function Rt(n,t){var e;t===void 0&&(t=[]);var r=or(n),i=r===((e=n.ownerDocument)==null?void 0:e.body),s=z(r),o=i?[s].concat(s.visualViewport||[],Ve(r)?r:[]):r,a=t.concat(o);return i?a:a.concat(Rt(ne(o)))}function _o(n){return["table","td","th"].indexOf(Q(n))>=0}function Gn(n){return!K(n)||X(n).position==="fixed"?null:n.offsetParent}function vo(n){var t=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,e=navigator.userAgent.indexOf("Trident")!==-1;if(e&&K(n)){var r=X(n);if(r.position==="fixed")return null}for(var i=ne(n);K(i)&&["html","body"].indexOf(Q(i))<0;){var s=X(i);if(s.transform!=="none"||s.perspective!=="none"||s.contain==="paint"||["transform","perspective"].indexOf(s.willChange)!==-1||t&&s.willChange==="filter"||t&&s.filter&&s.filter!=="none")return i;i=i.parentNode}return null}function $t(n){for(var t=z(n),e=Gn(n);e&&_o(e)&&X(e).position==="static";)e=Gn(e);return e&&(Q(e)==="html"||Q(e)==="body"&&X(e).position==="static")?t:e||vo(n)||t}var R="top",Y="bottom",U="right",M="left",je="auto",Vt=[R,Y,U,M],At="start",kt="end",Eo="clippingParents",sr="viewport",It="popper",bo="reference",Qn=Vt.reduce(function(n,t){return n.concat([t+"-"+At,t+"-"+kt])},[]),ar=[].concat(Vt,[je]).reduce(function(n,t){return n.concat([t,t+"-"+At,t+"-"+kt])},[]),yo="beforeRead",Ao="read",To="afterRead",wo="beforeMain",Oo="main",Co="afterMain",So="beforeWrite",No="write",Do="afterWrite",Lo=[yo,Ao,To,wo,Oo,Co,So,No,Do];function xo(n){var t=new Map,e=new Set,r=[];n.forEach(function(s){t.set(s.name,s)});function i(s){e.add(s.name);var o=[].concat(s.requires||[],s.requiresIfExists||[]);o.forEach(function(a){if(!e.has(a)){var l=t.get(a);l&&i(l)}}),r.push(s)}return n.forEach(function(s){e.has(s.name)||i(s)}),r}function Po(n){var t=xo(n);return Lo.reduce(function(e,r){return e.concat(t.filter(function(i){return i.phase===r}))},[])}function Io(n){var t;return function(){return t||(t=new Promise(function(e){Promise.resolve().then(function(){t=void 0,e(n())})})),t}}function G(n){return n.split("-")[0]}function Ro(n){var t=n.reduce(function(e,r){var i=e[r.name];return e[r.name]=i?Object.assign({},i,r,{options:Object.assign({},i.options,r.options),data:Object.assign({},i.data,r.data)}):r,e},{});return Object.keys(t).map(function(e){return t[e]})}function Mo(n){var t=z(n),e=rt(n),r=t.visualViewport,i=e.clientWidth,s=e.clientHeight,o=0,a=0;return r&&(i=r.width,s=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(o=r.offsetLeft,a=r.offsetTop)),{width:i,height:s,x:o+$e(n),y:a}}function ko(n){var t,e=rt(n),r=ke(n),i=(t=n.ownerDocument)==null?void 0:t.body,s=ft(e.scrollWidth,e.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),o=ft(e.scrollHeight,e.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),a=-r.scrollLeft+$e(n),l=-r.scrollTop;return X(i||e).direction==="rtl"&&(a+=ft(e.clientWidth,i?i.clientWidth:0)-s),{width:s,height:o,x:a,y:l}}function lr(n,t){var e=t.getRootNode&&t.getRootNode();if(n.contains(t))return!0;if(e&&ir(e)){var r=t;do{if(r&&n.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function Me(n){return Object.assign({},n,{left:n.x,top:n.y,right:n.x+n.width,bottom:n.y+n.height})}function $o(n){var t=yt(n);return t.top=t.top+n.clientTop,t.left=t.left+n.clientLeft,t.bottom=t.top+n.clientHeight,t.right=t.left+n.clientWidth,t.width=n.clientWidth,t.height=n.clientHeight,t.x=t.left,t.y=t.top,t}function Xn(n,t){return t===sr?Me(Mo(n)):Et(t)?$o(t):Me(ko(rt(n)))}function Vo(n){var t=Rt(ne(n)),e=["absolute","fixed"].indexOf(X(n).position)>=0,r=e&&K(n)?$t(n):n;return Et(r)?t.filter(function(i){return Et(i)&&lr(i,r)&&Q(i)!=="body"&&(e?X(i).position!=="static":!0)}):[]}function Ho(n,t,e){var r=t==="clippingParents"?Vo(n):[].concat(t),i=[].concat(r,[e]),s=i[0],o=i.reduce(function(a,l){var f=Xn(n,l);return a.top=ft(f.top,a.top),a.right=ee(f.right,a.right),a.bottom=ee(f.bottom,a.bottom),a.left=ft(f.left,a.left),a},Xn(n,s));return o.width=o.right-o.left,o.height=o.bottom-o.top,o.x=o.left,o.y=o.top,o}function Tt(n){return n.split("-")[1]}function Be(n){return["top","bottom"].indexOf(n)>=0?"x":"y"}function cr(n){var t=n.reference,e=n.element,r=n.placement,i=r?G(r):null,s=r?Tt(r):null,o=t.x+t.width/2-e.width/2,a=t.y+t.height/2-e.height/2,l;switch(i){case R:l={x:o,y:t.y-e.height};break;case Y:l={x:o,y:t.y+t.height};break;case U:l={x:t.x+t.width,y:a};break;case M:l={x:t.x-e.width,y:a};break;default:l={x:t.x,y:t.y}}var f=i?Be(i):null;if(f!=null){var c=f==="y"?"height":"width";switch(s){case At:l[f]=l[f]-(t[c]/2-e[c]/2);break;case kt:l[f]=l[f]+(t[c]/2-e[c]/2);break}}return l}function ur(){return{top:0,right:0,bottom:0,left:0}}function fr(n){return Object.assign({},ur(),n)}function pr(n,t){return t.reduce(function(e,r){return e[r]=n,e},{})}function wt(n,t){t===void 0&&(t={});var e=t,r=e.placement,i=r===void 0?n.placement:r,s=e.boundary,o=s===void 0?Eo:s,a=e.rootBoundary,l=a===void 0?sr:a,f=e.elementContext,c=f===void 0?It:f,d=e.altBoundary,v=d===void 0?!1:d,h=e.padding,g=h===void 0?0:h,_=fr(typeof g!="number"?g:pr(g,Vt)),m=c===It?bo:It,w=n.rects.popper,O=n.elements[v?m:c],C=Ho(Et(O)?O:O.contextElement||rt(n.elements.popper),o,l),E=yt(n.elements.reference),A=cr({reference:E,element:w,strategy:"absolute",placement:i}),b=Me(Object.assign({},w,A)),y=c===It?b:E,S={top:C.top-y.top+_.top,bottom:y.bottom-C.bottom+_.bottom,left:C.left-y.left+_.left,right:y.right-C.right+_.right},N=n.modifiersData.offset;if(c===It&&N){var D=N[i];Object.keys(S).forEach(function(T){var L=[U,Y].indexOf(T)>=0?1:-1,it=[R,Y].indexOf(T)>=0?"y":"x";S[T]+=D[it]*L})}return S}var Jn={placement:"bottom",modifiers:[],strategy:"absolute"};function Zn(){for(var n=arguments.length,t=new Array(n),e=0;e=0?-1:1,s=typeof e=="function"?e(Object.assign({},t,{placement:n})):e,o=s[0],a=s[1];return o=o||0,a=(a||0)*i,[M,U].indexOf(r)>=0?{x:a,y:o}:{x:o,y:a}}function zo(n){var t=n.state,e=n.options,r=n.name,i=e.offset,s=i===void 0?[0,0]:i,o=ar.reduce(function(c,d){return c[d]=qo(d,t.rects,s),c},{}),a=o[t.placement],l=a.x,f=a.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=f),t.modifiersData[r]=o}var dr={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:zo},Go={left:"right",right:"left",bottom:"top",top:"bottom"};function te(n){return n.replace(/left|right|bottom|top/g,function(t){return Go[t]})}var Qo={start:"end",end:"start"};function er(n){return n.replace(/start|end/g,function(t){return Qo[t]})}function Xo(n,t){t===void 0&&(t={});var e=t,r=e.placement,i=e.boundary,s=e.rootBoundary,o=e.padding,a=e.flipVariations,l=e.allowedAutoPlacements,f=l===void 0?ar:l,c=Tt(r),d=c?a?Qn:Qn.filter(function(g){return Tt(g)===c}):Vt,v=d.filter(function(g){return f.indexOf(g)>=0});v.length===0&&(v=d);var h=v.reduce(function(g,_){return g[_]=wt(n,{placement:_,boundary:i,rootBoundary:s,padding:o})[G(_)],g},{});return Object.keys(h).sort(function(g,_){return h[g]-h[_]})}function Jo(n){if(G(n)===je)return[];var t=te(n);return[er(n),t,er(t)]}function Zo(n){var t=n.state,e=n.options,r=n.name;if(!t.modifiersData[r]._skip){for(var i=e.mainAxis,s=i===void 0?!0:i,o=e.altAxis,a=o===void 0?!0:o,l=e.fallbackPlacements,f=e.padding,c=e.boundary,d=e.rootBoundary,v=e.altBoundary,h=e.flipVariations,g=h===void 0?!0:h,_=e.allowedAutoPlacements,m=t.options.placement,w=G(m),O=w===m,C=l||(O||!g?[te(m)]:Jo(m)),E=[m].concat(C).reduce(function(ht,Z){return ht.concat(G(Z)===je?Xo(t,{placement:Z,boundary:c,rootBoundary:d,padding:f,flipVariations:g,allowedAutoPlacements:_}):Z)},[]),A=t.rects.reference,b=t.rects.popper,y=new Map,S=!0,N=E[0],D=0;D=0,Nt=St?"width":"height",k=wt(t,{placement:T,boundary:c,rootBoundary:d,altBoundary:v,padding:f}),q=St?it?U:M:it?Y:R;A[Nt]>b[Nt]&&(q=te(q));var Bt=te(q),ot=[];if(s&&ot.push(k[L]<=0),a&&ot.push(k[q]<=0,k[Bt]<=0),ot.every(function(ht){return ht})){N=T,S=!1;break}y.set(T,ot)}if(S)for(var Wt=g?3:1,ae=function(Z){var Lt=E.find(function(Kt){var st=y.get(Kt);if(st)return st.slice(0,Z).every(function(le){return le})});if(Lt)return N=Lt,"break"},Dt=Wt;Dt>0;Dt--){var Ft=ae(Dt);if(Ft==="break")break}t.placement!==N&&(t.modifiersData[r]._skip=!0,t.placement=N,t.reset=!0)}}var hr={name:"flip",enabled:!0,phase:"main",fn:Zo,requiresIfExists:["offset"],data:{_skip:!1}};function ts(n){return n==="x"?"y":"x"}function Mt(n,t,e){return ft(n,ee(t,e))}function es(n,t,e){var r=Mt(n,t,e);return r>e?e:r}function ns(n){var t=n.state,e=n.options,r=n.name,i=e.mainAxis,s=i===void 0?!0:i,o=e.altAxis,a=o===void 0?!1:o,l=e.boundary,f=e.rootBoundary,c=e.altBoundary,d=e.padding,v=e.tether,h=v===void 0?!0:v,g=e.tetherOffset,_=g===void 0?0:g,m=wt(t,{boundary:l,rootBoundary:f,padding:d,altBoundary:c}),w=G(t.placement),O=Tt(t.placement),C=!O,E=Be(w),A=ts(E),b=t.modifiersData.popperOffsets,y=t.rects.reference,S=t.rects.popper,N=typeof _=="function"?_(Object.assign({},t.rects,{placement:t.placement})):_,D=typeof N=="number"?{mainAxis:N,altAxis:N}:Object.assign({mainAxis:0,altAxis:0},N),T=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,L={x:0,y:0};if(b){if(s){var it,St=E==="y"?R:M,Nt=E==="y"?Y:U,k=E==="y"?"height":"width",q=b[E],Bt=q+m[St],ot=q-m[Nt],Wt=h?-S[k]/2:0,ae=O===At?y[k]:S[k],Dt=O===At?-S[k]:-y[k],Ft=t.elements.arrow,ht=h&&Ft?He(Ft):{width:0,height:0},Z=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:ur(),Lt=Z[St],Kt=Z[Nt],st=Mt(0,y[k],ht[k]),le=C?y[k]/2-Wt-st-Lt-D.mainAxis:ae-st-Lt-D.mainAxis,Pr=C?-y[k]/2+Wt+st+Kt+D.mainAxis:Dt+st+Kt+D.mainAxis,ce=t.elements.arrow&&$t(t.elements.arrow),Ir=ce?E==="y"?ce.clientTop||0:ce.clientLeft||0:0,rn=(it=T==null?void 0:T[E])!=null?it:0,Rr=q+le-rn-Ir,Mr=q+Pr-rn,on=Mt(h?ee(Bt,Rr):Bt,q,h?ft(ot,Mr):ot);b[E]=on,L[E]=on-q}if(a){var sn,kr=E==="x"?R:M,$r=E==="x"?Y:U,at=b[A],Yt=A==="y"?"height":"width",an=at+m[kr],ln=at-m[$r],ue=[R,M].indexOf(w)!==-1,cn=(sn=T==null?void 0:T[A])!=null?sn:0,un=ue?an:at-y[Yt]-S[Yt]-cn+D.altAxis,fn=ue?at+y[Yt]+S[Yt]-cn-D.altAxis:ln,pn=h&&ue?es(un,at,fn):Mt(h?un:an,at,h?fn:ln);b[A]=pn,L[A]=pn-at}t.modifiersData[r]=L}}var mr={name:"preventOverflow",enabled:!0,phase:"main",fn:ns,requiresIfExists:["offset"]},rs=function(t,e){return t=typeof t=="function"?t(Object.assign({},e.rects,{placement:e.placement})):t,fr(typeof t!="number"?t:pr(t,Vt))};function is(n){var t,e=n.state,r=n.name,i=n.options,s=e.elements.arrow,o=e.modifiersData.popperOffsets,a=G(e.placement),l=Be(a),f=[M,U].indexOf(a)>=0,c=f?"height":"width";if(!(!s||!o)){var d=rs(i.padding,e),v=He(s),h=l==="y"?R:M,g=l==="y"?Y:U,_=e.rects.reference[c]+e.rects.reference[l]-o[l]-e.rects.popper[c],m=o[l]-e.rects.reference[l],w=$t(s),O=w?l==="y"?w.clientHeight||0:w.clientWidth||0:0,C=_/2-m/2,E=d[h],A=O-v[c]-d[g],b=O/2-v[c]/2+C,y=Mt(E,b,A),S=l;e.modifiersData[r]=(t={},t[S]=y,t.centerOffset=y-b,t)}}function os(n){var t=n.state,e=n.options,r=e.element,i=r===void 0?"[data-popper-arrow]":r;i!=null&&(typeof i=="string"&&(i=t.elements.popper.querySelector(i),!i)||lr(t.elements.popper,i)&&(t.elements.arrow=i))}var gr={name:"arrow",enabled:!0,phase:"main",fn:is,effect:os,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function nr(n,t,e){return e===void 0&&(e={x:0,y:0}),{top:n.top-t.height-e.y,right:n.right-t.width+e.x,bottom:n.bottom-t.height+e.y,left:n.left-t.width-e.x}}function rr(n){return[R,U,Y,M].some(function(t){return n[t]>=0})}function ss(n){var t=n.state,e=n.name,r=t.rects.reference,i=t.rects.popper,s=t.modifiersData.preventOverflow,o=wt(t,{elementContext:"reference"}),a=wt(t,{altBoundary:!0}),l=nr(o,r),f=nr(a,i,s),c=rr(l),d=rr(f);t.modifiersData[e]={referenceClippingOffsets:l,popperEscapeOffsets:f,isReferenceHidden:c,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":c,"data-popper-escaped":d})}var _r={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:ss},as=[Fe,Ke,Ye,Ue],ls=We({defaultModifiers:as}),vr=[Fe,Ke,Ye,Ue,dr,hr,mr,gr,_r],cs=We({defaultModifiers:vr});P.applyStyles=Ue;P.arrow=gr;P.computeStyles=Ye;P.createPopper=cs;P.createPopperLite=ls;P.defaultModifiers=vr;P.detectOverflow=wt;P.eventListeners=Fe;P.flip=hr;P.hide=_r;P.offset=dr;P.popperGenerator=We;P.popperOffsets=Ke;P.preventOverflow=mr});var tt=new Map,Ut={set(n,t,e){tt.has(n)||tt.set(n,new Map);let r=tt.get(n);if(!r.has(t)&&r.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(r.keys())[0]}.`);return}r.set(t,e)},get(n,t){return tt.has(n)&&tt.get(n).get(t)||null},remove(n,t){if(!tt.has(n))return;let e=tt.get(n);e.delete(t),e.size===0&&tt.delete(n)}};var pe="transitionend",de=n=>(n&&window.CSS&&window.CSS.escape&&(n=n.replace(/#([^\s"#']+)/g,(t,e)=>`#${CSS.escape(e)}`)),n),mn=n=>n==null?`${n}`:Object.prototype.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase(),gn=n=>{do n+=Math.floor(Math.random()*1e6);while(document.getElementById(n));return n},Yr=n=>{if(!n)return 0;let{transitionDuration:t,transitionDelay:e}=window.getComputedStyle(n),r=Number.parseFloat(t),i=Number.parseFloat(e);return!r&&!i?0:(t=t.split(",")[0],e=e.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(e))*1e3)},Ur=n=>{n.dispatchEvent(new Event(pe))},$=n=>!n||typeof n!="object"?!1:(typeof n.jquery!="undefined"&&(n=n[0]),typeof n.nodeType!="undefined"),I=n=>$(n)?n.jquery?n[0]:n:typeof n=="string"&&n.length>0?document.querySelector(de(n)):null,et=n=>{if(!$(n)||n.getClientRects().length===0)return!1;let t=getComputedStyle(n).getPropertyValue("visibility")==="visible",e=n.closest("details:not([open])");if(!e)return t;if(e!==n){let r=n.closest("summary");if(r&&r.parentNode!==e||r===null)return!1}return t},H=n=>!n||n.nodeType!==Node.ELEMENT_NODE||n.classList.contains("disabled")?!0:typeof n.disabled!="undefined"?n.disabled:n.hasAttribute("disabled")&&n.getAttribute("disabled")!=="false",he=n=>{if(!document.documentElement.attachShadow)return null;if(typeof n.getRootNode=="function"){let t=n.getRootNode();return t instanceof ShadowRoot?t:null}return n instanceof ShadowRoot?n:n.parentNode?he(n.parentNode):null},mt=()=>{},gt=n=>{n.offsetHeight},me=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,fe=[],qr=n=>{document.readyState==="loading"?(fe.length||document.addEventListener("DOMContentLoaded",()=>{for(let t of fe)t()}),fe.push(n)):n()},V=()=>document.documentElement.dir==="rtl",j=n=>{qr(()=>{let t=me();if(t){let e=n.NAME,r=t.fn[e];t.fn[e]=n.jQueryInterface,t.fn[e].Constructor=n,t.fn[e].noConflict=()=>(t.fn[e]=r,n.jQueryInterface)}})},x=(n,t=[],e=n)=>typeof n=="function"?n(...t):e,qt=(n,t,e=!0)=>{if(!e){x(n);return}let r=5,i=Yr(t)+r,s=!1,o=({target:a})=>{a===t&&(s=!0,t.removeEventListener(pe,o),x(n))};t.addEventListener(pe,o),setTimeout(()=>{s||Ur(t)},i)},zt=(n,t,e,r)=>{let i=n.length,s=n.indexOf(t);return s===-1?!e&&r?n[i-1]:n[0]:(s+=e?1:-1,r&&(s=(s+i)%i),n[Math.max(0,Math.min(s,i-1))])};var zr=/[^.]*(?=\..*)\.|.*/,Gr=/\..*/,Qr=/::\d+$/,ge={},_n=1,En={mouseenter:"mouseover",mouseleave:"mouseout"},Xr=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function bn(n,t){return t&&`${t}::${_n++}`||n.uidEvent||_n++}function yn(n){let t=bn(n);return n.uidEvent=t,ge[t]=ge[t]||{},ge[t]}function Jr(n,t){return function e(r){return Ee(r,{delegateTarget:n}),e.oneOff&&ve.off(n,r.type,t),t.apply(n,[r])}}function Zr(n,t,e){return function r(i){let s=n.querySelectorAll(t);for(let{target:o}=i;o&&o!==this;o=o.parentNode)for(let a of s)if(a===o)return Ee(i,{delegateTarget:o}),r.oneOff&&ve.off(n,i.type,t,e),e.apply(o,[i])}}function An(n,t,e=null){return Object.values(n).find(r=>r.callable===t&&r.delegationSelector===e)}function Tn(n,t,e){let r=typeof t=="string",i=r?e:t||e,s=wn(n);return Xr.has(s)||(s=n),[r,i,s]}function vn(n,t,e,r,i){if(typeof t!="string"||!n)return;let[s,o,a]=Tn(t,e,r);t in En&&(o=(g=>function(_){if(!_.relatedTarget||_.relatedTarget!==_.delegateTarget&&!_.delegateTarget.contains(_.relatedTarget))return g.call(this,_)})(o));let l=yn(n),f=l[a]||(l[a]={}),c=An(f,o,s?e:null);if(c){c.oneOff=c.oneOff&&i;return}let d=bn(o,t.replace(zr,"")),v=s?Zr(n,e,o):Jr(n,o);v.delegationSelector=s?e:null,v.callable=o,v.oneOff=i,v.uidEvent=d,f[d]=v,n.addEventListener(a,v,s)}function _e(n,t,e,r,i){let s=An(t[e],r,i);s&&(n.removeEventListener(e,s,!!i),delete t[e][s.uidEvent])}function ti(n,t,e,r){let i=t[e]||{};for(let[s,o]of Object.entries(i))s.includes(r)&&_e(n,t,e,o.callable,o.delegationSelector)}function wn(n){return n=n.replace(Gr,""),En[n]||n}var ve={on(n,t,e,r){vn(n,t,e,r,!1)},one(n,t,e,r){vn(n,t,e,r,!0)},off(n,t,e,r){if(typeof t!="string"||!n)return;let[i,s,o]=Tn(t,e,r),a=o!==t,l=yn(n),f=l[o]||{},c=t.startsWith(".");if(typeof s!="undefined"){if(!Object.keys(f).length)return;_e(n,l,o,s,i?e:null);return}if(c)for(let d of Object.keys(l))ti(n,l,d,t.slice(1));for(let[d,v]of Object.entries(f)){let h=d.replace(Qr,"");(!a||t.includes(h))&&_e(n,l,o,v.callable,v.delegationSelector)}},trigger(n,t,e){if(typeof t!="string"||!n)return null;let r=me(),i=wn(t),s=t!==i,o=null,a=!0,l=!0,f=!1;s&&r&&(o=r.Event(t,e),r(n).trigger(o),a=!o.isPropagationStopped(),l=!o.isImmediatePropagationStopped(),f=o.isDefaultPrevented());let c=Ee(new Event(t,{bubbles:a,cancelable:!0}),e);return f&&c.preventDefault(),l&&n.dispatchEvent(c),c.defaultPrevented&&o&&o.preventDefault(),c}};function Ee(n,t={}){for(let[e,r]of Object.entries(t))try{n[e]=r}catch(i){Object.defineProperty(n,e,{configurable:!0,get(){return r}})}return n}var u=ve;function On(n){if(n==="true")return!0;if(n==="false")return!1;if(n===Number(n).toString())return Number(n);if(n===""||n==="null")return null;if(typeof n!="string")return n;try{return JSON.parse(decodeURIComponent(n))}catch(t){return n}}function be(n){return n.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}var ei={setDataAttribute(n,t,e){n.setAttribute(`data-bs-${be(t)}`,e)},removeDataAttribute(n,t){n.removeAttribute(`data-bs-${be(t)}`)},getDataAttributes(n){if(!n)return{};let t={},e=Object.keys(n.dataset).filter(r=>r.startsWith("bs")&&!r.startsWith("bsConfig"));for(let r of e){let i=r.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),t[i]=On(n.dataset[r])}return t},getDataAttribute(n,t){return On(n.getAttribute(`data-bs-${be(t)}`))}},B=ei;var ye=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){let r=$(e)?B.getDataAttribute(e,"config"):{};return{...this.constructor.Default,...typeof r=="object"?r:{},...$(e)?B.getDataAttributes(e):{},...typeof t=="object"?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(let[r,i]of Object.entries(e)){let s=t[r],o=$(s)?"element":mn(s);if(!new RegExp(i).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${r}" provided type "${o}" but expected type "${i}".`)}}},nt=ye;var ni="5.3.2",Ae=class extends nt{constructor(t,e){super(),t=I(t),t&&(this._element=t,this._config=this._getConfig(e),Ut.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Ut.remove(this._element,this.constructor.DATA_KEY),u.off(this._element,this.constructor.EVENT_KEY);for(let t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,r=!0){qt(t,e,r)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Ut.get(I(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,typeof e=="object"?e:null)}static get VERSION(){return ni}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}},W=Ae;var Te=n=>{let t=n.getAttribute("data-bs-target");if(!t||t==="#"){let e=n.getAttribute("href");if(!e||!e.includes("#")&&!e.startsWith("."))return null;e.includes("#")&&!e.startsWith("#")&&(e=`#${e.split("#")[1]}`),t=e&&e!=="#"?de(e.trim()):null}return t},Gt={find(n,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,n))},findOne(n,t=document.documentElement){return Element.prototype.querySelector.call(t,n)},children(n,t){return[].concat(...n.children).filter(e=>e.matches(t))},parents(n,t){let e=[],r=n.parentNode.closest(t);for(;r;)e.push(r),r=r.parentNode.closest(t);return e},prev(n,t){let e=n.previousElementSibling;for(;e;){if(e.matches(t))return[e];e=e.previousElementSibling}return[]},next(n,t){let e=n.nextElementSibling;for(;e;){if(e.matches(t))return[e];e=e.nextElementSibling}return[]},focusableChildren(n){let t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(e=>`${e}:not([tabindex^="-"])`).join(",");return this.find(t,n).filter(e=>!H(e)&&et(e))},getSelectorFromElement(n){let t=Te(n);return t&&Gt.findOne(t)?t:null},getElementFromSelector(n){let t=Te(n);return t?Gt.findOne(t):null},getMultipleElementsFromSelector(n){let t=Te(n);return t?Gt.find(t):[]}},p=Gt;var ri="tab",ii="bs.tab",ct=`.${ii}`,oi=`hide${ct}`,si=`hidden${ct}`,ai=`show${ct}`,li=`shown${ct}`,ci=`click${ct}`,ui=`keydown${ct}`,fi=`load${ct}`,pi="ArrowLeft",Cn="ArrowRight",di="ArrowUp",Sn="ArrowDown",we="Home",Nn="End",lt="active",Dn="fade",Oe="show",hi="dropdown",Ln=".dropdown-toggle",mi=".dropdown-menu",Ce=`:not(${Ln})`,gi='.list-group, .nav, [role="tablist"]',_i=".nav-item, .list-group-item",vi=`.nav-link${Ce}, .list-group-item${Ce}, [role="tab"]${Ce}`,xn='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Se=`${vi}, ${xn}`,Ei=`.${lt}[data-bs-toggle="tab"], .${lt}[data-bs-toggle="pill"], .${lt}[data-bs-toggle="list"]`,_t=class n extends W{constructor(t){super(t),this._parent=this._element.closest(gi),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),u.on(this._element,ui,e=>this._keydown(e)))}static get NAME(){return ri}show(){let t=this._element;if(this._elemIsActive(t))return;let e=this._getActiveElem(),r=e?u.trigger(e,oi,{relatedTarget:t}):null;u.trigger(t,ai,{relatedTarget:e}).defaultPrevented||r&&r.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){if(!t)return;t.classList.add(lt),this._activate(p.getElementFromSelector(t));let r=()=>{if(t.getAttribute("role")!=="tab"){t.classList.add(Oe);return}t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),u.trigger(t,li,{relatedTarget:e})};this._queueCallback(r,t,t.classList.contains(Dn))}_deactivate(t,e){if(!t)return;t.classList.remove(lt),t.blur(),this._deactivate(p.getElementFromSelector(t));let r=()=>{if(t.getAttribute("role")!=="tab"){t.classList.remove(Oe);return}t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),u.trigger(t,si,{relatedTarget:e})};this._queueCallback(r,t,t.classList.contains(Dn))}_keydown(t){if(![pi,Cn,di,Sn,we,Nn].includes(t.key))return;t.stopPropagation(),t.preventDefault();let e=this._getChildren().filter(i=>!H(i)),r;if([we,Nn].includes(t.key))r=e[t.key===we?0:e.length-1];else{let i=[Cn,Sn].includes(t.key);r=zt(e,t.target,i,!0)}r&&(r.focus({preventScroll:!0}),n.getOrCreateInstance(r).show())}_getChildren(){return p.find(Se,this._parent)}_getActiveElem(){return this._getChildren().find(t=>this._elemIsActive(t))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(let r of e)this._setInitialAttributesOnChild(r)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);let e=this._elemIsActive(t),r=this._getOuterElement(t);t.setAttribute("aria-selected",e),r!==t&&this._setAttributeIfNotExists(r,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){let e=p.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){let r=this._getOuterElement(t);if(!r.classList.contains(hi))return;let i=(s,o)=>{let a=p.findOne(s,r);a&&a.classList.toggle(o,e)};i(Ln,lt),i(mi,Oe),r.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,r){t.hasAttribute(e)||t.setAttribute(e,r)}_elemIsActive(t){return t.classList.contains(lt)}_getInnerElement(t){return t.matches(Se)?t:p.findOne(Se,t)}_getOuterElement(t){return t.closest(_i)||t}static jQueryInterface(t){return this.each(function(){let e=n.getOrCreateInstance(this);if(typeof t=="string"){if(e[t]===void 0||t.startsWith("_")||t==="constructor")throw new TypeError(`No method named "${t}"`);e[t]()}})}};u.on(document,ci,xn,function(n){["A","AREA"].includes(this.tagName)&&n.preventDefault(),!H(this)&&_t.getOrCreateInstance(this).show()});u.on(window,fi,()=>{for(let n of p.find(Ei))_t.getOrCreateInstance(n)});j(_t);var Pn=_t;var Mn="backdrop",bi="fade",In="show",Rn=`mousedown.bs.${Mn}`,yi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ai={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"},Ne=class extends nt{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return yi}static get DefaultType(){return Ai}static get NAME(){return Mn}show(t){if(!this._config.isVisible){x(t);return}this._append();let e=this._getElement();this._config.isAnimated&>(e),e.classList.add(In),this._emulateAnimation(()=>{x(t)})}hide(t){if(!this._config.isVisible){x(t);return}this._getElement().classList.remove(In),this._emulateAnimation(()=>{this.dispose(),x(t)})}dispose(){this._isAppended&&(u.off(this._element,Rn),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){let t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add(bi),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=I(t.rootElement),t}_append(){if(this._isAppended)return;let t=this._getElement();this._config.rootElement.append(t),u.on(t,Rn,()=>{x(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(t){qt(t,this._getElement(),this._config.isAnimated)}},kn=Ne;var $n=(n,t="hide")=>{let e=`click.dismiss${n.EVENT_KEY}`,r=n.NAME;u.on(document,e,`[data-bs-dismiss="${r}"]`,function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),H(this))return;let s=p.getElementFromSelector(this)||this.closest(`.${r}`);n.getOrCreateInstance(s)[t]()})};var Ti="focustrap",wi="bs.focustrap",Qt=`.${wi}`,Oi=`focusin${Qt}`,Ci=`keydown.tab${Qt}`,Si="Tab",Ni="forward",Vn="backward",Di={autofocus:!0,trapElement:null},Li={autofocus:"boolean",trapElement:"element"},De=class extends nt{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Di}static get DefaultType(){return Li}static get NAME(){return Ti}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),u.off(document,Qt),u.on(document,Oi,t=>this._handleFocusin(t)),u.on(document,Ci,t=>this._handleKeydown(t)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,u.off(document,Qt))}_handleFocusin(t){let{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;let r=p.focusableChildren(e);r.length===0?e.focus():this._lastTabNavDirection===Vn?r[r.length-1].focus():r[0].focus()}_handleKeydown(t){t.key===Si&&(this._lastTabNavDirection=t.shiftKey?Vn:Ni)}},Hn=De;var jn=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Bn=".sticky-top",Xt="padding-right",Wn="margin-right",Le=class{constructor(){this._element=document.body}getWidth(){let t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){let t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Xt,e=>e+t),this._setElementAttributes(jn,Xt,e=>e+t),this._setElementAttributes(Bn,Wn,e=>e-t)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Xt),this._resetElementAttributes(jn,Xt),this._resetElementAttributes(Bn,Wn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,r){let i=this.getWidth(),s=o=>{if(o!==this._element&&window.innerWidth>o.clientWidth+i)return;this._saveInitialAttribute(o,e);let a=window.getComputedStyle(o).getPropertyValue(e);o.style.setProperty(e,`${r(Number.parseFloat(a))}px`)};this._applyManipulationCallback(t,s)}_saveInitialAttribute(t,e){let r=t.style.getPropertyValue(e);r&&B.setDataAttribute(t,e,r)}_resetElementAttributes(t,e){let r=i=>{let s=B.getDataAttribute(i,e);if(s===null){i.style.removeProperty(e);return}B.removeDataAttribute(i,e),i.style.setProperty(e,s)};this._applyManipulationCallback(t,r)}_applyManipulationCallback(t,e){if($(t)){e(t);return}for(let r of p.find(t,this._element))e(r)}},Fn=Le;var xi="modal",Pi="bs.modal",F=`.${Pi}`,Ii=".data-api",Ri="Escape",Mi=`hide${F}`,ki=`hidePrevented${F}`,Un=`hidden${F}`,qn=`show${F}`,$i=`shown${F}`,Vi=`resize${F}`,Hi=`click.dismiss${F}`,ji=`mousedown.dismiss${F}`,Bi=`keydown.dismiss${F}`,Wi=`click${F}${Ii}`,Kn="modal-open",Fi="fade",Yn="show",xe="modal-static",Ki=".modal.show",Yi=".modal-dialog",Ui=".modal-body",qi='[data-bs-toggle="modal"]',zi={backdrop:!0,focus:!0,keyboard:!0},Gi={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"},ut=class n extends W{constructor(t,e){super(t,e),this._dialog=p.findOne(Yi,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Fn,this._addEventListeners()}static get Default(){return zi}static get DefaultType(){return Gi}static get NAME(){return xi}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||u.trigger(this._element,qn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Kn),this._adjustDialog(),this._backdrop.show(()=>this._showElement(t)))}hide(){!this._isShown||this._isTransitioning||u.trigger(this._element,Mi).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Yn),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){u.off(window,F),u.off(this._dialog,F),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new kn({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Hn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;let e=p.findOne(Ui,this._dialog);e&&(e.scrollTop=0),gt(this._element),this._element.classList.add(Yn);let r=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,u.trigger(this._element,$i,{relatedTarget:t})};this._queueCallback(r,this._dialog,this._isAnimated())}_addEventListeners(){u.on(this._element,Bi,t=>{if(t.key===Ri){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),u.on(window,Vi,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),u.on(this._element,ji,t=>{u.one(this._element,Hi,e=>{if(!(this._element!==t.target||this._element!==e.target)){if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(Kn),this._resetAdjustments(),this._scrollBar.reset(),u.trigger(this._element,Un)})}_isAnimated(){return this._element.classList.contains(Fi)}_triggerBackdropTransition(){if(u.trigger(this._element,ki).defaultPrevented)return;let e=this._element.scrollHeight>document.documentElement.clientHeight,r=this._element.style.overflowY;r==="hidden"||this._element.classList.contains(xe)||(e||(this._element.style.overflowY="hidden"),this._element.classList.add(xe),this._queueCallback(()=>{this._element.classList.remove(xe),this._queueCallback(()=>{this._element.style.overflowY=r},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),r=e>0;if(r&&!t){let i=V()?"paddingLeft":"paddingRight";this._element.style[i]=`${e}px`}if(!r&&t){let i=V()?"paddingRight":"paddingLeft";this._element.style[i]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each(function(){let r=n.getOrCreateInstance(this,t);if(typeof t=="string"){if(typeof r[t]=="undefined")throw new TypeError(`No method named "${t}"`);r[t](e)}})}};u.on(document,Wi,qi,function(n){let t=p.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&n.preventDefault(),u.one(t,qn,i=>{i.defaultPrevented||u.one(t,Un,()=>{et(this)&&this.focus()})});let e=p.findOne(Ki);e&&ut.getInstance(e).hide(),ut.getOrCreateInstance(t).toggle(this)});$n(ut);j(ut);var zn=ut;var Qi="collapse",Xi="bs.collapse",Pt=`.${Xi}`,Ji=".data-api",Zi=`show${Pt}`,to=`shown${Pt}`,eo=`hide${Pt}`,no=`hidden${Pt}`,ro=`click${Pt}${Ji}`,Pe="show",vt="collapse",Jt="collapsing",io="collapsed",oo=`:scope .${vt} .${vt}`,so="collapse-horizontal",ao="width",lo="height",co=".collapse.show, .collapse.collapsing",Ie='[data-bs-toggle="collapse"]',uo={parent:null,toggle:!0},fo={parent:"(null|element)",toggle:"boolean"},xt=class n extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];let r=p.find(Ie);for(let i of r){let s=p.getSelectorFromElement(i),o=p.find(s).filter(a=>a===this._element);s!==null&&o.length&&this._triggerArray.push(i)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return uo}static get DefaultType(){return fo}static get NAME(){return Qi}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(co).filter(a=>a!==this._element).map(a=>n.getOrCreateInstance(a,{toggle:!1}))),t.length&&t[0]._isTransitioning||u.trigger(this._element,Zi).defaultPrevented)return;for(let a of t)a.hide();let r=this._getDimension();this._element.classList.remove(vt),this._element.classList.add(Jt),this._element.style[r]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let i=()=>{this._isTransitioning=!1,this._element.classList.remove(Jt),this._element.classList.add(vt,Pe),this._element.style[r]="",u.trigger(this._element,to)},o=`scroll${r[0].toUpperCase()+r.slice(1)}`;this._queueCallback(i,this._element,!0),this._element.style[r]=`${this._element[o]}px`}hide(){if(this._isTransitioning||!this._isShown()||u.trigger(this._element,eo).defaultPrevented)return;let e=this._getDimension();this._element.style[e]=`${this._element.getBoundingClientRect()[e]}px`,gt(this._element),this._element.classList.add(Jt),this._element.classList.remove(vt,Pe);for(let i of this._triggerArray){let s=p.getElementFromSelector(i);s&&!this._isShown(s)&&this._addAriaAndCollapsedClass([i],!1)}this._isTransitioning=!0;let r=()=>{this._isTransitioning=!1,this._element.classList.remove(Jt),this._element.classList.add(vt),u.trigger(this._element,no)};this._element.style[e]="",this._queueCallback(r,this._element,!0)}_isShown(t=this._element){return t.classList.contains(Pe)}_configAfterMerge(t){return t.toggle=!!t.toggle,t.parent=I(t.parent),t}_getDimension(){return this._element.classList.contains(so)?ao:lo}_initializeChildren(){if(!this._config.parent)return;let t=this._getFirstLevelChildren(Ie);for(let e of t){let r=p.getElementFromSelector(e);r&&this._addAriaAndCollapsedClass([e],this._isShown(r))}}_getFirstLevelChildren(t){let e=p.find(oo,this._config.parent);return p.find(t,this._config.parent).filter(r=>!e.includes(r))}_addAriaAndCollapsedClass(t,e){if(t.length)for(let r of t)r.classList.toggle(io,!e),r.setAttribute("aria-expanded",e)}static jQueryInterface(t){let e={};return typeof t=="string"&&/show|hide/.test(t)&&(e.toggle=!1),this.each(function(){let r=n.getOrCreateInstance(this,e);if(typeof t=="string"){if(typeof r[t]=="undefined")throw new TypeError(`No method named "${t}"`);r[t]()}})}};u.on(document,ro,Ie,function(n){(n.target.tagName==="A"||n.delegateTarget&&n.delegateTarget.tagName==="A")&&n.preventDefault();for(let t of p.getMultipleElementsFromSelector(this))xt.getOrCreateInstance(t,{toggle:!1}).toggle()});j(xt);var Re=xt;var ze=hn(qe());var Er="dropdown",us="bs.dropdown",dt=`.${us}`,Ge=".data-api",fs="Escape",br="Tab",ps="ArrowUp",yr="ArrowDown",ds=2,hs=`hide${dt}`,ms=`hidden${dt}`,gs=`show${dt}`,_s=`shown${dt}`,Ar=`click${dt}${Ge}`,Tr=`keydown${dt}${Ge}`,vs=`keyup${dt}${Ge}`,Ot="show",Es="dropup",bs="dropend",ys="dropstart",As="dropup-center",Ts="dropdown-center",pt='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',ws=`${pt}.${Ot}`,re=".dropdown-menu",Os=".navbar",Cs=".navbar-nav",Ss=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Ns=V()?"top-end":"top-start",Ds=V()?"top-start":"top-end",Ls=V()?"bottom-end":"bottom-start",xs=V()?"bottom-start":"bottom-end",Ps=V()?"left-start":"right-start",Is=V()?"right-start":"left-start",Rs="top",Ms="bottom",ks={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},$s={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"},J=class n extends W{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=p.next(this._element,re)[0]||p.prev(this._element,re)[0]||p.findOne(re,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return ks}static get DefaultType(){return $s}static get NAME(){return Er}toggle(){return this._isShown()?this.hide():this.show()}show(){if(H(this._element)||this._isShown())return;let t={relatedTarget:this._element};if(!u.trigger(this._element,gs,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(Cs))for(let r of[].concat(...document.body.children))u.on(r,"mouseover",mt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Ot),this._element.classList.add(Ot),u.trigger(this._element,_s,t)}}hide(){if(H(this._element)||!this._isShown())return;let t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!u.trigger(this._element,hs,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(let r of[].concat(...document.body.children))u.off(r,"mouseover",mt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Ot),this._element.classList.remove(Ot),this._element.setAttribute("aria-expanded","false"),B.removeDataAttribute(this._menu,"popper"),u.trigger(this._element,ms,t)}}_getConfig(t){if(t=super._getConfig(t),typeof t.reference=="object"&&!$(t.reference)&&typeof t.reference.getBoundingClientRect!="function")throw new TypeError(`${Er.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(typeof ze=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;this._config.reference==="parent"?t=this._parent:$(this._config.reference)?t=I(this._config.reference):typeof this._config.reference=="object"&&(t=this._config.reference);let e=this._getPopperConfig();this._popper=ze.createPopper(t,this._menu,e)}_isShown(){return this._menu.classList.contains(Ot)}_getPlacement(){let t=this._parent;if(t.classList.contains(bs))return Ps;if(t.classList.contains(ys))return Is;if(t.classList.contains(As))return Rs;if(t.classList.contains(Ts))return Ms;let e=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return t.classList.contains(Es)?e?Ds:Ns:e?xs:Ls}_detectNavbar(){return this._element.closest(Os)!==null}_getOffset(){let{offset:t}=this._config;return typeof t=="string"?t.split(",").map(e=>Number.parseInt(e,10)):typeof t=="function"?e=>t(e,this._element):t}_getPopperConfig(){let t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(B.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...x(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){let r=p.find(Ss,this._menu).filter(i=>et(i));r.length&&zt(r,e,t===yr,!r.includes(e)).focus()}static jQueryInterface(t){return this.each(function(){let e=n.getOrCreateInstance(this,t);if(typeof t=="string"){if(typeof e[t]=="undefined")throw new TypeError(`No method named "${t}"`);e[t]()}})}static clearMenus(t){if(t.button===ds||t.type==="keyup"&&t.key!==br)return;let e=p.find(ws);for(let r of e){let i=n.getInstance(r);if(!i||i._config.autoClose===!1)continue;let s=t.composedPath(),o=s.includes(i._menu);if(s.includes(i._element)||i._config.autoClose==="inside"&&!o||i._config.autoClose==="outside"&&o||i._menu.contains(t.target)&&(t.type==="keyup"&&t.key===br||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;let a={relatedTarget:i._element};t.type==="click"&&(a.clickEvent=t),i._completeHide(a)}}static dataApiKeydownHandler(t){let e=/input|textarea/i.test(t.target.tagName),r=t.key===fs,i=[ps,yr].includes(t.key);if(!i&&!r||e&&!r)return;t.preventDefault();let s=this.matches(pt)?this:p.prev(this,pt)[0]||p.next(this,pt)[0]||p.findOne(pt,t.delegateTarget.parentNode),o=n.getOrCreateInstance(s);if(i){t.stopPropagation(),o.show(),o._selectMenuItem(t);return}o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}};u.on(document,Tr,pt,J.dataApiKeydownHandler);u.on(document,Tr,re,J.dataApiKeydownHandler);u.on(document,Ar,J.clearMenus);u.on(document,vs,J.clearMenus);u.on(document,Ar,pt,function(n){n.preventDefault(),J.getOrCreateInstance(this).toggle()});j(J);var wr=J;var Vs="scrollspy",Hs="bs.scrollspy",Xe=`.${Hs}`,js=".data-api",Bs=`activate${Xe}`,Or=`click${Xe}`,Ws=`load${Xe}${js}`,Fs="dropdown-item",Ct="active",Ks='[data-bs-spy="scroll"]',Qe="[href]",Ys=".nav, .list-group",Cr=".nav-link",Us=".nav-item",qs=".list-group-item",zs=`${Cr}, ${Us} > ${Cr}, ${qs}`,Gs=".dropdown",Qs=".dropdown-toggle",Xs={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Js={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"},Ht=class n extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Xs}static get DefaultType(){return Js}static get NAME(){return Vs}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(let t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=I(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,typeof t.threshold=="string"&&(t.threshold=t.threshold.split(",").map(e=>Number.parseFloat(e))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(u.off(this._config.target,Or),u.on(this._config.target,Or,Qe,t=>{let e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();let r=this._rootElement||window,i=e.offsetTop-this._element.offsetTop;if(r.scrollTo){r.scrollTo({top:i,behavior:"smooth"});return}r.scrollTop=i}}))}_getNewObserver(){let t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(e=>this._observerCallback(e),t)}_observerCallback(t){let e=o=>this._targetLinks.get(`#${o.target.id}`),r=o=>{this._previousScrollData.visibleEntryTop=o.target.offsetTop,this._process(e(o))},i=(this._rootElement||document.documentElement).scrollTop,s=i>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=i;for(let o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}let a=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&a){if(r(o),!i)return;continue}!s&&!a&&r(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;let t=p.find(Qe,this._config.target);for(let e of t){if(!e.hash||H(e))continue;let r=p.findOne(decodeURI(e.hash),this._element);et(r)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,r))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(Ct),this._activateParents(t),u.trigger(this._element,Bs,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains(Fs)){p.findOne(Qs,t.closest(Gs)).classList.add(Ct);return}for(let e of p.parents(t,Ys))for(let r of p.prev(e,zs))r.classList.add(Ct)}_clearActiveClass(t){t.classList.remove(Ct);let e=p.find(`${Qe}.${Ct}`,t);for(let r of e)r.classList.remove(Ct)}static jQueryInterface(t){return this.each(function(){let e=n.getOrCreateInstance(this,t);if(typeof t=="string"){if(e[t]===void 0||t.startsWith("_")||t==="constructor")throw new TypeError(`No method named "${t}"`);e[t]()}})}};u.on(window,Ws,()=>{for(let n of p.find(Ks))Ht.getOrCreateInstance(n)});j(Ht);var Sr=Ht;var en=hn(qe());var Zs=/^aria-[\w-]*$/i,ie={"*":["class","dir","id","lang","role",Zs],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},ta=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),ea=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,na=(n,t)=>{let e=n.nodeName.toLowerCase();return t.includes(e)?ta.has(e)?!!ea.test(n.nodeValue):!0:t.filter(r=>r instanceof RegExp).some(r=>r.test(e))};function Nr(n,t,e){if(!n.length)return n;if(e&&typeof e=="function")return e(n);let i=new window.DOMParser().parseFromString(n,"text/html"),s=[].concat(...i.body.querySelectorAll("*"));for(let o of s){let a=o.nodeName.toLowerCase();if(!Object.keys(t).includes(a)){o.remove();continue}let l=[].concat(...o.attributes),f=[].concat(t["*"]||[],t[a]||[]);for(let c of l)na(c,f)||o.removeAttribute(c.nodeName)}return i.body.innerHTML}var ra="TemplateFactory",ia={allowList:ie,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},oa={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},sa={entry:"(string|element|function|null)",selector:"(string|element)"},Je=class extends nt{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return ia}static get DefaultType(){return oa}static get NAME(){return ra}getContent(){return Object.values(this._config.content).map(t=>this._resolvePossibleFunction(t)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){let t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(let[i,s]of Object.entries(this._config.content))this._setContent(t,s,i);let e=t.children[0],r=this._resolvePossibleFunction(this._config.extraClass);return r&&e.classList.add(...r.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(let[e,r]of Object.entries(t))super._typeCheckConfig({selector:e,entry:r},sa)}_setContent(t,e,r){let i=p.findOne(r,t);if(i){if(e=this._resolvePossibleFunction(e),!e){i.remove();return}if($(e)){this._putElementInTemplate(I(e),i);return}if(this._config.html){i.innerHTML=this._maybeSanitize(e);return}i.textContent=e}}_maybeSanitize(t){return this._config.sanitize?Nr(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return x(t,[this])}_putElementInTemplate(t,e){if(this._config.html){e.innerHTML="",e.append(t);return}e.textContent=t.textContent}},Dr=Je;var aa="tooltip",la=new Set(["sanitize","allowList","sanitizeFn"]),Ze="fade",ca="modal",oe="show",ua=".tooltip-inner",Lr=`.${ca}`,xr="hide.bs.modal",jt="hover",tn="focus",fa="click",pa="manual",da="hide",ha="hidden",ma="show",ga="shown",_a="inserted",va="click",Ea="focusin",ba="focusout",ya="mouseenter",Aa="mouseleave",Ta={AUTO:"auto",TOP:"top",RIGHT:V()?"left":"right",BOTTOM:"bottom",LEFT:V()?"right":"left"},wa={allowList:ie,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},Oa={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"},se=class n extends W{constructor(t,e){if(typeof en=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return wa}static get DefaultType(){return Oa}static get NAME(){return aa}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),u.off(this._element.closest(Lr),xr,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;let t=u.trigger(this._element,this.constructor.eventName(ma)),r=(he(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!r)return;this._disposePopper();let i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));let{container:s}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(i),u.trigger(this._element,this.constructor.eventName(_a))),this._popper=this._createPopper(i),i.classList.add(oe),"ontouchstart"in document.documentElement)for(let a of[].concat(...document.body.children))u.on(a,"mouseover",mt);let o=()=>{u.trigger(this._element,this.constructor.eventName(ga)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(o,this.tip,this._isAnimated())}hide(){if(!this._isShown()||u.trigger(this._element,this.constructor.eventName(da)).defaultPrevented)return;if(this._getTipElement().classList.remove(oe),"ontouchstart"in document.documentElement)for(let i of[].concat(...document.body.children))u.off(i,"mouseover",mt);this._activeTrigger[fa]=!1,this._activeTrigger[tn]=!1,this._activeTrigger[jt]=!1,this._isHovered=null;let r=()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),u.trigger(this._element,this.constructor.eventName(ha)))};this._queueCallback(r,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){let e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Ze,oe),e.classList.add(`bs-${this.constructor.NAME}-auto`);let r=gn(this.constructor.NAME).toString();return e.setAttribute("id",r),this._isAnimated()&&e.classList.add(Ze),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Dr({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[ua]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ze)}_isShown(){return this.tip&&this.tip.classList.contains(oe)}_createPopper(t){let e=x(this._config.placement,[this,t,this._element]),r=Ta[e.toUpperCase()];return en.createPopper(this._element,t,this._getPopperConfig(r))}_getOffset(){let{offset:t}=this._config;return typeof t=="string"?t.split(",").map(e=>Number.parseInt(e,10)):typeof t=="function"?e=>t(e,this._element):t}_resolvePossibleFunction(t){return x(t,[this._element])}_getPopperConfig(t){let e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:r=>{this._getTipElement().setAttribute("data-popper-placement",r.state.placement)}}]};return{...e,...x(this._config.popperConfig,[e])}}_setListeners(){let t=this._config.trigger.split(" ");for(let e of t)if(e==="click")u.on(this._element,this.constructor.eventName(va),this._config.selector,r=>{this._initializeOnDelegatedTarget(r).toggle()});else if(e!==pa){let r=e===jt?this.constructor.eventName(ya):this.constructor.eventName(Ea),i=e===jt?this.constructor.eventName(Aa):this.constructor.eventName(ba);u.on(this._element,r,this._config.selector,s=>{let o=this._initializeOnDelegatedTarget(s);o._activeTrigger[s.type==="focusin"?tn:jt]=!0,o._enter()}),u.on(this._element,i,this._config.selector,s=>{let o=this._initializeOnDelegatedTarget(s);o._activeTrigger[s.type==="focusout"?tn:jt]=o._element.contains(s.relatedTarget),o._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},u.on(this._element.closest(Lr),xr,this._hideModalHandler)}_fixTitle(){let t=this._element.getAttribute("title");t&&(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){let e=B.getDataAttributes(this._element);for(let r of Object.keys(e))la.has(r)&&delete e[r];return t={...e,...typeof t=="object"&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=t.container===!1?document.body:I(t.container),typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),typeof t.title=="number"&&(t.title=t.title.toString()),typeof t.content=="number"&&(t.content=t.content.toString()),t}_getDelegateConfig(){let t={};for(let[e,r]of Object.entries(this._config))this.constructor.Default[e]!==r&&(t[e]=r);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each(function(){let e=n.getOrCreateInstance(this,t);if(typeof t=="string"){if(typeof e[t]=="undefined")throw new TypeError(`No method named "${t}"`);e[t]()}})}};j(se);var nn=se;var tc={Tab:Pn,Modal:zn,Collapse:Re,Dropdown:wr,ScrollSpy:Sr,Tooltip:nn};window.Collapse=Re;window.Tooltip=nn;})(); diff --git a/docs/js/bundle.min.68e80f383e0615acc689eae489a8c1d728bea3861d874ec1044cc85566fd9ff1b10385a1feadd324701c587f66e425bc.js b/docs/js/bundle.min.68e80f383e0615acc689eae489a8c1d728bea3861d874ec1044cc85566fd9ff1b10385a1feadd324701c587f66e425bc.js new file mode 100644 index 000000000000..2b60e060a1f9 --- /dev/null +++ b/docs/js/bundle.min.68e80f383e0615acc689eae489a8c1d728bea3861d874ec1044cc85566fd9ff1b10385a1feadd324701c587f66e425bc.js @@ -0,0 +1,24 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs=t()}(this,function(){"use strict";var d,b,y=1e3,v=6e4,_=36e5,p="millisecond",l="second",c="minute",r="hour",s="day",h="week",n="month",w="quarter",o="year",a="date",j="Invalid Date",C=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,O=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,x={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(e){var t=["th","st","nd","rd"],n=e%100;return"["+e+(t[(n-20)%10]||t[n]||t[0])+"]"}},f=function(e,t,n){var s=String(e);return!s||s.length>=t?e:""+Array(t+1-s.length).join(n)+e},E={s:f,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),s=Math.floor(n/60),o=n%60;return(t<=0?"+":"-")+f(s,2,"0")+":"+f(o,2,"0")},m:function e(t,s){if(t.date()1)return e(r[0])}}else c=t.name,i[c]=t,o=c;return!s&&o&&(u=o),o||!s&&u},t=function(e,t){if(g(e))return e.clone();var n="object"==typeof t?t:{};return n.date=e,n.args=arguments,new d(n)},e=E;return e.l=m,e.i=g,e.w=function(e,n){return t(e,{locale:n.$L,utc:n.$u,x:n.$x,$offset:n.$offset})},d=function(){function u(e){this.$L=m(e.locale,null,!0),this.parse(e)}var d=u.prototype;return d.parse=function(t){this.$d=function(t){var n,o,i,s=t.date,a=t.utc;return null===s?new Date(NaN):e.u(s)?new Date:s instanceof Date?new Date(s):"string"==typeof s&&!/Z$/i.test(s)&&(n=s.match(C),n)?(o=n[2]-1||0,i=(n[7]||"0").substring(0,3),a?new Date(Date.UTC(n[1],o,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)):new Date(n[1],o,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)):new Date(s)}(t),this.$x=t.x||{},this.init()},d.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},d.$utils=function(){return e},d.isValid=function(){return this.$d.toString()!==j},d.isSame=function(e,n){var s=t(e);return this.startOf(n)<=s&&s<=this.endOf(n)},d.isAfter=function(e,n){return t(e)=0&&n.item(t)!==this;);return t>-1});e&&e!==document;e=e.parentNode)if(e.matches(t))return e;return null}function activateMenu(){var e,t,n,s,i,a,o=document.getElementsByClassName("sub-menu-item");if(o){e=null;for(n=0;n{e.addEventListener("click",function(){document.getElementsByClassName("page-wrapper")[0].classList.add("toggled")})})}if(document.getElementById("navigation")){elements=document.getElementById("navigation").getElementsByTagName("a");for(var elements,i=0,len=elements.length,mybutton,ddmenu,sanitizeHTML;i=50||document.documentElement.scrollTop>=50?e.classList.add("nav-sticky"):e.classList.remove("nav-sticky"))}window.addEventListener("scroll",e=>{e.preventDefault(),windowScroll()}),mybutton=document.getElementById("back-to-top"),window.onscroll=function(){scrollFunction()};function scrollFunction(){mybutton!=null&&(document.body.scrollTop>500||document.documentElement.scrollTop>500?mybutton.style.display="block":mybutton.style.display="none")}function topFunction(){document.body.scrollTop=0,document.documentElement.scrollTop=0}if(document.getElementsByClassName("dd-menu")){ddmenu=document.getElementsByClassName("dd-menu");for(i=0,len=ddmenu.length;inew Tooltip(e));sanitizeHTML=function(e){return e.replace(/[^\w. ]/gi,function(e){return"&#"+e.charCodeAt(0)+";"})},!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).docsearch=t()}(this,function(){"use strict";function Kt(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function s(e){for(var t,n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function he(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(n=e==null?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"],n==null)return;var n,i,a,s=[],o=!0,r=!1;try{for(n=n.call(e);!(o=(i=n.next()).done)&&(s.push(i.value),!t||s.length!==t);o=!0);}catch(e){r=!0,a=e}finally{try{o||null==n.return||n.return()}finally{if(r)throw a}}return s}(e,t)||us(e,t)||function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function pe(e){return function(e){if(Array.isArray(e))return Ae(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||us(e)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function us(e,t){if(e){if("string"==typeof e)return Ae(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ae(e,t):void 0}}function Ae(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,s=new Array(t);n3)for(n=[n],s=3;s0?I(d.type,d.props,d.key,null,d.__v):d)){if(d.__=n,d.__b=n.__b+1,null===(m=f[h])||m&&d.key==m.key&&d.type===m.type)f[h]=void 0;else for(g=0;g3)for(n=[n],s=3;s=s.__.length&&s.__.push({}),s.__[e]}function yn(e){return b=1,bn(dn,e)}function bn(e,t,n){var s=Q(g++,2);return s.t=e,s.__c||(s.__=[n?n(t):dn(void 0,t),function(e){var t=s.t(s.__[0],e);s.__[0]!==t&&(s.__=[t,s.__[1]],s.__c.setState({}))}],s.__c=i),s.__}function gn(e,n){var s=Q(g++,3);!t.__s&&De(s.__H,n)&&(s.__=e,s.__H=n,i.__H.__h.push(s))}function pn(e,n){var s=Q(g++,4);!t.__s&&De(s.__H,n)&&(s.__=e,s.__H=n,i.__h.push(s))}function Ie(e,t){var n=Q(g++,7);return De(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function si(){Ge.forEach(function(e){if(e.__P)try{e.__H.__h.forEach(le),e.__H.__h.forEach(Ne),e.__H.__h=[]}catch(n){e.__H.__h=[],t.__e(n,e.__v)}}),Ge=[]}t.__b=function(e){i=null,Sn&&Sn(e)},t.__r=function(e){An&&An(e),g=0;var t=(i=e.__c).__H;t&&(t.__h.forEach(le),t.__h.forEach(Ne),t.__h=[])},t.diffed=function(e){kn&&kn(e);var n=e.__c;n&&n.__H&&n.__H.__h.length&&(1!==Ge.push(n)&&Mn===t.requestAnimationFrame||((Mn=t.requestAnimationFrame)||function(e){var t,n=function(){clearTimeout(s),Le&&cancelAnimationFrame(t),setTimeout(e)},s=setTimeout(n,100);Le&&(t=requestAnimationFrame(n))})(si)),i=void 0},t.__c=function(e,n){n.some(function(e){try{e.__h.forEach(le),e.__h=e.__h.filter(function(e){return!e.__||Ne(e)})}catch(s){n.some(function(e){e.__h&&(e.__h=[])}),n=[],t.__e(s,e.__v)}}),xn&&xn(e,n)},t.unmount=function(e){On&&On(e);var n=e.__c;if(n&&n.__H)try{n.__H.__.forEach(le)}catch(e){t.__e(e,n.__v)}},Le="function"==typeof requestAnimationFrame;function le(e){var t=i;"function"==typeof e.__c&&e.__c(),i=t}function Ne(e){var t=i;e.__c=e.__(),i=t}function De(e,t){return!e||e.length!==t.length||t.some(function(t,n){return t!==e[n]})}function dn(e,t){return"function"==typeof t?t(e):t}function cn(e,t){for(var n in t)e[n]=t[n];return e}function ze(e,t){for(var s in e)if("__source"!==s&&!(s in t))return!0;for(var n in t)if("__source"!==n&&e[n]!==t[n])return!0;return!1}function Fe(e){this.props=e}(Fe.prototype=new a).isPureReactComponent=!0,Fe.prototype.shouldComponentUpdate=function(e,t){return ze(this.props,e)||ze(this.state,t)},Me=t.__b,t.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),Me&&Me(e)};var ni="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911,an=function(e,t){return e==null?null:l(l(e).map(t))},ti={map:an,forEach:an,count:function(e){return e?l(e).length:0},only:function(e){var t=l(e);if(1!==t.length)throw"Children.only";return t[0]},toArray:l},Qo=t.__e;function _e(){this.__u=0,this.t=null,this.__b=null}function en(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}function F(){this.u=null,this.o=null}t.__e=function(e,t,n){if(e.then)for(var s,o=t;o=o.__;)if((s=o.__c)&&s.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),s.__c(e,t);Qo(e,t,n)},(_e.prototype=new a).__c=function(e,t){s=t.__c,n=this,null==n.t&&(n.t=[]),n.t.push(s);var n,s,i,c,a=en(n.__v),r=!1,o=function(){r||(r=!0,s.componentWillUnmount=s.__c,a?a(i):i())};s.__c=s.componentWillUnmount,s.componentWillUnmount=function(){o(),s.__c&&s.__c()},i=function(){if(!--n.__u){if(n.state.__e){var t,e=n.state.__e;n.__v.__k[0]=function e(t,n,s){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map(function(t){return e(t,n,s)}),t.__c&&t.__c.__P===n&&(t.__e&&s.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=s)),t}(e,e.__c.__P,e.__c.__O)}for(n.setState({__e:n.__b=null});t=n.t.pop();)t.forceUpdate()}},c=!0===t.__h,n.__u++||c||n.setState({__e:n.__b=n.__v.__k[0]}),e.then(o,o)},_e.prototype.componentWillUnmount=function(){this.t=[]},_e.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n,o=document.createElement("div"),s=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,n,s){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach(function(e){"function"==typeof e.__c&&e.__c()}),t.__c.__H=null),null!=(t=cn({},t)).__c&&(t.__c.__P===s&&(t.__c.__P=n),t.__c=null),t.__k=t.__k&&t.__k.map(function(t){return e(t,n,s)})),t}(this.__b,o,s.__O=s.__P)}this.__b=null}return n=t.__e&&r(u,null,e.fallback),n&&(n.__h=null),[r(u,null,t.__e?null:e.children),n]},Ee=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),V(r(Yo,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function Yt(e,t){return r(qo,{__v:e,i:t})}(F.prototype=new a).__e=function(e){var t=this,s=en(t.__v),n=t.o.get(e);return n[0]++,function(o){var i=function(){t.props.revealOrder?(n.push(o),Ee(t,e,n)):o()};s?s(i):i()}},F.prototype.render=function(e){this.u=null,this.o=new Map;var n,t=l(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},F.prototype.componentDidUpdate=F.prototype.componentDidMount=function(){var e=this;this.o.forEach(function(t,n){Ee(e,n,t)})};var qt="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,js=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ko=function(e){return("undefined"!=typeof Symbol&&"symbol"==L(Symbol())?/fil|che|rad/i:/fil|che|ra/i).test(e)};function Vt(e,t,n){return null==t.__k&&(t.textContent=""),V(e,t),"function"==typeof n&&n(),e?e.__c:null}a.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(e){Object.defineProperty(a.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}),Te=t.event;function Wo(){}function $o(){return this.cancelBubble}function Vo(){return this.defaultPrevented}t.event=function(e){return Te&&(e=Te(e)),e.persist=Wo,e.isPropagationStopped=$o,e.isDefaultPrevented=Vo,e.nativeEvent=e},Re={configurable:!0,get:function(){return this.class}},Pe=t.vnode,t.vnode=function(e){var t,o,i=e.type,n=e.props,s=n;if("string"==typeof i){for(t in s={},n)o=n[t],"value"===t&&"defaultValue"in n&&o==null||("defaultValue"===t&&"value"in n&&null==n.value?t="value":"download"===t&&!0===o?o="":/ondoubleclick/i.test(t)?t="ondblclick":/^onchange(textarea|input)/i.test(t+i)&&!Ko(n.type)?t="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(t)?t=t.toLowerCase():js.test(t)?t=t.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===o&&(o=void 0),s[t]=o);"select"==i&&s.multiple&&Array.isArray(s.value)&&(s.value=l(n.children).forEach(function(e){e.props.selected=-1!=s.value.indexOf(e.props.value)})),"select"==i&&null!=s.defaultValue&&(s.value=l(n.children).forEach(function(e){e.props.selected=s.multiple?-1!=s.defaultValue.indexOf(e.props.value):s.defaultValue==e.props.value})),e.props=s}i&&n.class!=n.className&&(Re.enumerable="className"in n,null!=n.className&&(s.class=n.className),Object.defineProperty(s,"className",Re)),e.$$typeof=qt,Pe&&Pe(e)},He=t.__r,t.__r=function(e){He&&He(e),zt=e.__c},Tt={ReactCurrentDispatcher:{current:{readContext:function(e){return zt.__n[e.__c].props.value}}}},"object"==("undefined"==typeof performance?"undefined":L(performance))&&"function"==typeof performance.now&&performance.now.bind(performance);function Ft(e){return!!e&&e.$$typeof===qt}e={useState:yn,useReducer:bn,useEffect:gn,useLayoutEffect:pn,useRef:function(e){return b=5,Ie(function(){return{current:e}},[])},useImperativeHandle:function(e,t,n){b=6,pn(function(){"function"==typeof e?e(t()):e&&(e.current=t())},n==null?n:n.concat(e))},useMemo:Ie,useCallback:function(e,t){return b=8,Ie(function(){return e},t)},useContext:function(e){var t=i.context[e.__c],n=Q(g++,9);return n.__c=e,t?(null==n.__&&(n.__=!0,t.sub(i)),t.props.value):e.__},useDebugValue:function(e,n){t.useDebugValue&&t.useDebugValue(n?n(e):e)},version:"16.8.0",Children:ti,render:Vt,hydrate:function(e,t,n){return Fn(e,t),"function"==typeof n&&n(),e?e.__c:null},unmountComponentAtNode:function(e){return!!e.__k&&(V(null,e),!0)},createPortal:Yt,createElement:r,createContext:function(e,t){var n={__c:t="__cC"+hi++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,s;return this.getChildContext||(n=[],(s={})[t]=this,this.getChildContext=function(){return s},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(at)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n},createFactory:function(e){return r.bind(null,e)},cloneElement:function(e){return Ft(e)?oi.apply(null,arguments):e},createRef:function(){return{current:null}},Fragment:u,isValidElement:Ft,findDOMNode:function(e){return e&&(e.base||1===e.nodeType&&e)||null},Component:a,PureComponent:Fe,memo:function(e,t){function s(e){var n=this.props.ref,s=n==e.ref;return!s&&n&&(n.call?n(null):n.current=null),t?!t(this.props,e)||!s:ze(this.props,e)}function n(t){return this.shouldComponentUpdate=s,r(e,t)}return n.displayName="Memo("+(e.displayName||e.name)+")",n.prototype.isReactComponent=!0,n.__f=!0,n},forwardRef:function(e){function t(t,n){var s=cn({},t);return delete s.ref,e(s,(n=t.ref||n)&&("object"!=L(n)||"current"in n)?n:null)}return t.$$typeof=ni,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t},unstable_batchedUpdates:function(e,t){return e(t)},StrictMode:u,Suspense:_e,SuspenseList:F,lazy:function(e){var t,n,s;function o(o){if(t||(t=e()).then(function(e){n=e.default||e},function(e){s=e}),s)throw s;if(!n)throw t;return r(n,o)}return o.displayName="Lazy",o.__f=!0,o},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Tt};function Ho(){return e.createElement("svg",{width:"44",height:"15",className:"DocSearch-Control-Key-Icon"},e.createElement("path",{d:"M2.118,11.5A1.519,1.519,0,0,1,1,11.042,1.583,1.583,0,0,1,1,8.815a1.519,1.519,0,0,1,1.113-.458h.715V6.643H2.118A1.519,1.519,0,0,1,1,6.185,1.519,1.519,0,0,1,.547,5.071,1.519,1.519,0,0,1,1,3.958,1.519,1.519,0,0,1,2.118,3.5a1.519,1.519,0,0,1,1.114.458A1.519,1.519,0,0,1,3.69,5.071v.715H5.4V5.071A1.564,1.564,0,0,1,6.976,3.5,1.564,1.564,0,0,1,8.547,5.071,1.564,1.564,0,0,1,6.976,6.643H6.261V8.357h.715a1.575,1.575,0,0,1,1.113,2.685,1.583,1.583,0,0,1-2.227,0A1.519,1.519,0,0,1,5.4,9.929V9.214H3.69v.715a1.519,1.519,0,0,1-.458,1.113A1.519,1.519,0,0,1,2.118,11.5Zm0-.857a.714.714,0,0,0,.715-.714V9.214H2.118a.715.715,0,1,0,0,1.429Zm4.858,0a.715.715,0,1,0,0-1.429H6.261v.715a.714.714,0,0,0,.715.714ZM3.69,8.357H5.4V6.643H3.69ZM2.118,5.786h.715V5.071a.714.714,0,0,0-.715-.714.715.715,0,0,0-.5,1.22A.686.686,0,0,0,2.118,5.786Zm4.143,0h.715a.715.715,0,0,0,.5-1.22.715.715,0,0,0-1.22.5Z",fill:"currentColor"}),e.createElement("path",{d:"M12.4,11.475H11.344l3.879-7.95h1.056Z",fill:"currentColor"}),e.createElement("path",{d:"M25.073,5.384l-.864.576a2.121,2.121,0,0,0-1.786-.923,2.207,2.207,0,0,0-2.266,2.326,2.206,2.206,0,0,0,2.266,2.325,2.1,2.1,0,0,0,1.782-.918l.84.617a3.108,3.108,0,0,1-2.622,1.293,3.217,3.217,0,0,1-3.349-3.317,3.217,3.217,0,0,1,3.349-3.317A3.046,3.046,0,0,1,25.073,5.384Z",fill:"currentColor"}),e.createElement("path",{d:"M30.993,5.142h-2.07v5.419H27.891V5.142h-2.07V4.164h5.172Z",fill:"currentColor"}),e.createElement("path",{d:"M34.67,4.164c1.471,0,2.266.658,2.266,1.851,0,1.087-.832,1.809-2.134,1.855l2.107,2.691h-1.28L33.591,7.87H33.07v2.691H32.038v-6.4Zm-1.6.969v1.8h1.572c.832,0,1.22-.3,1.22-.918s-.411-.882-1.22-.882Z",fill:"currentColor"}),e.createElement("path",{d:"M42.883,10.561H38.31v-6.4h1.033V9.583h3.54Z",fill:"currentColor"}))}function Ro(){return e.createElement("svg",{width:"15",height:"15",className:"DocSearch-Button-Key-Icon"},e.createElement("path",{d:"M3.193,7.971H2.576V10.7H1.542V4.3H2.576V6.993h.631L5.611,4.3H6.946L4.066,7.422,7.142,10.7h-1.4Z",fill:"currentColor"}))}function Et(){return e.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},e.createElement("path",{d:"m15.938 17-4.98-4.979q-.625.458-1.375.719Q8.833 13 8 13q-2.083 0-3.542-1.458Q3 10.083 3 8q0-2.083 1.458-3.542Q5.917 3 8 3q2.083 0 3.542 1.458Q13 5.917 13 8q0 .833-.26 1.583-.261.75-.719 1.375L17 15.938ZM8 11.5q1.458 0 2.479-1.021Q11.5 9.458 11.5 8q0-1.458-1.021-2.479Q9.458 4.5 8 4.5q-1.458 0-2.479 1.021Q4.5 6.542 4.5 8q0 1.458 1.021 2.479Q6.542 11.5 8 11.5Z",fill:"currentColor",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}Ct=["translations"];function qe(){return qe=Object.assign||function(e){for(var t,s,n=1;ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}fe="Ctrl",wt=e.forwardRef(function(t,n){var o=t.translations,i=void 0===o?{}:o,d=No(t,Ct),a=i.buttonText,u=void 0===a?"Search":a,r=i.buttonAriaLabel,h=void 0===r?"Search":r,c=Lo(yn(null),2),s=c[0],l=c[1];return gn(function(){"undefined"!=typeof navigator&&l(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":fe)},[]),e.createElement("button",qe({type:"button",className:"DocSearch DocSearch-Button","aria-label":h},d,{ref:n}),e.createElement("span",{className:"DocSearch-Button-Container"},e.createElement(Et,null),e.createElement("span",{className:"DocSearch-Button-Placeholder"},u)),e.createElement("span",{className:"DocSearch-Button-Keys"},null!==s&&e.createElement(e.Fragment,null,e.createElement("kbd",{className:"DocSearch-Command-Key"},s===fe?e.createElement(Ho,null):s),e.createElement("kbd",{className:"DocSearch-Button-Key"},s===fe?e.createElement(Ro,null):s))))});function yt(e,t){var n=void 0;return function(){for(var o=arguments.length,i=new Array(o),s=0;se.length)&&(t=e.length);for(var n=0,s=new Array(t);ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function gt(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function C(e){for(var t,n=1;n1&&void 0!==arguments[1]?arguments[1]:20,s=[],t=0;t=3||2===n&&o>=4||1===n&&o>=10);function t(t,n,s){if(i&&void 0!==s){var o=s[0].__autocomplete_algoliaCredentials,a={"X-Algolia-Application-Id":o.appId,"X-Algolia-API-Key":o.apiKey};e.apply(void 0,[t].concat(be(n),[{headers:a}]))}else e.apply(void 0,[t].concat(be(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var s=arguments.length,e=new Array(s),n=0;n0&&t("clickedObjectIDsAfterSearch",ge(e),e[0].items)},clickedObjectIDs:function(){for(var s=arguments.length,e=new Array(s),n=0;n0&&t("clickedObjectIDs",ge(e),e[0].items)},clickedFilters:function(){for(var s=arguments.length,n=new Array(s),t=0;t0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var s=arguments.length,e=new Array(s),n=0;n0&&t("convertedObjectIDsAfterSearch",ge(e),e[0].items)},convertedObjectIDs:function(){for(var s=arguments.length,e=new Array(s),n=0;n0&&t("convertedObjectIDs",ge(e),e[0].items)},convertedFilters:function(){for(var s=arguments.length,n=new Array(s),t=0;t0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var s=arguments.length,n=new Array(s),e=0;e0&&n.reduce(function(e,t){var n=t.items,s=pt(t,ut);return[].concat(be(e),be(To(C(C({},s),{},{objectIDs:n?.map(function(e){return e.objectID})||s.objectIDs})).map(function(e){return{items:n,payload:e}})))},[]).forEach(function(e){var n=e.items;return t("viewedObjectIDs",[e.payload],n)})},viewedFilters:function(){for(var s=arguments.length,n=new Array(s),t=0;t0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function So(e){var t=e.items.reduce(function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e},{});return Object.keys(t).map(function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}})}function Xe(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function G(e){return G="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},G(e)}function y(e){return function(e){if(Array.isArray(e))return Ue(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Ue(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ue(e,t)}(e)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function Ue(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,s=new Array(t);n0&&Eo({onItemsChange:a,items:t,insights:s,state:n})))},0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var n=e.setContext,i=e.onSelect,a=e.onActive;t("addAlgoliaAgent","insights-plugin"),n({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:s}}),i(function(e){var t=e.item,n=e.state,i=e.event;Xe(t)&&r({state:n,event:i,insights:s,item:t,insightsEvents:[d({eventName:"Item Selected"},mn({item:t,items:o.current}))]})}),a(function(e){var t=e.item,n=e.state,i=e.event;Xe(t)&&c({state:n,event:i,insights:s,item:t,insightsEvents:[d({eventName:"Item Active"},mn({item:t,items:o.current}))]})})},onStateChange:function(e){var t=e.state;l({state:t})},__autocomplete_pluginOptions:e}}function de(e,t){var n=t;return{then:function(t,s){return de(e.then(ue(t,n,e),ue(s,n,e)),n)},catch:function(t){return de(e.catch(ue(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),de(e.finally(ue(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach(function(e){e()})},isCanceled:function(){return!0===n.isCanceled}}}function Nt(e){return de(e,{isCanceled:!1,onCancelList:[]})}function ue(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function Rt(e,t,n,s){if(!n)return null;if(e<0&&(null===t||null!==s&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===s?null:0:o}function Pt(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function Ht(e){for(var t,n=1;ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n0},reshape:function(e){return e.sources}},e),{},{id:null!==(o=e.id)&&void 0!==o?o:"autocomplete-".concat(vt++),plugins:n,initialState:_({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var s;null===(s=e.onStateChange)||void 0===s||s.call(e,t),n.forEach(function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)})},onSubmit:function(t){var s;null===(s=e.onSubmit)||void 0===s||s.call(e,t),n.forEach(function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)})},onReset:function(t){var s;null===(s=e.onReset)||void 0===s||s.call(e,t),n.forEach(function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)})},getSources:function(s){return Promise.all([].concat(bo(n.map(function(e){return e.getSources})),[e.getSources]).filter(Boolean).map(function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then(function(e){return Promise.all(e.filter(function(e){return Boolean(e)}).map(function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var s,t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:T,onResolve:T};return Object.keys(t).forEach(function(e){t[e].__default=!0}),s=Ht(Ht({},t),e),Promise.resolve(s)}))})}(e,s)})).then(function(e){return P(e)}).then(function(e){return e.map(function(e){return _(_({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach(function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)})},onActive:function(n){e.onActive(n),t.forEach(function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)})},onResolve:function(n){e.onResolve(n),t.forEach(function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)})}})})})},navigator:_({navigate:function(e){var t=e.itemUrl;s.location.assign(t)},navigateNewTab:function(e){var n=e.itemUrl,t=s.open(n,"_blank","noopener");t==null||t.focus()},navigateNewWindow:function(e){var t=e.itemUrl;s.open(t,"_blank","noopener")}},e.navigator)})}function N(e){return N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},N(e)}function rn(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function oe(e){for(var t,n=1;ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}w=null,Qe=(En=-1,We=-1,me=void 0,function(e){var t=++En;return Promise.resolve(e).then(function(e){return me&&t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function R(e){return R="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},R(e)}var Zs=["props","refresh","store"],Qs=["inputElement","formElement","panelElement"],Gs=["inputElement"],Ys=["inputElement","maxLength"],qs=["sourceIndex"],Us=["sourceIndex"],Ws=["item","source","sourceIndex"];function Kn(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function o(e){for(var t,n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Vs(e){var n=e.props,s=e.refresh,t=e.store,i=f(e,Zs),a=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var s=e.inputElement,a=e.formElement,r=e.panelElement;function i(e){!t.getState().isOpen&&t.pendingRequests.isEmpty()||e.target===s||!1===[a,r].some(function(t){return n=t,s=e.target,n===s||n.contains(s);var n,s})&&(t.dispatch("blur",null),n.debug||t.pendingRequests.cancelAll())}return o({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==t.getState().isOpen&&s===n.environment.document.activeElement&&e.target!==s&&s.blur()}},f(e,Qs))},getRootProps:function(e){return o({role:"combobox","aria-expanded":t.getState().isOpen,"aria-haspopup":"listbox","aria-owns":t.getState().isOpen?"".concat(n.id,"-list"):void 0,"aria-labelledby":"".concat(n.id,"-label")},e)},getFormProps:function(e){return e.inputElement,o({action:"",noValidate:!0,role:"search",onSubmit:function(a){var r;a.preventDefault(),n.onSubmit(o({event:a,refresh:s,state:t.getState()},i)),t.dispatch("submit",null),null===(r=e.inputElement)||void 0===r||r.blur()},onReset:function(a){var r;a.preventDefault(),n.onReset(o({event:a,refresh:s,state:t.getState()},i)),t.dispatch("reset",null),null===(r=e.inputElement)||void 0===r||r.focus()}},f(e,Gs))},getLabelProps:function(e){var t=e||{},s=t.sourceIndex,i=f(t,qs);return o({htmlFor:"".concat(a(n.id,s),"-input"),id:"".concat(a(n.id,s),"-label")},i)},getInputProps:function(e){function c(e){(n.openOnFocus||Boolean(t.getState().query))&&v(o({event:e,props:n,query:t.getState().completion||t.getState().query,refresh:s,store:t},i)),t.dispatch("focus",null)}var a,r=e||{},l=(r.inputElement,r.maxLength),d=void 0===l?512:l,h=f(r,Ys),u=p(t.getState()),g=function(e){return Boolean(e&&e.match($t))}((null===(a=n.environment.navigator)||void 0===a?void 0:a.userAgent)||""),b=u!=null&&u.itemUrl&&!g?"go":"search";return o({"aria-autocomplete":"both","aria-activedescendant":t.getState().isOpen&&null!==t.getState().activeItemId?"".concat(n.id,"-item-").concat(t.getState().activeItemId):void 0,"aria-controls":t.getState().isOpen?"".concat(n.id,"-list"):void 0,"aria-labelledby":"".concat(n.id,"-label"),value:t.getState().completion||t.getState().query,id:"".concat(n.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:b,spellCheck:"false",autoFocus:n.autoFocus,placeholder:n.placeholder,maxLength:d,type:"search",onChange:function(e){v(o({event:e,props:n,query:e.currentTarget.value.slice(0,d),refresh:s,store:t},i))},onKeyDown:function(e){!function(e){var u,h,n=e.event,s=e.props,a=e.refresh,t=e.store,r=Js(e,zn);if("ArrowUp"===n.key||"ArrowDown"===n.key)u=function(){var e=s.environment.document.getElementById("".concat(s.id,"-item-").concat(t.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},h=function(){if(e=p(t.getState()),null!==t.getState().activeItemId&&e){var e,o=e.item,i=e.itemInputValue,c=e.itemUrl,s=e.source;s.onActive(m({event:n,item:o,itemInputValue:i,itemUrl:c,refresh:a,source:s,state:t.getState()},r))}},n.preventDefault(),!1===t.getState().isOpen&&(s.openOnFocus||Boolean(t.getState().query))?v(m({event:n,props:s,query:t.getState().query,refresh:a,store:t},r)).then(function(){t.dispatch(n.key,{nextActiveItemId:s.defaultActiveItemId}),h(),setTimeout(u,0)}):(t.dispatch(n.key,{}),h(),u());else if("Escape"===n.key)n.preventDefault(),t.dispatch(n.key,null),t.pendingRequests.cancelAll();else if("Tab"===n.key)t.dispatch("blur",null),t.pendingRequests.cancelAll();else if("Enter"===n.key){if(null===t.getState().activeItemId||t.getState().collections.every(function(e){return 0===e.items.length}))return void(s.debug||t.pendingRequests.cancelAll());n.preventDefault();var d=p(t.getState()),c=d.item,l=d.itemInputValue,o=d.itemUrl,i=d.source;if(n.metaKey||n.ctrlKey)void 0!==o&&(i.onSelect(m({event:n,item:c,itemInputValue:l,itemUrl:o,refresh:a,source:i,state:t.getState()},r)),s.navigator.navigateNewTab({itemUrl:o,item:c,state:t.getState()}));else if(n.shiftKey)void 0!==o&&(i.onSelect(m({event:n,item:c,itemInputValue:l,itemUrl:o,refresh:a,source:i,state:t.getState()},r)),s.navigator.navigateNewWindow({itemUrl:o,item:c,state:t.getState()}));else if(n.altKey);else{if(void 0!==o)return i.onSelect(m({event:n,item:c,itemInputValue:l,itemUrl:o,refresh:a,source:i,state:t.getState()},r)),void s.navigator.navigate({itemUrl:o,item:c,state:t.getState()});v(m({event:n,nextState:{isOpen:!1},props:s,query:l,refresh:a,store:t},r)).then(function(){i.onSelect(m({event:n,item:c,itemInputValue:l,itemUrl:o,refresh:a,source:i,state:t.getState()},r))})}}}(o({event:e,props:n,refresh:s,store:t},i))},onFocus:c,onBlur:T,onClick:function(s){e.inputElement!==n.environment.document.activeElement||t.getState().isOpen||c(s)}},h)},getPanelProps:function(e){return o({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){t.dispatch("mouseleave",null)}},e)},getListProps:function(e){var t=e||{},s=t.sourceIndex,i=f(t,Us);return o({role:"listbox","aria-labelledby":"".concat(a(n.id,s),"-label"),id:"".concat(a(n.id,s),"-list")},i)},getItemProps:function(e){var r=e.item,c=e.source,l=e.sourceIndex,d=f(e,Ws);return o({id:"".concat(a(n.id,l),"-item-").concat(r.__autocomplete_id),role:"option","aria-selected":t.getState().activeItemId===r.__autocomplete_id,onMouseMove:function(e){if(r.__autocomplete_id!==t.getState().activeItemId&&(t.dispatch("mousemove",r.__autocomplete_id),n=p(t.getState()),null!==t.getState().activeItemId&&n)){var n,c=n.item,l=n.itemInputValue,d=n.itemUrl,a=n.source;a.onActive(o({event:e,item:c,itemInputValue:l,itemUrl:d,refresh:s,source:a,state:t.getState()},i))}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=c.getItemInputValue({item:r,state:t.getState()}),l=c.getItemUrl({item:r,state:t.getState()});(l?Promise.resolve():v(o({event:e,nextState:{isOpen:!1},props:n,query:a,refresh:s,store:t},i))).then(function(){c.onSelect(o({event:e,item:r,itemInputValue:a,itemUrl:l,refresh:s,source:c,state:t.getState()},i))})}},d)}}}function S(e){return S="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},S(e)}function Zn(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function Bs(e){for(var t,n=1;ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Ds(t){var i=t.translations,s=void 0===i?{}:i,n=zs(t,gs),a=s.noResultsText,d=void 0===a?"No results for":a,r=s.suggestedQueryText,u=void 0===r?"Try searching for":r,c=s.reportMissingResultsText,h=void 0===c?"Believe this query should return results?":c,l=s.reportMissingResultsLinkText,m=void 0===l?"Let us know.":l,o=n.state.context.searchSuggestions;return e.createElement("div",{className:"DocSearch-NoResults"},e.createElement("div",{className:"DocSearch-Screen-Icon"},e.createElement(As,null)),e.createElement("p",{className:"DocSearch-Title"},d,' "',e.createElement("strong",null,n.state.query),'"'),o&&o.length>0&&e.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},e.createElement("p",{className:"DocSearch-Help"},u,":"),e.createElement("ul",null,o.slice(0,3).reduce(function(t,s){return[].concat(Fs(t),[e.createElement("li",{key:s},e.createElement("button",{className:"DocSearch-Prefill",key:s,type:"button",onClick:function(){n.setQuery(s.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},s))])},[]))),n.getMissingResultsUrl&&e.createElement("p",{className:"DocSearch-Help"},"".concat(h," "),e.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},m)))}ms=["hit","attribute","tagName"];function hs(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function rs(e){for(var t,n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function ts(e,t){return t.split(".").reduce(function(e,t){return e!=null&&e[t]?e[t]:null},e)}function j(e){var t=e.hit,n=e.attribute,s=e.tagName;return r(void 0===s?"span":s,rs(rs({},Hs(e,ms)),{},{dangerouslySetInnerHTML:{__html:ts(t,"_snippetResult.".concat(n,".value"))||ts(t,n)}}))}function Xn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(n=e==null?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"],n==null)return;var n,i,a,s=[],o=!0,r=!1;try{for(n=n.call(e);!(o=(i=n.next()).done)&&(s.push(i.value),!t||s.length!==t);o=!0);}catch(e){r=!0,a=e}finally{try{o||null==n.return||n.return()}finally{if(r)throw a}}return s}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Yn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Yn(e,t)}(e,t)||function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function Yn(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,s=new Array(t);n|<\/mark>)/g,Hn=RegExp(ot.source);function Rn(e){var t,n,s,o,i,a,r=e;return!r.__docsearch_parent&&!e._highlightResult?e.hierarchy.lvl0:(t=((r.__docsearch_parent?null===(n=r.__docsearch_parent)||void 0===n||null===(s=n._highlightResult)||void 0===s||null===(o=s.hierarchy)||void 0===o?void 0:o.lvl0:null===(i=e._highlightResult)||void 0===i||null===(a=i.hierarchy)||void 0===a?void 0:a.lvl0)||{}).value,t&&Hn.test(t)?t.replace(ot,""):t)}function Je(){return Je=Object.assign||function(e){for(var t,s,n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function io(t){var c=t.translations,s=void 0===c?{}:c,n=oo(t,Cn),i=s.recentSearchesTitle,u=void 0===i?"Recent":i,a=s.noRecentSearchesText,h=void 0===a?"No recent searches":a,r=s.saveRecentSearchButtonTitle,m=void 0===r?"Save this search":r,o=s.removeRecentSearchButtonTitle,f=void 0===o?"Remove this search from history":o,l=s.favoriteSearchesTitle,p=void 0===l?"Favorite":l,d=s.removeFavoriteSearchButtonTitle,g=void 0===d?"Remove this search from favorites":d;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:e.createElement("div",{className:"DocSearch-StartScreen"},e.createElement("p",{className:"DocSearch-Help"},h)):!1===n.hasCollections?null:e.createElement("div",{className:"DocSearch-Dropdown-Container"},e.createElement(it,ne({},n,{title:u,collection:n.state.collections[0],renderIcon:function(){return e.createElement("div",{className:"DocSearch-Hit-icon"},e.createElement(ys,null))},renderAction:function(t){var s=t.item,o=t.runFavoriteTransition,i=t.runDeleteTransition;return e.createElement(e.Fragment,null,e.createElement("div",{className:"DocSearch-Hit-action"},e.createElement("button",{className:"DocSearch-Hit-action-button",title:m,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o(function(){n.favoriteSearches.add(s),n.recentSearches.remove(s),n.refresh()})}},e.createElement(vs,null))),e.createElement("div",{className:"DocSearch-Hit-action"},e.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),i(function(){n.recentSearches.remove(s),n.refresh()})}},e.createElement(Ve,null))))}})),e.createElement(it,ne({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return e.createElement("div",{className:"DocSearch-Hit-icon"},e.createElement(vs,null))},renderAction:function(t){var s=t.item,o=t.runDeleteTransition;return e.createElement("div",{className:"DocSearch-Hit-action"},e.createElement("button",{className:"DocSearch-Hit-action-button",title:g,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o(function(){n.favoriteSearches.remove(s),n.refresh()})}},e.createElement(Ve,null)))}})))}jn=["translations"];function se(){return se=Object.assign||function(e){for(var t,s,n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}vn=e.memo(function(t){var o,i=t.translations,n=void 0===i?{}:i,s=co(t,jn);return"error"===s.state.status?e.createElement(Ss,{translations:n?.errorScreen}):(o=s.state.collections.some(function(e){return e.items.length>0}),s.state.query?!1===o?e.createElement(Ds,se({},s,{translations:n?.noResultsScreen})):e.createElement(to,s):e.createElement(io,se({},s,{hasCollections:o,translations:n?.startScreen})))},function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}),ct=["translations"];function je(){return je=Object.assign||function(e){for(var t,s,n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function fo(t){var o=t.translations,s=void 0===o?{}:o,n=mo(t,ct),i=s.resetButtonTitle,l=void 0===i?"Clear the query":i,a=s.resetButtonAriaLabel,d=void 0===a?"Clear the query":a,r=s.cancelButtonText,u=void 0===r?"Cancel":r,c=s.cancelButtonAriaLabel,h=void 0===c?"Cancel":c,m=n.getFormProps({inputElement:n.inputRef.current}).onReset;return e.useEffect(function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()},[n.autoFocus,n.inputRef]),e.useEffect(function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()},[n.isFromSelection,n.inputRef]),e.createElement(e.Fragment,null,e.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:m},e.createElement("label",je({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),e.createElement(Et,null)),e.createElement("div",{className:"DocSearch-LoadingIndicator"},e.createElement(ws,null)),e.createElement("input",je({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:64}))),e.createElement("button",{type:"reset",title:l,className:"DocSearch-Reset","aria-label":d,hidden:!n.state.query},e.createElement(Ve,null))),e.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":h,onClick:n.onClose},u))}sn=["_highlightResult","_snippetResult"];function go(e,t){if(e==null)return{};var n,s,o,i=function(e,t){if(e==null)return{};var n,s,o={},i=Object.keys(e);for(s=0;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function vo(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch{return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function Jt(e){var i=e.key,s=e.limit,o=void 0===s?5:s,n=vo(i),t=n.getItem().slice(0,o);return{add:function(e){var s=e,i=(s._highlightResult,s._snippetResult,go(s,sn)),a=t.findIndex(function(e){return e.objectID===i.objectID});a>-1&&t.splice(a,1),t.unshift(i),t=t.slice(0,o),n.setItem(t)},remove:function(e){t=t.filter(function(t){return t.objectID!==e.objectID}),n.setItem(t)},getAll:function(){return t}}}Qt=["facetName","facetQuery"];function yo(e){var s,t="algoliasearch-client-js-".concat(e.key),n=function(){return void 0===s&&(s=e.localStorage||window.localStorage),s},o=function(){return JSON.parse(n().getItem(t)||"{}")};return{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then(function(){var s=JSON.stringify(e),n=o()[s];return Promise.all([n||t(),void 0!==n])}).then(function(e){var t=he(e,2),s=t[0],o=t[1];return Promise.all([s,o||n.miss(s)])}).then(function(e){return he(e,1)[0]})},set:function(e,s){return Promise.resolve().then(function(){var i=o();return i[JSON.stringify(e)]=s,n().setItem(t,JSON.stringify(i)),s})},delete:function(e){return Promise.resolve().then(function(){var s=o();delete s[JSON.stringify(e)],n().setItem(t,JSON.stringify(s))})},clear:function(){return Promise.resolve().then(function(){n().removeItem(t)})}}}function D(e){var t=pe(e.caches),n=t.shift();return void 0===n?{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then(function(e){return Promise.all([e,n.miss(e)])}).then(function(e){return he(e,1)[0]})},set:function(e,t){return Promise.resolve(t)},delete:function(){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,s){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(e,s,o).catch(function(){return D({caches:t}).get(e,s,o)})},set:function(e,s){return n.set(e,s).catch(function(){return D({caches:t}).set(e,s)})},delete:function(e){return n.delete(e).catch(function(){return D({caches:t}).delete(e)})},clear:function(){return n.clear().catch(function(){return D({caches:t}).clear()})}}}function Se(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},e={};return{get:function(n,s){var i,r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},o=JSON.stringify(n);return o in e?Promise.resolve(t.serializable?JSON.parse(e[o]):e[o]):(i=s(),r=a&&a.miss||function(){return Promise.resolve()},i.then(function(e){return r(e)}).then(function(){return i}))},set:function(n,s){return e[JSON.stringify(n)]=t.serializable?JSON.stringify(s):s,Promise.resolve(s)},delete:function(t){return delete e[JSON.stringify(t)],Promise.resolve()},clear:function(){return e={},Promise.resolve()}}}function Oo(e){for(t=e.length-1;t>0;t--){var t,n=Math.floor(Math.random()*(t+1)),s=e[t];e[t]=e[n],e[n]=s}return e}function It(e,t){return t?(Object.keys(t).forEach(function(n){e[n]=t[n](e)}),e):e}function ce(e){for(var o,n=arguments.length,s=new Array(n>1?n-1:0),t=1;t0?s:void 0,timeout:n.timeout||t,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}var O={Read:1,Write:2,Any:3},_t=1,Fo=2,jt=3,bt=12e4;function rt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:_t;return s(s({},e),{},{status:t,lastUpdate:Date.now()})}function Ot(e){return"string"==typeof e?{protocol:"https",url:e,accept:O.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||O.Any}}Ye="GET",Z="POST";function Po(e,t){return Promise.all(t.map(function(t){return e.get(t,function(){return Promise.resolve(rt(t))})})).then(function(e){var o=e.filter(function(e){return function(e){return e.status===_t||Date.now()-e.lastUpdate>bt}(e)}),n=e.filter(function(e){return function(e){return e.status===jt&&Date.now()-e.lastUpdate<=bt}(e)}),s=[].concat(pe(o),pe(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:s.length>0?s.map(function(e){return Ot(e)}):t}})}function At(e,t,n,o){var i=[],r=function(e,t){if(e.method===Ye||void 0===e.data&&void 0===t.data)return;var n=Array.isArray(e.data)?e.data:s(s({},e.data),t.data);return JSON.stringify(n)}(n,o),c=function(e,t){var n=s(s({},e.headers),t.headers),o={};return Object.keys(n).forEach(function(e){var t=n[e];o[e.toLowerCase()]=t}),o}(e,o),l=n.method,d=n.method!==Ye?{}:s(s({},n.data),o.data),u=s(s(s({"x-algolia-agent":e.userAgent.value},e.queryParameters),d),o.queryParameters),a=0,h=function t(s,d){if(h=s.pop(),void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Lt(i)};var h,m={data:r,headers:c,method:l,url:Bo(h,n.path,u),connectTimeout:d(a,e.timeouts.connect),responseTimeout:d(a,o.timeout)},f=function(e){var t={request:m,response:e,host:h,triesLeft:s.length};return i.push(t),t},p={onSucess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var o=f(n);return n.isTimedOut&&a++,Promise.all([e.logger.info("Retryable failure",Bt(o)),e.hostsCache.set(h,rt(h,n.isTimedOut?jt:Fo))]).then(function(){return t(s,d)})},onFail:function(e){throw f(e),function(e,t){var n=e.content,o=e.status,s=n;try{s=JSON.parse(n).message}catch{}return function(e,t,n){return{name:"ApiError",message:e,status:t,transporterStackTrace:n}}(s,o,t)}(e,Lt(i))}};return e.requester.send(m).then(function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,n=e.status;return!t&&0==~~n}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSucess(e):t.onFail(e)}(e,p)})};return Po(e.hostsCache,t).then(function(e){return h(pe(e.statelessHosts).reverse(),e.getTimeout)})}function Io(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var n="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(n)&&(t.value="".concat(t.value).concat(n)),t}};return t}function Bo(e,t,n){var s=Dt(n),o="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return s.length&&(o+="?".concat(s)),o}function Dt(e){return Object.keys(e).map(function(t){return ce("%s=%s",t,(n=e[t],"[object Object]"===Object.prototype.toString.call(n)||"[object Array]"===Object.prototype.toString.call(n)?JSON.stringify(e[t]):e[t]));var n}).join("&")}function Lt(e){return e.map(function(e){return Bt(e)})}function Bt(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return s(s({},e),{},{request:s(s({},e.request),{},{headers:s(s({},e.request.headers),t)})})}var e,w,T,Y,Z,Le,Me,Ee,Te,zt,Re,Pe,He,Tt,Ct,fe,wt,vt,ht,dt,ut,$t,_n,En,We,me,Qe,zn,cs,bs,gs,ms,ot,Hn,Cn,jn,vn,ct,sn,Qt,ae,Ye,Uo=function(e){var t=e.appId,o=function(e,t,n){var s={"x-algolia-api-key":n,"x-algolia-application-id":t};return{headers:function(){return e===Y.WithinHeaders?s:{}},queryParameters:function(){return e===Y.WithinQueryParameters?s:{}}}}(void 0!==e.authMode?e.authMode:Y.WithinHeaders,t,e.apiKey),n=function(e){var n=e.hostsCache,s=e.logger,o=e.requester,i=e.requestsCache,a=e.responsesCache,r=e.timeouts,c=e.userAgent,l=e.hosts,d=e.queryParameters,t={hostsCache:n,logger:s,requester:o,requestsCache:i,responsesCache:a,timeouts:r,userAgent:c,headers:e.headers,queryParameters:d,hosts:l.map(function(e){return Ot(e)}),read:function(e,n){var s,o=St(n,t.timeouts.read),i=function(){return At(t,t.hosts.filter(function(e){return 0!=(e.accept&O.Read)}),e,o)};return!0!==(void 0!==o.cacheable?o.cacheable:e.cacheable)?i():(s={request:e,mappedRequestOptions:o,transporter:{queryParameters:t.queryParameters,headers:t.headers}},t.responsesCache.get(s,function(){return t.requestsCache.get(s,function(){return t.requestsCache.set(s,i()).then(function(e){return Promise.all([t.requestsCache.delete(s),e])},function(e){return Promise.all([t.requestsCache.delete(s),Promise.reject(e)])}).then(function(e){var t=he(e,2);return t[0],t[1]})})},{miss:function(e){return t.responsesCache.set(s,e)}}))},write:function(e,n){return At(t,t.hosts.filter(function(e){return 0!=(e.accept&O.Write)}),e,St(n,t.timeouts.write))}};return t}(s(s({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:O.Read},{url:"".concat(t,".algolia.net"),accept:O.Write}].concat(Oo([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:s(s(s({},o.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:s(s({},o.queryParameters()),e.queryParameters)})),i={transporter:n,appId:t,addAlgoliaAgent:function(e,t){n.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then(function(){})}};return It(i,e.methods)},Wt=function(e){return function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s={transporter:e.transporter,appId:e.appId,indexName:t};return It(s,n.methods)}},Xt=function(e){return function(t,n){var o=t.map(function(e){return s(s({},e),{},{params:Dt(e.params||{})})});return e.transporter.read({method:Z,path:"1/indexes/*/queries",data:{requests:o},cacheable:!0},n)}},Zt=function(e){return function(t,n){return Promise.all(t.map(function(t){var o=t.params,i=o.facetName,a=o.facetQuery,r=mi(o,Qt);return Wt(e)(t.indexName,{methods:{searchForFacetValues:nn}}).searchForFacetValues(i,a,s(s({},n),r))}))}},Go=function(e){return function(t,n,s){return e.transporter.read({method:Z,path:ce("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:n},cacheable:!0},s)}},Xo=function(e){return function(t,n){return e.transporter.read({method:Z,path:ce("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},n)}},nn=function(e){return function(t,n,s){return e.transporter.read({method:Z,path:ce("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:n},cacheable:!0},s)}},Zo=1,Jo=2,ei=3,ve,hn;function on(e,t,n){var o,i={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise(function(t){n=new XMLHttpRequest,n.open(e.method,e.url,!0),Object.keys(e.headers).forEach(function(t){return n.setRequestHeader(t,e.headers[t])});var n,s,i=function(e,s){return setTimeout(function(){n.abort(),t({status:0,content:s,isTimedOut:!0})},1e3*e)},o=i(e.connectTimeout,"Connection timeout");n.onreadystatechange=function(){n.readyState>n.OPENED&&void 0===s&&(clearTimeout(o),s=i(e.responseTimeout,"Socket timeout"))},n.onerror=function(){0===n.status&&(clearTimeout(o),clearTimeout(s),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=function(){clearTimeout(o),clearTimeout(s),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)})}},logger:(o=ei,{debug:function(e,t){return Zo>=o&&console.debug(e,t),Promise.resolve()},info:function(e,t){return Jo>=o&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:Se(),requestsCache:Se({serializable:!1}),hostsCache:D({caches:[yo({key:"".concat(ae,"-").concat(e)}),Se()]}),userAgent:Io(ae).add({segment:"Browser",version:"lite"}),authMode:Y.WithinQueryParameters};return Uo(s(s(s({},i),n),{},{methods:{search:Xt,searchForFacetValues:Zt,multipleQueries:Xt,multipleSearchForFacetValues:Zt,initIndex:function(e){return function(t){return Wt(e)(t,{methods:{search:Xo,searchForFacetValues:nn,findAnswers:Go}})}}}}))}on.version=ae,ve="3.5.1",hn=["footer","searchBox"];function W(){return W=Object.assign||function(e){for(var t,s,n=1;ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){o=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function ui(t){var b=t.appId,g=t.apiKey,r=t.indexName,k=t.placeholder,A=void 0===k?"Search docs":k,F=t.searchParameters,f=t.maxResultsPerGroup,T=t.onClose,i=void 0===T?Xs:T,N=t.transformItems,R=void 0===N?Vn:N,I=t.hitComponent,Y=void 0===I?Es:I,P=t.resultsFooterComponent,U=void 0===P?function(){return null}:P,M=t.navigator,S=t.initialScrollY,Q=void 0===S?0:S,O=t.transformSearchClient,V=void 0===O?Vn:O,w=t.disableUserPersonalization,d=void 0!==w&&w,x=t.initialQuery,ee=void 0===x?"":x,E=t.translations,j=void 0===E?{}:E,G=t.getMissingResultsUrl,y=t.insights,v=void 0!==y&&y,B=j.footer,q=j.searchBox,K=di(j,hn),D=ci(e.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),n=D[0],$=D[1],_=e.useRef(null),p=e.useRef(null),H=e.useRef(null),m=e.useRef(null),h=e.useRef(null),s=e.useRef(10),L=e.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,o=e.useRef(ee||L).current,z=function(t,n,s){return e.useMemo(function(){var e=on(t,n);return e.addAlgoliaAgent("docsearch",ve),!1===/docsearch.js \(.*\)/.test(e.transporter.userAgent.value)&&e.addAlgoliaAgent("docsearch-react",ve),s(e)},[t,n,s])}(b,g,V),a=e.useRef(Jt({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(r),limit:10})).current,l=e.useRef(Jt({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(r),limit:0===a.getAll().length?7:4})).current,c=e.useCallback(function(e){if(!d){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===a.getAll().findIndex(function(e){return e.objectID===t.objectID})&&l.add(t)}},[a,l,d]),X=e.useCallback(function(e){if(n.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,s={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};n.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(s)}},[n.context.algoliaInsightsPlugin]),u=e.useMemo(function(){return Ns({id:"docsearch",defaultActiveItemId:0,placeholder:A,openOnFocus:!0,initialState:{query:o,context:{searchSuggestions:[]}},insights:v,navigator:M,onStateChange:function(e){$(e.state)},getSources:function(e){var t,n=e.query,u=e.state,o=e.setContext,h=e.setStatus;return n?(t=Boolean(v),z.search([{query:n,indexName:r,params:et({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(s.current),"hierarchy.lvl2:".concat(s.current),"hierarchy.lvl3:".concat(s.current),"hierarchy.lvl4:".concat(s.current),"hierarchy.lvl5:".concat(s.current),"hierarchy.lvl6:".concat(s.current),"content:".concat(s.current)],snippetEllipsisText:"…",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20,clickAnalytics:t},F)}]).catch(function(e){throw"RetryError"===e.name&&h("error"),e}).then(function(e){var s,a=e.results,l=a[0],d=l.hits,h=l.nbHits,n=$n(d,function(e){return Rn(e)},f);return u.context.searchSuggestions.length0&&(C(),h.current&&h.current.focus())},[o,C]),e.useEffect(function(){function e(){if(p.current){var e=.01*window.innerHeight;p.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}},[]),e.createElement("div",W({ref:_},J({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===n.status&&"DocSearch-Container--Stalled","error"===n.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&i()}}),e.createElement("div",{className:"DocSearch-Modal",ref:p},e.createElement("header",{className:"DocSearch-SearchBar",ref:H},e.createElement(fo,W({},u,{state:n,autoFocus:0===o.length,inputRef:h,isFromSelection:Boolean(o)&&o===L,translations:q,onClose:i}))),e.createElement("div",{className:"DocSearch-Dropdown",ref:m},e.createElement(vn,W({},u,{indexName:r,state:n,hitComponent:Y,resultsFooterComponent:U,disableUserPersonalization:d,recentSearches:l,favoriteSearches:a,inputRef:h,translations:K,getMissingResultsUrl:G,onItemClick:function(e,t){X(e),c(e),ye(t)||i()}}))),e.createElement("footer",{className:"DocSearch-Footer"},e.createElement(Ms,{translations:B}))))}function Ce(){return Ce=Object.assign||function(e){for(var t,s,n=1;ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:window;return"string"==typeof e?t.document.querySelector(e):e}(t.container,t.environment))}}),!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.scrollSpy=t():e.scrollSpy=t()}(self,()=>(()=>{var n={138:(e,t,n)=>{e.exports=(e,t={})=>{const{ScrollSpy:o}=n(218),s=new o(e,t);return window.onload=s.onScroll(),window.addEventListener("scroll",()=>s.onScroll()),s}},218:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ScrollSpy:()=>s});class s{constructor(e,t={}){if(!e)throw new Error("First argument is query selector to your navigation.");if("object"!=typeof t)throw new Error("Second argument must be instance of Object.");t.smoothScroll=!0===t.smoothScroll&&{}||t.smoothScroll,this.menuList=e instanceof HTMLElement?e:document.querySelector(e),this.options=Object.assign({},{sectionClass:".scrollspy",menuActiveTarget:"li > a",offset:0,hrefAttribute:"href",activeClass:"active",scrollContainer:"",smoothScroll:{}},t),this.options.scrollContainer?this.scroller=this.options.scrollContainer instanceof HTMLElement?this.options.scrollContainer:document.querySelector(this.options.scrollContainer):this.scroller=window,this.sections=document.querySelectorAll(this.options.sectionClass),this.attachEventListeners()}attachEventListeners(){this.scroller&&(this.scroller.addEventListener("scroll",()=>this.onScroll()),this.options.smoothScroll)&&this.menuList.querySelectorAll(this.options.menuActiveTarget).forEach(e=>e.addEventListener("click",this.onClick.bind(this)))}onClick(e){const n=e.target.getAttribute(this.options.hrefAttribute),t=document.querySelector(n);t&&this.options.smoothScroll&&(e.preventDefault(),this.scrollTo(t))}onScroll(){const t=this.getSectionInView(),e=this.getMenuItemBySection(t);e&&(this.removeCurrentActive({ignore:e}),this.setActive(e))}scrollTo(e){const t="function"==typeof this.options.smoothScrollBehavior&&this.options.smoothScrollBehavior;t?t(e,this.options.smoothScroll):e.scrollIntoView({...this.options.smoothScroll,behavior:"smooth"})}getMenuItemBySection(e){if(!e)return;const t=e.getAttribute("id");return this.menuList.querySelector(`[${this.options.hrefAttribute}="#${t}"]`)}getSectionInView(){for(let e=0;en&&t<=s)return this.sections[e]}}setActive(e){e.classList.contains(this.options.activeClass)||e.classList.add(this.options.activeClass)}removeCurrentActive({ignore:e}){const{hrefAttribute:t,menuActiveTarget:n,activeClass:s}=this.options,o=`${n}.${s}:not([${t}="${e.getAttribute(t)}"])`;this.menuList.querySelectorAll(o).forEach(e=>e.classList.remove(this.options.activeClass))}}}},t={};function e(s){var o,i=t[s];return void 0!==i?i.exports:(o=t[s]={exports:{}},n[s](o,o.exports,e),o.exports)}return e.d=(t,n)=>{for(var s in n)e.o(n,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:n[s]})},e.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},e(138)})()),(()=>{window.onload=function(){scrollSpy("toc",{sectionClass:"h1,h2,h3,h4",offset:100})}})();const scrollArea=document.getElementById("content"),tocBtn=document.getElementById("toc-dropdown-btn");scrollArea.addEventListener("activate.bs.scrollspy",function(){var e=document.querySelector(".dropdown-menu li > a.active").innerHTML;tocBtn.innerHTML=e}),tocBtn.addEventListener("shown.bs.dropdown",e=>{tocBtn.style.borderBottom="none",tocBtn.style.borderRadius="4px 4px 0 0"}),tocBtn.addEventListener("hidden.bs.dropdown",e=>{tocBtn.style.borderBottom="1px solid var(--alert-border-color)",tocBtn.style.borderRadius="4px"}),(()=>{var t,e=Object.getOwnPropertyNames,n=(t,n)=>function(){return t&&(n=(0,t[e(t)[0]])(t=0)),n},s=(t,n)=>function(){return n||(0,t[e(t)[0]])((n={exports:{}}).exports,n),n.exports},o=n({"ns-params:@params"(){t={langPath:"https://doc.tryfastgpt.ai/docs/js/components/"}}}),i=s({""(e,n){o();var i=typeof window!="undefined"?window:typeof WorkerGlobalScope!="undefined"&&self instanceof WorkerGlobalScope?self:{},s=function(e){var s,a,l=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,f=0,i={},t={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof n?new n(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/"+o.content+""};function d(e,t,n,s){e.lastIndex=t;var i,o=e.exec(n);return o&&s&&o[1]&&(i=o[1].length,o.index+=i,o[0]=o[0].slice(i)),o}function c(e,s,i,a,r,l){for(_ in i){if(!i.hasOwnProperty(_)||!i[_])continue;v=i[_],v=Array.isArray(v)?v:[v];for(y=0;y=l.reach)break;if(b=u.value,s.length>e.length)return;if(b instanceof n)continue;if(O=1,T){if(f=d(z,p,e,S),!f||f.index>=e.length)break;for(C=f.index,D=f.index+f[0].length,g=p,g+=u.value.length;C>=g;)u=u.next,g+=u.value.length;if(g-=u.value.length,p=g,u.value instanceof n)continue;for(j=u;j!==s.tail&&(gl.reach&&(l.reach=k),w=u.prev,A&&(w=o(s,w,A),p+=A.length),h(s,w,O),R=new n(_,M?t.tokenize(x,M):x,L,x),u=o(s,w,R),F&&o(s,u,F),O>1&&(E={cause:_+","+y,reach:k},c(e,s,i,u.prev,p,E),l&&E.reach>l.reach&&(l.reach=E.reach))}}}}function u(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function o(e,t,n){var o=t.next,s={value:n,prev:t,next:o};return t.next=s,o.prev=s,e.length++,s}function h(e,t,n){for(var s=t.next,o=0;o/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>/=$<%]+(?:\s(?:\s*[^\s>/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>/]+/,inside:{namespace:/^[^\s>/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},s.languages.markup.tag.inside["attr-value"].inside.entity=s.languages.markup.entity,s.languages.markup.doctype.inside["internal-subset"].inside=s.languages.markup,s.hooks.add("wrap",function(e){e.type==="entity"&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(s.languages.markup.tag,"addInlined",{value:function(t,n){var i,a,o={};o["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:s.languages[n]},o.cdata=/^$/i,i={"included-cdata":{pattern://i,inside:o}},i["language-"+n]={pattern:/[\s\S]+/,inside:s.languages[n]},a={},a[t]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return t}),"i"),lookbehind:!0,greedy:!0,inside:i},s.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(s.languages.markup.tag,"addAttribute",{value:function(e,t){s.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:s.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),s.languages.html=s.languages.markup,s.languages.mathml=s.languages.markup,s.languages.svg=s.languages.markup,s.languages.xml=s.languages.extend("markup",{}),s.languages.ssml=s.languages.xml,s.languages.atom=s.languages.xml,s.languages.rss=s.languages.xml,function(e){var n,t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,n=e.languages.markup,n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(s),s.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},s.languages.javascript=s.languages.extend("clike",{"class-name":[s.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),s.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,s.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:s.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:s.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:s.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:s.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:s.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),s.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:s.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),s.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),s.languages.markup&&(s.languages.markup.tag.addInlined("script","javascript"),s.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),s.languages.js=s.languages.javascript,function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach(function(n){var o=t[n],s=[];/^\w+$/.test(n)||s.push(/\w+/.exec(n)[0]),n==="diff"&&s.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+o+`].*(?: +?| +|(?![\\s\\S])))+`,"m"),alias:s,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}}),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(s),function(){if(typeof s=="undefined"||typeof document=="undefined"||!document.querySelector)return;var n,i,l,a="line-numbers",e="linkable-line-numbers",u=/\n(?!$)/g;function t(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function r(e,t){return e.classList.contains(t)}function c(e){e()}l=function(){var e;return function(){if(typeof e=="undefined"){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding="0",t.style.border="0",t.innerHTML=" 
 ",document.body.appendChild(t),e=t.offsetHeight===38,document.body.removeChild(t)}return e}}();function h(e,t){var o=getComputedStyle(e),s=getComputedStyle(t);function n(e){return+e.substr(0,e.length-2)}return t.offsetTop+n(s.borderTopWidth)+n(s.paddingTop)-n(o.paddingTop)}function o(t){return!!t&&!!/pre/i.test(t.nodeName)&&(!!t.hasAttribute("data-line")||!!(t.id&&s.util.isActive(t,e)))}n=!0,s.plugins.lineHighlight={highlightLines:function(i,d,m){d=typeof d=="string"?d:i.getAttribute("data-line")||"";var g,y,C=d.replace(/\s+/g,"").split(",").filter(Boolean),j=+i.getAttribute("data-line-offset")||0,E=l()?parseInt:parseFloat,O=E(getComputedStyle(i).lineHeight),v=s.util.isActive(i,a),p=i.querySelector("code"),_=v?i:p||i,f=[],w=p.textContent.match(u),x=w?w.length+1:1,b=!p||_==p?0:h(i,p);return C.forEach(function(e){var t,a,r,l,d,c=e.split("-"),n=+c[0],o=+c[1]||n,o=Math.min(x+j,o);if(on&&t.setAttribute("data-end",String(o)),t.style.top=(n-j-1)*O+b+"px",t.textContent=new Array(o-n+2).join(` +`)}),f.push(function(){t.style.width=i.scrollWidth+"px"}),f.push(function(){_.appendChild(t)})}),g=i.id,v&&s.util.isActive(i,e)&&g&&(r(i,e)||f.push(function(){i.classList.add(e)}),y=parseInt(i.getAttribute("data-start")||"1"),t(".line-numbers-rows > span",i).forEach(function(e,t){var s=t+y;e.onclick=function(){var e=g+"."+s;n=!1,location.hash=e,setTimeout(function(){n=!0},1)}})),function(){f.forEach(c)}}};function d(){var e,i,a,r,o=location.hash.slice(1);if(t(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)}),i=(o.match(/\.([\d,-]+)$/)||[,""])[1],!i||document.getElementById(o))return;if(a=o.slice(0,o.lastIndexOf(".")),e=document.getElementById(a),!e)return;e.hasAttribute("data-line")||e.setAttribute("data-line",""),r=s.plugins.lineHighlight.highlightLines(e,i,"temporary "),r(),n&&document.querySelector(".temporary.line-highlight").scrollIntoView()}i=0,s.hooks.add("before-sanity-check",function(e){var n,s=e.element.parentElement;if(!o(s))return;n=0,t(".line-highlight",s).forEach(function(e){n+=e.textContent.length,e.parentNode.removeChild(e)}),n&&/^(?: \n)+$/.test(e.code.slice(-n))&&(e.code=e.code.slice(0,-n))}),s.hooks.add("complete",function e(t){var c,l,u,n=t.element.parentElement;if(!o(n))return;clearTimeout(i),c=s.plugins.lineNumbers,l=t.plugins&&t.plugins.lineNumbers,r(n,a)&&c&&!l?s.hooks.add("line-numbers",e):(u=s.plugins.lineHighlight.highlightLines(n),u(),i=setTimeout(d,1))}),window.addEventListener("hashchange",d),window.addEventListener("resize",function(){var e=t("pre").filter(o).map(function(e){return s.plugins.lineHighlight.highlightLines(e)});e.forEach(c)})}(),function(){if(typeof s=="undefined"||typeof document=="undefined")return;var n,e="line-numbers",o=/\n(?!$)/g,i=s.plugins.lineNumbers={getLine:function(t,n){if(t.tagName!=="PRE"||!t.classList.contains(e))return;var s,i,a,o=t.querySelector(".line-numbers-rows");if(!o)return;return s=parseInt(t.getAttribute("data-start"),10)||1,i=s+(o.children.length-1),ni&&(n=i),a=n-s,o.children[a]},resize:function(e){t([e])},assumeViewportIndependence:!0};function t(e){if(e=e.filter(function(e){var n=a(e),t=n["white-space"];return t==="pre-wrap"||t==="pre-line"}),e.length==0)return;var t=e.map(function(e){var t,s,i,n=e.querySelector("code"),a=e.querySelector(".line-numbers-rows");return!n||!a?void 0:(t=e.querySelector(".line-numbers-sizer"),s=n.textContent.split(o),t||(t=document.createElement("span"),t.className="line-numbers-sizer",n.appendChild(t)),t.innerHTML="0",t.style.display="block",i=t.getBoundingClientRect().height,t.innerHTML="",{element:e,lines:s,lineHeights:[],oneLinerHeight:i,sizer:t})}).filter(Boolean);t.forEach(function(e){var s=e.sizer,t=e.lines,n=e.lineHeights,o=e.oneLinerHeight;n[t.length-1]=void 0,t.forEach(function(e,t){if(e&&e.length>1){var i=s.appendChild(document.createElement("span"));i.style.display="block",i.textContent=e}else n[t]=o})}),t.forEach(function(e){for(var s=e.sizer,n=e.lineHeights,o=0,t=0;t"),a=document.createElement("span"),a.setAttribute("aria-hidden","true"),a.className="line-numbers-rows",a.innerHTML=d,i.hasAttribute("data-start")&&(i.style.counterReset="linenumber "+(parseInt(i.getAttribute("data-start"),10)-1)),n.element.appendChild(a),t([i]),s.hooks.run("line-numbers",n)}),s.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}(),function(){if(typeof s=="undefined"||typeof document=="undefined")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var n,a="Loading…",r=function(e,t){return"✖ Error "+e+" while fetching file: "+t},c="✖ Error: File does not exist or is empty",l={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},e="data-src-status",o="loading",i="loaded",d="failed",t="pre[data-src]:not(["+e+'="'+i+'"]):not(['+e+'="'+o+'"])';function u(e,t,n){var s=new XMLHttpRequest;s.open("GET",e,!0),s.onreadystatechange=function(){s.readyState==4&&(s.status<400&&s.responseText?t(s.responseText):n(s.status>=400?r(s.status,s.statusText):c))},s.send(null)}function h(e){var t,s,o,n=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(e||"");return n?(t=Number(n[1]),o=n[2],s=n[3],o?s?[t,Number(s)]:[t,void 0]:[t,t]):void 0}s.hooks.add("before-highlightall",function(e){e.selector+=", "+t}),s.hooks.add("before-sanity-check",function(n){var c,m,f,p,g,r=n.element;r.matches(t)&&(n.code="",r.setAttribute(e,o),c=r.appendChild(document.createElement("CODE")),c.textContent=a,f=r.getAttribute("data-src"),m=n.language,m==="none"&&(p=(/\.(\w+)$/.exec(f)||[,"none"])[1],m=l[p]||p),s.util.setLanguage(c,m),s.util.setLanguage(r,m),g=s.plugins.autoloader,g&&g.loadLanguages(m),u(f,function(t){r.setAttribute(e,i);var n,o,a,l=h(r.getAttribute("data-range"));l&&(n=t.split(/\r\n?|\n/g),o=l[0],a=l[1]==null?n.length:l[1],o<0&&(o+=n.length),o=Math.max(0,Math.min(o-1,n.length)),a<0&&(a+=n.length),a=Math.max(0,Math.min(a,n.length)),t=n.slice(o,a).join(` +`),r.hasAttribute("data-start")||r.setAttribute("data-start",String(o+1))),c.textContent=t,s.highlightElement(c)},function(t){r.setAttribute(e,d),c.textContent=t}))}),s.plugins.fileHighlight={highlight:function(n){for(var a,o=(n||document).querySelectorAll(t),i=0;a=o[i++];)s.highlightElement(a)}},n=!1,s.fileHighlight=function(){n||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),n=!0),s.plugins.fileHighlight.highlight.apply(this,arguments)}}(),function(){if(typeof s=="undefined"||typeof document=="undefined")return;var n,a,r,c,d,j={javascript:"clike",actionscript:"javascript",apex:["clike","sql"],arduino:"cpp",aspnet:["markup","csharp"],birb:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",cfscript:"clike",chaiscript:["clike","cpp"],cilkc:"c",cilkcpp:"cpp",coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup-templating",ejs:["javascript","markup-templating"],etlua:["lua","markup-templating"],erb:["ruby","markup-templating"],fsharp:"clike","firestore-security-rules":"clike",flow:"javascript",ftl:"markup-templating",gml:"clike",glsl:"c",go:"clike",gradle:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",hlsl:"c",idris:"haskell",java:"clike",javadoc:["markup","java","javadoclike"],jolie:"clike",jsdoc:["javascript","javadoclike","typescript"],"js-extras":"javascript",json5:"json",jsonp:"json","js-templates":"javascript",kotlin:"clike",latte:["clike","markup-templating","php"],less:"css",lilypond:"scheme",liquid:"markup-templating",markdown:"markup","markup-templating":"markup",mongodb:"javascript",n4js:"javascript",objectivec:"c",opencl:"c",parser:"markup",php:"markup-templating",phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","javascript"],purebasic:"clike",purescript:"haskell",qsharp:"clike",qml:"javascript",qore:"clike",racket:"scheme",cshtml:["markup","csharp"],jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java","shell-session":"bash",smarty:"markup-templating",solidity:"clike",soy:"markup-templating",sparql:"turtle",sqf:"clike",squirrel:"clike",stata:["mata","java","python"],"t4-cs":["t4-templating","csharp"],"t4-vb":["t4-templating","vbnet"],tap:"yaml",tt2:["clike","markup-templating"],textile:"markup",twig:"markup-templating",typescript:"javascript",v:"clike",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup","xml-doc":"markup",xquery:"markup"},m={html:"markup",xml:"markup",svg:"markup",mathml:"markup",ssml:"markup",atom:"markup",rss:"markup",js:"javascript",g4:"antlr4",ino:"arduino","arm-asm":"armasm",art:"arturo",adoc:"asciidoc",avs:"avisynth",avdl:"avro-idl",gawk:"awk",sh:"bash",shell:"bash",shortcode:"bbcode",rbnf:"bnf",oscript:"bsl",cs:"csharp",dotnet:"csharp",cfc:"cfscript","cilk-c":"cilkc","cilk-cpp":"cilkcpp",cilk:"cilkcpp",coffee:"coffeescript",conc:"concurnas",jinja2:"django","dns-zone":"dns-zone-file",dockerfile:"docker",gv:"dot",eta:"ejs",xlsx:"excel-formula",xls:"excel-formula",gamemakerlanguage:"gml",po:"gettext",gni:"gn",ld:"linker-script","go-mod":"go-module",hbs:"handlebars",mustache:"handlebars",hs:"haskell",idr:"idris",gitignore:"ignore",hgignore:"ignore",npmignore:"ignore",webmanifest:"json",kt:"kotlin",kts:"kotlin",kum:"kumir",tex:"latex",context:"latex",ly:"lilypond",emacs:"lisp",elisp:"lisp","emacs-lisp":"lisp",md:"markdown",moon:"moonscript",n4jsd:"n4js",nani:"naniscript",objc:"objectivec",qasm:"openqasm",objectpascal:"pascal",px:"pcaxis",pcode:"peoplecode",plantuml:"plant-uml",pq:"powerquery",mscript:"powerquery",pbfasm:"purebasic",purs:"purescript",py:"python",qs:"qsharp",rkt:"racket",razor:"cshtml",rpy:"renpy",res:"rescript",robot:"robotframework",rb:"ruby","sh-session":"shell-session",shellsession:"shell-session",smlnj:"sml",sol:"solidity",sln:"solution-file",rq:"sparql",sclang:"supercollider",t4:"t4-cs",trickle:"tremor",troy:"tremor",trig:"turtle",ts:"typescript",tsconfig:"typoscript",uscript:"unrealscript",uc:"unrealscript",url:"uri",vb:"visual-basic",vba:"visual-basic",webidl:"web-idl",mathematica:"wolfram",nb:"wolfram",wl:"wolfram",xeoracube:"xeora",yml:"yaml"},e={},v="none",o=t.langPath,u=s.util.currentScript();u&&(r=/\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,c=/(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,a=u.getAttribute("data-autoloader-path"),a!=null?o=a.trim().replace(/\/?$/,"/"):(n=u.src,r.test(n)?o=n.replace(r,"components/"):c.test(n)&&(o=n.replace(c,"$1components/")))),d=s.plugins.autoloader={languages_path:o,use_minified:!0,loadLanguages:l};function f(e,t,n){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),t&&t()},s.onerror=function(){document.body.removeChild(s),n&&n()},document.body.appendChild(s)}function p(e){var n,t=(e.getAttribute("data-dependencies")||"").trim();return t||(n=e.parentElement,n&&n.tagName.toLowerCase()==="pre"&&(t=(n.getAttribute("data-dependencies")||"").trim())),t?t.split(/\s*,\s*/g):[]}function h(t){if(t.indexOf("!")>=0)return!1;if(t=m[t]||t,t in s.languages)return!0;var n=e[t];return n&&!n.error&&n.loading===!1}function g(e){return d.languages_path+"prism-"+e+(d.use_minified?".min":"")+".js"}function l(e,t,n){typeof e=="string"&&(e=[e]);var o=e.length,i=0,s=!1;if(o===0){t&&setTimeout(t,0);return}function a(){if(s)return;i++,i===o&&t&&t(e)}e.forEach(function(e){b(e,a,function(){if(s)return;s=!0,n&&n(e)})})}function b(t,n,s){var o,a=t.indexOf("!")>=0;t=t.replace("!",""),t=m[t]||t;function r(){var o=e[t];o||(o=e[t]={callbacks:[]}),o.callbacks.push({success:n,error:s}),!a&&h(t)?i(t,"success"):!a&&o.error?i(t,"error"):(a||!o.loading)&&(o.loading=!0,o.error=!1,f(g(t),function(){o.loading=!1,i(t,"success")},function(){o.loading=!1,o.error=!0,i(t,"error")}))}o=j[t],o&&o.length?l(o,r,s):r()}function i(t,n){if(e[t]){s=e[t].callbacks;for(var s,i,o=0,a=s.length;ot&&(n[s]=` +`+n[s],r=c);o[a]=n.join("")}return o.join(` +`)}},typeof n!="undefined"&&n.exports&&(n.exports=o),s.plugins.NormalizeWhitespace=new o({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),s.hooks.add("before-sanity-check",function(t){var n,o,i,a,r,c,d,u,h,m,f,l=s.plugins.NormalizeWhitespace;if(t.settings&&t.settings["whitespace-normalization"]===!1)return;if(!s.util.isActive(t.element,"whitespace-normalization",!0))return;if((!t.element||!t.element.parentNode)&&t.code){t.code=l.normalize(t.code,t.settings);return}if(n=t.element.parentNode,!t.code||!n||n.nodeName.toLowerCase()!=="pre")return;t.settings==null&&(t.settings={});for(i in e)if(Object.hasOwnProperty.call(e,i)&&(m=e[i],n.hasAttribute("data-"+i)))try{d=JSON.parse(n.getAttribute("data-"+i)||"true"),typeof d===m&&(t.settings[i]=d)}catch{}u=n.childNodes,r="",c="",h=!1;for(a=0;a /}}}}},s.hooks.add("wrap",function(e){if(e.language==="treeview"&&e.type==="entry-name"){var t,n=e.classes,s=/(^|[^\\])\/\s*$/;if(s.test(e.content))e.content=e.content.replace(s,"$1"),n.push("dir");else for(e.content=e.content.replace(/(^|[^\\])[=*|]\s*$/,"$1"),t=e.content.toLowerCase().replace(/\s+/g,"").split(".");t.length>1;)t.shift(),n.push("ext-"+t.join("-"));e.content[0]==="."&&n.push("dotfile")}})}()}});i()})() \ No newline at end of file diff --git a/docs/js/components/prism-abap.min.js b/docs/js/components/prism-abap.min.js new file mode 100644 index 000000000000..d803a51ba0ac --- /dev/null +++ b/docs/js/components/prism-abap.min.js @@ -0,0 +1 @@ +Prism.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}; \ No newline at end of file diff --git a/docs/js/components/prism-abnf.min.js b/docs/js/components/prism-abnf.min.js new file mode 100644 index 000000000000..a57731024c31 --- /dev/null +++ b/docs/js/components/prism-abnf.min.js @@ -0,0 +1 @@ +!function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";n.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-actionscript.min.js b/docs/js/components/prism-actionscript.min.js new file mode 100644 index 000000000000..30844f1fa804 --- /dev/null +++ b/docs/js/components/prism-actionscript.min.js @@ -0,0 +1 @@ +Prism.languages.actionscript=Prism.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript["class-name"].alias="function",delete Prism.languages.actionscript.parameter,delete Prism.languages.actionscript["literal-property"],Prism.languages.markup&&Prism.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:Prism.languages.markup}}); \ No newline at end of file diff --git a/docs/js/components/prism-ada.min.js b/docs/js/components/prism-ada.min.js new file mode 100644 index 000000000000..57de1703630e --- /dev/null +++ b/docs/js/components/prism-ada.min.js @@ -0,0 +1 @@ +Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}; \ No newline at end of file diff --git a/docs/js/components/prism-agda.min.js b/docs/js/components/prism-agda.min.js new file mode 100644 index 000000000000..62f8d1ca23c5 --- /dev/null +++ b/docs/js/components/prism-agda.min.js @@ -0,0 +1 @@ +!function(t){t.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-al.min.js b/docs/js/components/prism-al.min.js new file mode 100644 index 000000000000..9651f880f08f --- /dev/null +++ b/docs/js/components/prism-al.min.js @@ -0,0 +1 @@ +Prism.languages.al={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},function:{pattern:/(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,lookbehind:!0},keyword:[/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i],number:/\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,boolean:/\b(?:false|true)\b/i,variable:/\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,"class-name":/\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,operator:/\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,punctuation:/[()\[\]{}:.;,]/}; \ No newline at end of file diff --git a/docs/js/components/prism-antlr4.min.js b/docs/js/components/prism-antlr4.min.js new file mode 100644 index 000000000000..8bb4bda7352d --- /dev/null +++ b/docs/js/components/prism-antlr4.min.js @@ -0,0 +1 @@ +Prism.languages.antlr4={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,string:{pattern:/'(?:\\.|[^\\'\r\n])*'/,greedy:!0},"character-class":{pattern:/\[(?:\\.|[^\\\]\r\n])*\]/,greedy:!0,alias:"regex",inside:{range:{pattern:/([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,lookbehind:!0,alias:"punctuation"},escape:/\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,punctuation:/[\[\]]/}},action:{pattern:/\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,greedy:!0,inside:{content:{pattern:/(\{)[\s\S]+(?=\})/,lookbehind:!0},punctuation:/[{}]/}},command:{pattern:/(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,lookbehind:!0,inside:{function:/\b\w+(?=\s*(?:[,(]|$))/,punctuation:/[,()]/}},annotation:{pattern:/@\w+(?:::\w+)*/,alias:"keyword"},label:{pattern:/#[ \t]*\w+/,alias:"punctuation"},keyword:/\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,definition:[{pattern:/\b[a-z]\w*(?=\s*:)/,alias:["rule","class-name"]},{pattern:/\b[A-Z]\w*(?=\s*:)/,alias:["token","constant"]}],constant:/\b[A-Z][A-Z_]*\b/,operator:/\.\.|->|[|~]|[*+?]\??/,punctuation:/[;:()=]/},Prism.languages.g4=Prism.languages.antlr4; \ No newline at end of file diff --git a/docs/js/components/prism-apacheconf.min.js b/docs/js/components/prism-apacheconf.min.js new file mode 100644 index 000000000000..8ed203d14a97 --- /dev/null +++ b/docs/js/components/prism-apacheconf.min.js @@ -0,0 +1 @@ +Prism.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/}; \ No newline at end of file diff --git a/docs/js/components/prism-apex.min.js b/docs/js/components/prism-apex.min.js new file mode 100644 index 000000000000..3cb0f96bec85 --- /dev/null +++ b/docs/js/components/prism-apex.min.js @@ -0,0 +1 @@ +!function(e){var t=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,n="\\b(?:(?=[a-z_]\\w*\\s*[<\\[])|(?!))[A-Z_]\\w*(?:\\s*\\.\\s*[A-Z_]\\w*)*\\b(?:\\s*(?:\\[\\s*\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*".replace(//g,(function(){return t.source}));function i(e){return RegExp(e.replace(//g,(function(){return n})),"i")}var a={keyword:t,punctuation:/[()\[\]{};,:.<>]/};e.languages.apex={comment:e.languages.clike.comment,string:e.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:e.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i("(\\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\\s+\\w+\\s+on)\\s+)"),lookbehind:!0,inside:a},{pattern:i("(\\(\\s*)(?=\\s*\\)\\s*[\\w(])"),lookbehind:!0,inside:a},{pattern:i("(?=\\s*\\w+\\s*[;=,(){:])"),inside:a}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:t,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-apl.min.js b/docs/js/components/prism-apl.min.js new file mode 100644 index 000000000000..0fd5cf4737bf --- /dev/null +++ b/docs/js/components/prism-apl.min.js @@ -0,0 +1 @@ +Prism.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,function:/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺⍥]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}}; \ No newline at end of file diff --git a/docs/js/components/prism-applescript.min.js b/docs/js/components/prism-applescript.min.js new file mode 100644 index 000000000000..57635ecf2632 --- /dev/null +++ b/docs/js/components/prism-applescript.min.js @@ -0,0 +1 @@ +Prism.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class-name":/\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,punctuation:/[{}():,¬«»《》]/}; \ No newline at end of file diff --git a/docs/js/components/prism-aql.min.js b/docs/js/components/prism-aql.min.js new file mode 100644 index 000000000000..9ed85972d217 --- /dev/null +++ b/docs/js/components/prism-aql.min.js @@ -0,0 +1 @@ +Prism.languages.aql={comment:/\/\/.*|\/\*[\s\S]*?\*\//,property:{pattern:/([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},identifier:{pattern:/([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},variable:/@@?\w+/,keyword:[{pattern:/(\bWITH\s+)COUNT(?=\s+INTO\b)/i,lookbehind:!0},/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,{pattern:/(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,lookbehind:!0},{pattern:/(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,lookbehind:!0},{pattern:/\bOPTIONS(?=\s*\{)/i}],function:/\b(?!\d)\w+(?=\s*\()/,boolean:/\b(?:false|true)\b/i,range:{pattern:/\.\./,alias:"operator"},number:[/\b0b[01]+/i,/\b0x[0-9a-f]+/i,/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i],operator:/\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,punctuation:/::|[?.:,;()[\]{}]/}; \ No newline at end of file diff --git a/docs/js/components/prism-arduino.min.js b/docs/js/components/prism-arduino.min.js new file mode 100644 index 000000000000..adb7fe92bd2c --- /dev/null +++ b/docs/js/components/prism-arduino.min.js @@ -0,0 +1 @@ +Prism.languages.arduino=Prism.languages.extend("cpp",{keyword:/\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,constant:/\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,builtin:/\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/}),Prism.languages.ino=Prism.languages.arduino; \ No newline at end of file diff --git a/docs/js/components/prism-arff.min.js b/docs/js/components/prism-arff.min.js new file mode 100644 index 000000000000..533e8d1109d7 --- /dev/null +++ b/docs/js/components/prism-arff.min.js @@ -0,0 +1 @@ +Prism.languages.arff={comment:/%.*/,string:{pattern:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\b/i,number:/\b\d+(?:\.\d+)?\b/,punctuation:/[{},]/}; \ No newline at end of file diff --git a/docs/js/components/prism-armasm.min.js b/docs/js/components/prism-armasm.min.js new file mode 100644 index 000000000000..620549bd3230 --- /dev/null +++ b/docs/js/components/prism-armasm.min.js @@ -0,0 +1 @@ +Prism.languages.armasm={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"/,greedy:!0,inside:{variable:{pattern:/((?:^|[^$])(?:\${2})*)\$\w+/,lookbehind:!0}}},char:{pattern:/'(?:[^'\r\n]{0,4}|'')'/,greedy:!0},"version-symbol":{pattern:/\|[\w@]+\|/,greedy:!0,alias:"property"},boolean:/\b(?:FALSE|TRUE)\b/,directive:{pattern:/\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/,alias:"property"},instruction:{pattern:/((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/,lookbehind:!0,alias:"keyword"},variable:/\$\w+/,number:/(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i,register:{pattern:/\b(?:r\d|lr)\b/,alias:"symbol"},operator:/<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/,punctuation:/[()[\],]/},Prism.languages["arm-asm"]=Prism.languages.armasm; \ No newline at end of file diff --git a/docs/js/components/prism-arturo.min.js b/docs/js/components/prism-arturo.min.js new file mode 100644 index 000000000000..f17b130a176b --- /dev/null +++ b/docs/js/components/prism-arturo.min.js @@ -0,0 +1 @@ +!function(e){var a=function(a,t){return{pattern:RegExp("\\{!(?:"+(t||a)+")$[^]*\\}","m"),greedy:!0,inside:{embedded:{pattern:/(^\{!\w+\b)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-"+a,inside:e.languages[a]},string:/[\s\S]+/}}};e.languages.arturo={comment:{pattern:/;.*/,greedy:!0},character:{pattern:/`.`/,alias:"char",greedy:!0},number:{pattern:/\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/},string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},regex:{pattern:/\{\/.*?\/\}/,greedy:!0},"html-string":a("html"),"css-string":a("css"),"js-string":a("js"),"md-string":a("md"),"sql-string":a("sql"),"sh-string":a("shell","sh"),multistring:{pattern:/».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m,alias:"string",greedy:!0},label:{pattern:/\w+\b\??:/,alias:"property"},literal:{pattern:/'(?:\w+\b\??:?)/,alias:"constant"},type:{pattern:/:(?:\w+\b\??:?)/,alias:"class-name"},color:/#\w+/,predicate:{pattern:/\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/,alias:"keyword"},"builtin-function":{pattern:/\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/,alias:"keyword"},sugar:{pattern:/->|=>|\||::/,alias:"operator"},punctuation:/[()[\],]/,symbol:{pattern:/<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/},boolean:{pattern:/\b(?:false|maybe|true)\b/}},e.languages.art=e.languages.arturo}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-asciidoc.min.js b/docs/js/components/prism-asciidoc.min.js new file mode 100644 index 000000000000..6ca04ca364a0 --- /dev/null +++ b/docs/js/components/prism-asciidoc.min.js @@ -0,0 +1 @@ +!function(t){var n={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},i=t.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})$[\s\S]*?^\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:n,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:n.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:n,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function e(t){for(var n={},e=0,a=(t=t.split(" ")).length;e>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/,punctuation:/[(),:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-aspnet.min.js b/docs/js/components/prism-aspnet.min.js new file mode 100644 index 000000000000..f9161fc6598a --- /dev/null +++ b/docs/js/components/prism-aspnet.min.js @@ -0,0 +1 @@ +Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:Prism.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/,alias:"tag"},rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,Prism.languages.insertBefore("inside","punctuation",{directive:Prism.languages.aspnet.directive},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp-script":{pattern:/(]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:Prism.languages.csharp||{}}}); \ No newline at end of file diff --git a/docs/js/components/prism-autohotkey.min.js b/docs/js/components/prism-autohotkey.min.js new file mode 100644 index 000000000000..79e06a1a4fdb --- /dev/null +++ b/docs/js/components/prism-autohotkey.min.js @@ -0,0 +1 @@ +Prism.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,command:{pattern:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,alias:"selector"},constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,directive:{pattern:/#[a-z]+\b/i,alias:"important"},keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}; \ No newline at end of file diff --git a/docs/js/components/prism-autoit.min.js b/docs/js/components/prism-autoit.min.js new file mode 100644 index 000000000000..a73284268803 --- /dev/null +++ b/docs/js/components/prism-autoit.min.js @@ -0,0 +1 @@ +Prism.languages.autoit={comment:[/;.*/,{pattern:/(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,lookbehind:!0}],url:{pattern:/(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,lookbehind:!0},string:{pattern:/(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,greedy:!0,inside:{variable:/([%$@])\w+\1/}},directive:{pattern:/(^[\t ]*)#[\w-]+/m,lookbehind:!0,alias:"keyword"},function:/\b\w+(?=\()/,variable:/[$@]\w+/,keyword:/\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,boolean:/\b(?:False|True)\b/i,operator:/<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,punctuation:/[\[\]().,:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-avisynth.min.js b/docs/js/components/prism-avisynth.min.js new file mode 100644 index 000000000000..851807cf74c3 --- /dev/null +++ b/docs/js/components/prism-avisynth.min.js @@ -0,0 +1 @@ +!function(e){function a(e,a,r){return RegExp(function(e,a){return e.replace(/<<(\d+)>>/g,(function(e,r){return a[+r]}))}(e,a),r||"")}var r="bool|clip|float|int|string|val",t=[["is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?","apply|assert|default|eval|import|nop|select|undefined","opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)","hex(?:value)?|value","abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt","a?sinh?|a?cosh?|a?tan[2h]?","(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))","average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)","getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams","chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)","isversionorgreater|version(?:number|string)","buildpixeltype|colorspacenametopixeltype","addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode"].join("|"),["has(?:audio|video)","height|width","frame(?:count|rate)|framerate(?:denominator|numerator)","getparity|is(?:field|frame)based","bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype","audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)"].join("|"),["avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource","coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv","(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract","addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)","blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen","trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)","assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?","amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch","animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?","imagewriter","blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version"].join("|")].join("|");e.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a('\\b(?:<<0>>)\\s+("?)\\w+\\1',[r],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a("\\b(?:<<0>>)\\b",[t],"i"),alias:"function"},"type-cast":{pattern:a("\\b(?:<<0>>)(?=\\s*\\()",[r],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},e.languages.avs=e.languages.avisynth}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-avro-idl.min.js b/docs/js/components/prism-avro-idl.min.js new file mode 100644 index 000000000000..34238fc651ec --- /dev/null +++ b/docs/js/components/prism-avro-idl.min.js @@ -0,0 +1 @@ +Prism.languages["avro-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0},annotation:{pattern:/@(?:[$\w.-]|`[^\r\n`]+`)+/,greedy:!0,alias:"function"},"function-identifier":{pattern:/`[^\r\n`]+`(?=\s*\()/,greedy:!0,alias:"function"},identifier:{pattern:/`[^\r\n`]+`/,greedy:!0},"class-name":{pattern:/(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,lookbehind:!0,greedy:!0},keyword:/\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:[{pattern:/(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,lookbehind:!0},/-?\b(?:Infinity|NaN)\b/],operator:/=/,punctuation:/[()\[\]{}<>.:,;-]/},Prism.languages.avdl=Prism.languages["avro-idl"]; \ No newline at end of file diff --git a/docs/js/components/prism-awk.min.js b/docs/js/components/prism-awk.min.js new file mode 100644 index 000000000000..c48925cdf3ac --- /dev/null +++ b/docs/js/components/prism-awk.min.js @@ -0,0 +1 @@ +Prism.languages.awk={hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},regex:{pattern:/((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//,lookbehind:!0,greedy:!0},variable:/\$\w+/,keyword:/\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/,operator:/--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/,punctuation:/[()[\]{},;]/},Prism.languages.gawk=Prism.languages.awk; \ No newline at end of file diff --git a/docs/js/components/prism-bash.min.js b/docs/js/components/prism-bash.min.js new file mode 100644 index 000000000000..f1659f1e3b35 --- /dev/null +++ b/docs/js/components/prism-bash.min.js @@ -0,0 +1 @@ +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i?^\w +\-.])*"/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,function:/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/}; \ No newline at end of file diff --git a/docs/js/components/prism-batch.min.js b/docs/js/components/prism-batch.min.js new file mode 100644 index 000000000000..886f10c7a221 --- /dev/null +++ b/docs/js/components/prism-batch.min.js @@ -0,0 +1 @@ +!function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;e.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-bbcode.min.js b/docs/js/components/prism-bbcode.min.js new file mode 100644 index 000000000000..4cadf4950f85 --- /dev/null +++ b/docs/js/components/prism-bbcode.min.js @@ -0,0 +1 @@ +Prism.languages.bbcode={tag:{pattern:/\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,inside:{tag:{pattern:/^\[\/?[^\s=\]]+/,inside:{punctuation:/^\[\/?/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\]/,"attr-name":/[^\s=\]]+/}}},Prism.languages.shortcode=Prism.languages.bbcode; \ No newline at end of file diff --git a/docs/js/components/prism-bbj.min.js b/docs/js/components/prism-bbj.min.js new file mode 100644 index 000000000000..839b4a943956 --- /dev/null +++ b/docs/js/components/prism-bbj.min.js @@ -0,0 +1 @@ +!function(e){e.languages.bbj={comment:{pattern:/(^|[^\\:])rem\s+.*/i,lookbehind:!0,greedy:!0},string:{pattern:/(['"])(?:(?!\1|\\).|\\.)*\1/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:abstract|all|argc|begin|bye|callback|case|chn|class|classend|ctl|day|declare|delete|dim|dom|dread|dsz|else|end|endif|err|exitto|extends|fi|field|for|from|gosub|goto|if|implements|interface|interfaceend|iol|iolist|let|list|load|method|methodend|methodret|on|opts|pfx|print|private|process_events|protected|psz|public|read|read_resource|release|remove_callback|repeat|restore|return|rev|seterr|setesc|sqlchn|sqlunt|ssn|start|static|swend|switch|sys|then|tim|unt|until|use|void|wend|where|while)\b/i,function:/\b\w+(?=\()/,boolean:/\b(?:BBjAPI\.TRUE|BBjAPI\.FALSE)\b/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:and|not|or|xor)\b/i,punctuation:/[.,;:()]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-bicep.min.js b/docs/js/components/prism-bicep.min.js new file mode 100644 index 000000000000..afc03a7b5a54 --- /dev/null +++ b/docs/js/components/prism-bicep.min.js @@ -0,0 +1 @@ +Prism.languages.bicep={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],property:[{pattern:/([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,lookbehind:!0},{pattern:/([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,lookbehind:!0,greedy:!0}],string:[{pattern:/'''[^'][\s\S]*?'''/,greedy:!0},{pattern:/(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0}],"interpolated-string":{pattern:/(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}\r\n]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0},punctuation:/^\$\{|\}$/}},string:/[\s\S]+/}},datatype:{pattern:/(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,lookbehind:!0,alias:"class-name"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,decorator:/@\w+\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,punctuation:/[{}[\];(),.:]/},Prism.languages.bicep["interpolated-string"].inside.interpolation.inside.expression.inside=Prism.languages.bicep; \ No newline at end of file diff --git a/docs/js/components/prism-birb.min.js b/docs/js/components/prism-birb.min.js new file mode 100644 index 000000000000..c61079e1eae9 --- /dev/null +++ b/docs/js/components/prism-birb.min.js @@ -0,0 +1 @@ +Prism.languages.birb=Prism.languages.extend("clike",{string:{pattern:/r?("|')(?:\\.|(?!\1)[^\\])*\1/,greedy:!0},"class-name":[/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,/\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/],keyword:/\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,operator:/\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,variable:/\b[a-z_]\w*\b/}),Prism.languages.insertBefore("birb","function",{metadata:{pattern:/<\w+>/,greedy:!0,alias:"symbol"}}); \ No newline at end of file diff --git a/docs/js/components/prism-bison.min.js b/docs/js/components/prism-bison.min.js new file mode 100644 index 000000000000..81ba88f68255 --- /dev/null +++ b/docs/js/components/prism-bison.min.js @@ -0,0 +1 @@ +Prism.languages.bison=Prism.languages.extend("c",{}),Prism.languages.insertBefore("bison","comment",{bison:{pattern:/^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:Prism.languages.c}},comment:Prism.languages.c.comment,string:Prism.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}}); \ No newline at end of file diff --git a/docs/js/components/prism-bnf.min.js b/docs/js/components/prism-bnf.min.js new file mode 100644 index 000000000000..324ad0980456 --- /dev/null +++ b/docs/js/components/prism-bnf.min.js @@ -0,0 +1 @@ +Prism.languages.bnf={string:{pattern:/"[^\r\n"]*"|'[^\r\n']*'/},definition:{pattern:/<[^<>\r\n\t]+>(?=\s*::=)/,alias:["rule","keyword"],inside:{punctuation:/^<|>$/}},rule:{pattern:/<[^<>\r\n\t]+>/,inside:{punctuation:/^<|>$/}},operator:/::=|[|()[\]{}*+?]|\.{3}/},Prism.languages.rbnf=Prism.languages.bnf; \ No newline at end of file diff --git a/docs/js/components/prism-bqn.min.js b/docs/js/components/prism-bqn.min.js new file mode 100644 index 000000000000..3a66be55d5b9 --- /dev/null +++ b/docs/js/components/prism-bqn.min.js @@ -0,0 +1 @@ +Prism.languages.bqn={shebang:{pattern:/^#![ \t]*\/.*/,alias:"important",greedy:!0},comment:{pattern:/#.*/,greedy:!0},"string-literal":{pattern:/"(?:[^"]|"")*"/,greedy:!0,alias:"string"},"character-literal":{pattern:/'(?:[\s\S]|[\uD800-\uDBFF][\uDC00-\uDFFF])'/,greedy:!0,alias:"char"},function:/•[\w¯.∞π]+[\w¯.∞π]*/,"dot-notation-on-brackets":{pattern:/\{(?=.*\}\.)|\}\./,alias:"namespace"},"special-name":{pattern:/(?:𝕨|𝕩|𝕗|𝕘|𝕤|𝕣|𝕎|𝕏|𝔽|𝔾|𝕊|_𝕣_|_𝕣)/,alias:"keyword"},"dot-notation-on-name":{pattern:/[A-Za-z_][\w¯∞π]*\./,alias:"namespace"},"word-number-scientific":{pattern:/\d+(?:\.\d+)?[eE]¯?\d+/,alias:"number"},"word-name":{pattern:/[A-Za-z_][\w¯∞π]*/,alias:"symbol"},"word-number":{pattern:/[¯∞π]?(?:\d*\.?\b\d+(?:e[+¯]?\d+|E[+¯]?\d+)?|¯|∞|π)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+|E[+¯]?\d+)?|¯|∞|π))?/,alias:"number"},"null-literal":{pattern:/@/,alias:"char"},"primitive-functions":{pattern:/[-+×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!]/,alias:"operator"},"primitive-1-operators":{pattern:/[`˜˘¨⁼⌜´˝˙]/,alias:"operator"},"primitive-2-operators":{pattern:/[∘⊸⟜○⌾⎉⚇⍟⊘◶⎊]/,alias:"operator"},punctuation:/[←⇐↩(){}⟨⟩[\]‿·⋄,.;:?]/}; \ No newline at end of file diff --git a/docs/js/components/prism-brainfuck.min.js b/docs/js/components/prism-brainfuck.min.js new file mode 100644 index 000000000000..ed9707eaa4eb --- /dev/null +++ b/docs/js/components/prism-brainfuck.min.js @@ -0,0 +1 @@ +Prism.languages.brainfuck={pointer:{pattern:/<|>/,alias:"keyword"},increment:{pattern:/\+/,alias:"inserted"},decrement:{pattern:/-/,alias:"deleted"},branching:{pattern:/\[|\]/,alias:"important"},operator:/[.,]/,comment:/\S+/}; \ No newline at end of file diff --git a/docs/js/components/prism-brightscript.min.js b/docs/js/components/prism-brightscript.min.js new file mode 100644 index 000000000000..af39c1bc85d1 --- /dev/null +++ b/docs/js/components/prism-brightscript.min.js @@ -0,0 +1 @@ +Prism.languages.brightscript={comment:/(?:\brem|').*/i,"directive-statement":{pattern:/(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,lookbehind:!0,alias:"property",inside:{"error-message":{pattern:/(^#error).+/,lookbehind:!0},directive:{pattern:/^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,alias:"keyword"},expression:{pattern:/[\s\S]+/,inside:null}}},property:{pattern:/([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},"class-name":{pattern:/(\bAs[\t ]+)\w+/i,lookbehind:!0},keyword:/\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?!\d)\w+(?=[\t ]*\()/,number:/(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,operator:/--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,punctuation:/[.,;()[\]{}]/,constant:/\b(?:LINE_NUM)\b/i},Prism.languages.brightscript["directive-statement"].inside.expression.inside=Prism.languages.brightscript; \ No newline at end of file diff --git a/docs/js/components/prism-bro.min.js b/docs/js/components/prism-bro.min.js new file mode 100644 index 000000000000..bf0c7edb920c --- /dev/null +++ b/docs/js/components/prism-bro.min.js @@ -0,0 +1 @@ +Prism.languages.bro={comment:{pattern:/(^|[^\\$])#.*/,lookbehind:!0,inside:{italic:/\b(?:FIXME|TODO|XXX)\b/}},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},boolean:/\b[TF]\b/,function:{pattern:/(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,lookbehind:!0},builtin:/(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,constant:{pattern:/(\bconst[ \t]+)\w+/i,lookbehind:!0},keyword:/\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,punctuation:/[{}[\];(),.:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-bsl.min.js b/docs/js/components/prism-bsl.min.js new file mode 100644 index 000000000000..4c934780870b --- /dev/null +++ b/docs/js/components/prism-bsl.min.js @@ -0,0 +1 @@ +Prism.languages.bsl={comment:/\/\/.*/,string:[{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},{pattern:/'(?:[^'\r\n\\]|\\.)*'/}],keyword:[{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i}],number:{pattern:/(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,lookbehind:!0},operator:[/[<>+\-*/]=?|[%=]/,{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:and|not|or)\b/i}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/,directive:[{pattern:/^([ \t]*)&.*/m,lookbehind:!0,greedy:!0,alias:"important"},{pattern:/^([ \t]*)#.*/gm,lookbehind:!0,greedy:!0,alias:"important"}]},Prism.languages.oscript=Prism.languages.bsl; \ No newline at end of file diff --git a/docs/js/components/prism-c.min.js b/docs/js/components/prism-c.min.js new file mode 100644 index 000000000000..7d4ddba7b62a --- /dev/null +++ b/docs/js/components/prism-c.min.js @@ -0,0 +1 @@ +Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; \ No newline at end of file diff --git a/docs/js/components/prism-cfscript.min.js b/docs/js/components/prism-cfscript.min.js new file mode 100644 index 000000000000..49dc2d0fef70 --- /dev/null +++ b/docs/js/components/prism-cfscript.min.js @@ -0,0 +1 @@ +Prism.languages.cfscript=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),Prism.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete Prism.languages.cfscript["class-name"],Prism.languages.cfc=Prism.languages.cfscript; \ No newline at end of file diff --git a/docs/js/components/prism-chaiscript.min.js b/docs/js/components/prism-chaiscript.min.js new file mode 100644 index 000000000000..cb69cb1c9607 --- /dev/null +++ b/docs/js/components/prism-chaiscript.min.js @@ -0,0 +1 @@ +Prism.languages.chaiscript=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,lookbehind:!0,greedy:!0},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},{pattern:/(\b(?:attr|def)\s+)\w+(?=\s*::)/,lookbehind:!0}],keyword:/\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,number:[Prism.languages.cpp.number,/\b(?:Infinity|NaN)\b/],operator:/>>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/}),Prism.languages.insertBefore("chaiscript","operator",{"parameter-type":{pattern:/([,(]\s*)\w+(?=\s+\w)/,lookbehind:!0,alias:"class-name"}}),Prism.languages.insertBefore("chaiscript","string",{"string-interpolation":{pattern:/(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,lookbehind:!0,inside:{"interpolation-expression":{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:Prism.languages.chaiscript},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"}}},string:/[\s\S]+/}}}); \ No newline at end of file diff --git a/docs/js/components/prism-cil.min.js b/docs/js/components/prism-cil.min.js new file mode 100644 index 000000000000..d65586adb17b --- /dev/null +++ b/docs/js/components/prism-cil.min.js @@ -0,0 +1 @@ +Prism.languages.cil={comment:/\/\/.*/,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},directive:{pattern:/(^|\W)\.[a-z]+(?=\s)/,lookbehind:!0,alias:"class-name"},variable:/\[[\w\.]+\]/,keyword:/\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,function:/\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,boolean:/\b(?:false|true)\b/,number:/\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,punctuation:/[{}[\];(),:=]|IL_[0-9A-Za-z]+/}; \ No newline at end of file diff --git a/docs/js/components/prism-cilkc.min.js b/docs/js/components/prism-cilkc.min.js new file mode 100644 index 000000000000..b8d22125e2fb --- /dev/null +++ b/docs/js/components/prism-cilkc.min.js @@ -0,0 +1 @@ +Prism.languages.cilkc=Prism.languages.insertBefore("c","function",{"parallel-keyword":{pattern:/\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\b/,alias:"keyword"}}),Prism.languages["cilk-c"]=Prism.languages.cilkc; \ No newline at end of file diff --git a/docs/js/components/prism-cilkcpp.min.js b/docs/js/components/prism-cilkcpp.min.js new file mode 100644 index 000000000000..5f726afdd3c0 --- /dev/null +++ b/docs/js/components/prism-cilkcpp.min.js @@ -0,0 +1 @@ +Prism.languages.cilkcpp=Prism.languages.insertBefore("cpp","function",{"parallel-keyword":{pattern:/\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\b/,alias:"keyword"}}),Prism.languages["cilk-cpp"]=Prism.languages.cilkcpp,Prism.languages.cilk=Prism.languages.cilkcpp; \ No newline at end of file diff --git a/docs/js/components/prism-clike.min.js b/docs/js/components/prism-clike.min.js new file mode 100644 index 000000000000..adfb9eca7abf --- /dev/null +++ b/docs/js/components/prism-clike.min.js @@ -0,0 +1 @@ +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-clojure.min.js b/docs/js/components/prism-clojure.min.js new file mode 100644 index 000000000000..8f86601e7d69 --- /dev/null +++ b/docs/js/components/prism-clojure.min.js @@ -0,0 +1 @@ +Prism.languages.clojure={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},char:/\\\w+/,symbol:{pattern:/(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,lookbehind:!0},keyword:{pattern:/(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,lookbehind:!0},boolean:/\b(?:false|nil|true)\b/,number:{pattern:/(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,lookbehind:!0},function:{pattern:/((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,lookbehind:!0},operator:/[#@^`~]/,punctuation:/[{}\[\](),]/}; \ No newline at end of file diff --git a/docs/js/components/prism-cmake.min.js b/docs/js/components/prism-cmake.min.js new file mode 100644 index 000000000000..a223df57be97 --- /dev/null +++ b/docs/js/components/prism-cmake.min.js @@ -0,0 +1 @@ +Prism.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}; \ No newline at end of file diff --git a/docs/js/components/prism-cobol.min.js b/docs/js/components/prism-cobol.min.js new file mode 100644 index 000000000000..6c68be1abaab --- /dev/null +++ b/docs/js/components/prism-cobol.min.js @@ -0,0 +1 @@ +Prism.languages.cobol={comment:{pattern:/\*>.*|(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},string:{pattern:/[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,greedy:!0},level:{pattern:/(^[ \t]*)\d+\b/m,lookbehind:!0,greedy:!0,alias:"number"},"class-name":{pattern:/(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,lookbehind:!0,inside:{number:{pattern:/(\()\d+/,lookbehind:!0},punctuation:/[()]/}},keyword:{pattern:/(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,lookbehind:!0},boolean:{pattern:/(^|[^\w-])(?:false|true)(?![\w-])/i,lookbehind:!0},number:{pattern:/(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,lookbehind:!0},operator:[/<>|[<>]=?|[=+*/&]/,{pattern:/(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,lookbehind:!0}],punctuation:/[.:,()]/}; \ No newline at end of file diff --git a/docs/js/components/prism-coffeescript.min.js b/docs/js/components/prism-coffeescript.min.js new file mode 100644 index 000000000000..e2fd36e8ce92 --- /dev/null +++ b/docs/js/components/prism-coffeescript.min.js @@ -0,0 +1 @@ +!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-concurnas.min.js b/docs/js/components/prism-concurnas.min.js new file mode 100644 index 000000000000..60294b7beb09 --- /dev/null +++ b/docs/js/components/prism-concurnas.min.js @@ -0,0 +1 @@ +Prism.languages.concurnas={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,lookbehind:!0,greedy:!0},langext:{pattern:/\b\w+\s*\|\|[\s\S]+?\|\|/,greedy:!0,inside:{"class-name":/^\w+/,string:{pattern:/(^\s*\|\|)[\s\S]+(?=\|\|$)/,lookbehind:!0},punctuation:/\|\|/}},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,lookbehind:!0},keyword:/\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,boolean:/\b(?:false|true)\b/,number:/\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,punctuation:/[{}[\];(),.:]/,operator:/<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,annotation:{pattern:/@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,alias:"builtin"}},Prism.languages.insertBefore("concurnas","langext",{"regex-literal":{pattern:/\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:Prism.languages.concurnas},regex:/[\s\S]+/}},"string-literal":{pattern:/(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:Prism.languages.concurnas},string:/[\s\S]+/}}}),Prism.languages.conc=Prism.languages.concurnas; \ No newline at end of file diff --git a/docs/js/components/prism-cooklang.min.js b/docs/js/components/prism-cooklang.min.js new file mode 100644 index 000000000000..126fd8bfb188 --- /dev/null +++ b/docs/js/components/prism-cooklang.min.js @@ -0,0 +1 @@ +!function(e){var a="(?:(?!\\s)[\\d$+<=a-zA-Z\\x80-\\uFFFF])+",t="[^{}@#]+\\{[^}#@]*\\}";e.languages.cooklang={comment:{pattern:/\[-[\s\S]*?-\]|--.*/,greedy:!0},meta:{pattern:/>>.*:.*/,inside:{property:{pattern:/(>>\s*)[^\s:](?:[^:]*[^\s:])?/,lookbehind:!0}}},"cookware-group":{pattern:new RegExp("#(?:"+t+"|"+a+")"),inside:{cookware:{pattern:new RegExp("(^#)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"cookware-keyword":{pattern:/^#/,alias:"keyword"},"quantity-group":{pattern:new RegExp(/\{[^{}@#]*\}/),inside:{quantity:{pattern:new RegExp("(^\\{)[^{}@#]+"),lookbehind:!0,alias:"number"},punctuation:/[{}]/}}}},"ingredient-group":{pattern:new RegExp("@(?:"+t+"|"+a+")"),inside:{ingredient:{pattern:new RegExp("(^@)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"ingredient-keyword":{pattern:/^@/,alias:"keyword"},"amount-group":{pattern:/\{[^{}]*\}/,inside:{amount:{pattern:/([\{|])[^{}|*%]+/,lookbehind:!0,alias:"number"},unit:{pattern:/(%)[^}]+/,lookbehind:!0,alias:"symbol"},"servings-scaler":{pattern:/\*/,alias:"operator"},"servings-alternative-separator":{pattern:/\|/,alias:"operator"},"unit-separator":{pattern:/(?:%|(\*)%)/,lookbehind:!0,alias:"operator"},punctuation:/[{}]/}}}},"timer-group":{pattern:/~(?!\s)[^@#~{}]*\{[^{}]*\}/,inside:{timer:{pattern:/(^~)[^{]+/,lookbehind:!0,alias:"variable"},"duration-group":{pattern:/\{[^{}]*\}/,inside:{punctuation:/[{}]/,unit:{pattern:new RegExp("(%\\s*)(?:h|hours|hrs|m|min|minutes)\\b"),lookbehind:!0,alias:"symbol"},operator:/%/,duration:{pattern:/\d+/,alias:"number"}}},"timer-keyword":{pattern:/^~/,alias:"keyword"}}}}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-coq.min.js b/docs/js/components/prism-coq.min.js new file mode 100644 index 000000000000..c14f0027ab08 --- /dev/null +++ b/docs/js/components/prism-coq.min.js @@ -0,0 +1 @@ +!function(e){for(var t="\\(\\*(?:[^(*]|\\((?!\\*)|\\*(?!\\))|)*\\*\\)",i=0;i<2;i++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,"[]"),e.languages.coq={comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp('#\\[(?:[^\\[\\]("]|"(?:[^"]|"")*"(?!")|\\((?!\\*)|)*\\]'.replace(//g,(function(){return t}))),greedy:!0,alias:"attr-name",inside:{comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-cpp.min.js b/docs/js/components/prism-cpp.min.js new file mode 100644 index 000000000000..a7df36a6039a --- /dev/null +++ b/docs/js/components/prism-cpp.min.js @@ -0,0 +1 @@ +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-crystal.min.js b/docs/js/components/prism-crystal.min.js new file mode 100644 index 000000000000..145ced2ea813 --- /dev/null +++ b/docs/js/components/prism-crystal.min.js @@ -0,0 +1 @@ +!function(e){e.languages.crystal=e.languages.extend("ruby",{keyword:[/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,{pattern:/(\.\s*)(?:is_a|responds_to)\?/,lookbehind:!0}],number:/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,operator:[/->/,e.languages.ruby.operator],punctuation:/[(){}[\].,;\\]/}),e.languages.insertBefore("crystal","string-literal",{attribute:{pattern:/@\[.*?\]/,inside:{delimiter:{pattern:/^@\[|\]$/,alias:"punctuation"},attribute:{pattern:/^(\s*)\w+/,lookbehind:!0,alias:"class-name"},args:{pattern:/\S(?:[\s\S]*\S)?/,inside:e.languages.crystal}}},expansion:{pattern:/\{(?:\{.*?\}|%.*?%)\}/,inside:{content:{pattern:/^(\{.)[\s\S]+(?=.\}$)/,lookbehind:!0,inside:e.languages.crystal},delimiter:{pattern:/^\{[\{%]|[\}%]\}$/,alias:"operator"}}},char:{pattern:/'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,greedy:!0}})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-csharp.min.js b/docs/js/components/prism-csharp.min.js new file mode 100644 index 000000000000..45bb0da8981a --- /dev/null +++ b/docs/js/components/prism-csharp.min.js @@ -0,0 +1 @@ +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-cshtml.min.js b/docs/js/components/prism-cshtml.min.js new file mode 100644 index 000000000000..bc2e9b809cb9 --- /dev/null +++ b/docs/js/components/prism-cshtml.min.js @@ -0,0 +1 @@ +!function(e){function s(e,s){for(var a=0;a/g,(function(){return"(?:"+e+")"}));return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|\'(?:(?:[^\r\n\'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})\'|(?=[^\\\\](?!\'))))').replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",1),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]||)*>",1)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="(?:\"[^\"@]*\"|'[^'@]*'|[^\\s'\"@>=]+(?=[\\s>])|[\"'][^\"'@]*(?:(?:@(?![\\w()])|"+n+")[^\"'@]*)+[\"'])",i="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,l),g="(?!\\d)[^\\s>/=$<%]+"+i+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+i+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+g+")";e.languages.cshtml=e.languages.extend("markup",{});var c={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},p={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:c}};e.languages.cshtml.tag.pattern=RegExp("|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:i})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-css.min.js b/docs/js/components/prism-css.min.js new file mode 100644 index 000000000000..3a9b628ebecd --- /dev/null +++ b/docs/js/components/prism-css.min.js @@ -0,0 +1 @@ +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-csv.min.js b/docs/js/components/prism-csv.min.js new file mode 100644 index 000000000000..259e1da56953 --- /dev/null +++ b/docs/js/components/prism-csv.min.js @@ -0,0 +1 @@ +Prism.languages.csv={value:/[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,punctuation:/,/}; \ No newline at end of file diff --git a/docs/js/components/prism-cue.min.js b/docs/js/components/prism-cue.min.js new file mode 100644 index 000000000000..e88bcf519cc1 --- /dev/null +++ b/docs/js/components/prism-cue.min.js @@ -0,0 +1 @@ +!function(e){var n="(?:"+"\"\"\"(?:[^\\\\\"]|\"(?!\"\"\\2)|)*\"\"\"|'''(?:[^\\\\']|'(?!''\\2)|)*'''|\"(?:[^\\\\\r\n\"]|\"(?!\\2)|)*\"|'(?:[^\\\\\r\n']|'(?!\\2)|)*'".replace(//g,"\\\\(?:(?!\\2)|\\2(?:[^()\r\n]|\\([^()]*\\)))")+")";e.languages.cue={comment:{pattern:/\/\/.*/,greedy:!0},"string-literal":{pattern:RegExp("(^|[^#\"'\\\\])(#*)"+n+"(?![\"'])\\2"),lookbehind:!0,greedy:!0,inside:{escape:{pattern:/(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/,greedy:!0,alias:"string"},interpolation:{pattern:/(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/,greedy:!0,inside:{punctuation:/^\\#*\(|\)$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:{pattern:/(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/,lookbehind:!0},boolean:{pattern:/(^|[^\w$])(?:false|true)(?![\w$])/,lookbehind:!0},builtin:{pattern:/(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/,lookbehind:!0},attribute:{pattern:/@[\w$]+(?=\s*\()/,alias:"function"},function:{pattern:/(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i,lookbehind:!0},number:{pattern:/(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/,lookbehind:!0},operator:/\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/,punctuation:/[()[\]{},.:]/},e.languages.cue["string-literal"].inside.interpolation.inside.expression.inside=e.languages.cue}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-cypher.min.js b/docs/js/components/prism-cypher.min.js new file mode 100644 index 000000000000..3461dd3dd22e --- /dev/null +++ b/docs/js/components/prism-cypher.min.js @@ -0,0 +1 @@ +Prism.languages.cypher={comment:/\/\/.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,greedy:!0},"class-name":{pattern:/(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,lookbehind:!0,greedy:!0},relationship:{pattern:/(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,lookbehind:!0,greedy:!0,alias:"property"},identifier:{pattern:/`(?:[^`\\\r\n])*`/,greedy:!0},variable:/\$\w+/,keyword:/\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,function:/\b\w+\b(?=\s*\()/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,operator:/:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,punctuation:/[()[\]{},;.]/}; \ No newline at end of file diff --git a/docs/js/components/prism-d.min.js b/docs/js/components/prism-d.min.js new file mode 100644 index 000000000000..d84ab1dfeac7 --- /dev/null +++ b/docs/js/components/prism-d.min.js @@ -0,0 +1 @@ +Prism.languages.d=Prism.languages.extend("clike",{comment:[{pattern:/^\s*#!.+/,greedy:!0},{pattern:RegExp("(^|[^\\\\])(?:"+["/\\+(?:/\\+(?:[^+]|\\+(?!/))*\\+/|(?!/\\+)[^])*?\\+/","//.*","/\\*[^]*?\\*/"].join("|")+")"),lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(['\\b[rx]"(?:\\\\[^]|[^\\\\"])*"[cwd]?','\\bq"(?:\\[[^]*?\\]|\\([^]*?\\)|<[^]*?>|\\{[^]*?\\})"','\\bq"((?!\\d)\\w+)$[^]*?^\\1"','\\bq"(.)[^]*?\\2"','(["`])(?:\\\\[^]|(?!\\3)[^\\\\])*\\3[cwd]?'].join("|"),"m"),greedy:!0},{pattern:/\bq\{(?:\{[^{}]*\}|[^{}])*\}/,greedy:!0,alias:"token-string"}],keyword:/\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,number:[/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,{pattern:/((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,lookbehind:!0}],operator:/\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/}),Prism.languages.insertBefore("d","string",{char:/'(?:\\(?:\W|\w+)|[^\\])'/}),Prism.languages.insertBefore("d","keyword",{property:/\B@\w*/}),Prism.languages.insertBefore("d","function",{register:{pattern:/\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,alias:"variable"}}); \ No newline at end of file diff --git a/docs/js/components/prism-dart.min.js b/docs/js/components/prism-dart.min.js new file mode 100644 index 000000000000..e16ca211d075 --- /dev/null +++ b/docs/js/components/prism-dart.min.js @@ -0,0 +1 @@ +!function(e){var a=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};e.languages.dart=e.languages.extend("clike",{"class-name":[s,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:s.inside}],keyword:a,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),e.languages.insertBefore("dart","string",{"string-literal":{pattern:/r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,lookbehind:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:e.languages.dart}}},string:/[\s\S]+/}},string:void 0}),e.languages.insertBefore("dart","class-name",{metadata:{pattern:/@\w+/,alias:"function"}}),e.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-dataweave.min.js b/docs/js/components/prism-dataweave.min.js new file mode 100644 index 000000000000..98c8d86867fd --- /dev/null +++ b/docs/js/components/prism-dataweave.min.js @@ -0,0 +1 @@ +!function(e){e.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-dax.min.js b/docs/js/components/prism-dax.min.js new file mode 100644 index 000000000000..b4276160b2d7 --- /dev/null +++ b/docs/js/components/prism-dax.min.js @@ -0,0 +1 @@ +Prism.languages.dax={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,lookbehind:!0},"data-field":{pattern:/'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,alias:"symbol"},measure:{pattern:/\[[ \w\xA0-\uFFFF]+\]/,alias:"constant"},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},function:/\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,keyword:/\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,boolean:{pattern:/\b(?:FALSE|NULL|TRUE)\b/i,alias:"constant"},number:/\b\d+(?:\.\d*)?|\B\.\d+\b/,operator:/:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,punctuation:/[;\[\](){}`,.]/}; \ No newline at end of file diff --git a/docs/js/components/prism-dhall.min.js b/docs/js/components/prism-dhall.min.js new file mode 100644 index 000000000000..6138cd908ed4 --- /dev/null +++ b/docs/js/components/prism-dhall.min.js @@ -0,0 +1 @@ +Prism.languages.dhall={comment:/--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,string:{pattern:/"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-dhall",inside:null},punctuation:/\$\{|\}/}}}},label:{pattern:/`[^`]*`/,greedy:!0},url:{pattern:/\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,greedy:!0},env:{pattern:/\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,greedy:!0,inside:{function:/^env/,operator:/^:/,variable:/[\s\S]+/}},hash:{pattern:/\bsha256:[\da-fA-F]{64}\b/,inside:{function:/sha256/,operator:/:/,number:/[\da-fA-F]{64}/}},keyword:/\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,builtin:/\b(?:None|Some)\b/,boolean:/\b(?:False|True)\b/,number:/\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,operator:/\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,punctuation:/\.\.|[{}\[\](),./]/,"class-name":/\b[A-Z]\w*\b/},Prism.languages.dhall.string.inside.interpolation.inside.expression.inside=Prism.languages.dhall; \ No newline at end of file diff --git a/docs/js/components/prism-diff.min.js b/docs/js/components/prism-diff.min.js new file mode 100644 index 000000000000..16d9fe0a03a3 --- /dev/null +++ b/docs/js/components/prism-diff.min.js @@ -0,0 +1 @@ +!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var n={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(n).forEach((function(a){var i=n[a],r=[];/^\w+$/.test(a)||r.push(/\w+/.exec(a)[0]),"diff"===a&&r.push("bold"),e.languages.diff[a]={pattern:RegExp("^(?:["+i+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(a)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:n})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-django.min.js b/docs/js/components/prism-django.min.js new file mode 100644 index 000000000000..24879e50d502 --- /dev/null +++ b/docs/js/components/prism-django.min.js @@ -0,0 +1 @@ +!function(e){e.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=e.languages["markup-templating"];e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"django",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"django")})),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"jinja2",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"jinja2")}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-dns-zone-file.min.js b/docs/js/components/prism-dns-zone-file.min.js new file mode 100644 index 000000000000..66c7f819c50d --- /dev/null +++ b/docs/js/components/prism-dns-zone-file.min.js @@ -0,0 +1 @@ +Prism.languages["dns-zone-file"]={comment:/;.*/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},variable:[{pattern:/(^\$ORIGIN[ \t]+)\S+/m,lookbehind:!0},{pattern:/(^|\s)@(?=\s|$)/,lookbehind:!0}],keyword:/^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,class:{pattern:/(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,lookbehind:!0,alias:"keyword"},punctuation:/[()]/},Prism.languages["dns-zone"]=Prism.languages["dns-zone-file"]; \ No newline at end of file diff --git a/docs/js/components/prism-docker.min.js b/docs/js/components/prism-docker.min.js new file mode 100644 index 000000000000..dd5622a1c470 --- /dev/null +++ b/docs/js/components/prism-docker.min.js @@ -0,0 +1 @@ +!function(e){var n="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,(function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"})),r="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,(function(){return r})),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,r){return e=e.replace(//g,(function(){return t})).replace(//g,(function(){return n})),RegExp(e,r)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-dot.min.js b/docs/js/components/prism-dot.min.js new file mode 100644 index 000000000000..6af79d24ec2d --- /dev/null +++ b/docs/js/components/prism-dot.min.js @@ -0,0 +1 @@ +!function(e){var a="(?:"+["[a-zA-Z_\\x80-\\uFFFF][\\w\\x80-\\uFFFF]*","-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)",'"[^"\\\\]*(?:\\\\[^][^"\\\\]*)*"',"<(?:[^<>]|(?!\x3c!--)<(?:[^<>\"']|\"[^\"]*\"|'[^']*')+>|\x3c!--(?:[^-]|-(?!->))*--\x3e)*>"].join("|")+")",n={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,n){return RegExp(e.replace(//g,(function(){return a})),n)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r("(\\b(?:digraph|graph|subgraph)[ \t\r\n]+)","i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:n},"attr-value":{pattern:r("(=[ \t\r\n]*)"),lookbehind:!0,greedy:!0,inside:n},"attr-name":{pattern:r("([\\[;, \t\r\n])(?=[ \t\r\n]*=)"),lookbehind:!0,greedy:!0,inside:n},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r("(^|[^-.\\w\\x80-\\uFFFF\\\\])"),lookbehind:!0,greedy:!0,inside:n},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-ebnf.min.js b/docs/js/components/prism-ebnf.min.js new file mode 100644 index 000000000000..34b8d157ffa7 --- /dev/null +++ b/docs/js/components/prism-ebnf.min.js @@ -0,0 +1 @@ +Prism.languages.ebnf={comment:/\(\*[\s\S]*?\*\)/,string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},special:{pattern:/\?[^?\r\n]*\?/,greedy:!0,alias:"class-name"},definition:{pattern:/^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,lookbehind:!0,alias:["rule","keyword"]},rule:/\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,punctuation:/\([:/]|[:/]\)|[.,;()[\]{}]/,operator:/[-=|*/!]/}; \ No newline at end of file diff --git a/docs/js/components/prism-editorconfig.min.js b/docs/js/components/prism-editorconfig.min.js new file mode 100644 index 000000000000..d98df1685dbc --- /dev/null +++ b/docs/js/components/prism-editorconfig.min.js @@ -0,0 +1 @@ +Prism.languages.editorconfig={comment:/[;#].*/,section:{pattern:/(^[ \t]*)\[.+\]/m,lookbehind:!0,alias:"selector",inside:{regex:/\\\\[\[\]{},!?.*]/,operator:/[!?]|\.\.|\*{1,2}/,punctuation:/[\[\]{},]/}},key:{pattern:/(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/=.*/,alias:"attr-value",inside:{punctuation:/^=/}}}; \ No newline at end of file diff --git a/docs/js/components/prism-eiffel.min.js b/docs/js/components/prism-eiffel.min.js new file mode 100644 index 000000000000..17513cf5dbb9 --- /dev/null +++ b/docs/js/components/prism-eiffel.min.js @@ -0,0 +1 @@ +Prism.languages.eiffel={comment:/--.*/,string:[{pattern:/"([^[]*)\[[\s\S]*?\]\1"/,greedy:!0},{pattern:/"([^{]*)\{[\s\S]*?\}\1"/,greedy:!0},{pattern:/"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,greedy:!0}],char:/'(?:%.|[^%'\r\n])+'/,keyword:/\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,boolean:/\b(?:False|True)\b/i,"class-name":/\b[A-Z][\dA-Z_]*\b/,number:[/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i],punctuation:/:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,operator:/\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/}; \ No newline at end of file diff --git a/docs/js/components/prism-ejs.min.js b/docs/js/components/prism-ejs.min.js new file mode 100644 index 000000000000..84affeef07db --- /dev/null +++ b/docs/js/components/prism-ejs.min.js @@ -0,0 +1 @@ +!function(a){a.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:a.languages.javascript}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"ejs",/<%(?!%)[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"ejs")})),a.languages.eta=a.languages.ejs}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-elixir.min.js b/docs/js/components/prism-elixir.min.js new file mode 100644 index 000000000000..e885b9f134f4 --- /dev/null +++ b/docs/js/components/prism-elixir.min.js @@ -0,0 +1 @@ +Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach((function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}})); \ No newline at end of file diff --git a/docs/js/components/prism-elm.min.js b/docs/js/components/prism-elm.min.js new file mode 100644 index 000000000000..681418de5919 --- /dev/null +++ b/docs/js/components/prism-elm.min.js @@ -0,0 +1 @@ +Prism.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|exposing|import)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-erb.min.js b/docs/js/components/prism-erb.min.js new file mode 100644 index 000000000000..4b9da608d89b --- /dev/null +++ b/docs/js/components/prism-erb.min.js @@ -0,0 +1 @@ +!function(e){e.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:e.languages.ruby}},e.hooks.add("before-tokenize",(function(n){e.languages["markup-templating"].buildPlaceholders(n,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"erb")}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-erlang.min.js b/docs/js/components/prism-erlang.min.js new file mode 100644 index 000000000000..806d0b16eafe --- /dev/null +++ b/docs/js/components/prism-erlang.min.js @@ -0,0 +1 @@ +Prism.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}; \ No newline at end of file diff --git a/docs/js/components/prism-etlua.min.js b/docs/js/components/prism-etlua.min.js new file mode 100644 index 000000000000..431aa61afff9 --- /dev/null +++ b/docs/js/components/prism-etlua.min.js @@ -0,0 +1 @@ +!function(a){a.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:a.languages.lua}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"etlua",/<%[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"etlua")}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-excel-formula.min.js b/docs/js/components/prism-excel-formula.min.js new file mode 100644 index 000000000000..bdf842f32d7d --- /dev/null +++ b/docs/js/components/prism-excel-formula.min.js @@ -0,0 +1 @@ +Prism.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"builtin"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"selector",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"selector"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},Prism.languages.xlsx=Prism.languages.xls=Prism.languages["excel-formula"]; \ No newline at end of file diff --git a/docs/js/components/prism-factor.min.js b/docs/js/components/prism-factor.min.js new file mode 100644 index 000000000000..37b8a6395ebe --- /dev/null +++ b/docs/js/components/prism-factor.min.js @@ -0,0 +1 @@ +!function(e){var t={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},s={number:/\\[^\s']|%\w/},i={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:t},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:t}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:s.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:s}},n=function(e){return(e+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},r=function(e){return new RegExp("(^|\\s)(?:"+e.map(n).join("|")+")(?=\\s|$)")},a={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(a).forEach((function(e){i[e].pattern=r(a[e])})),i.combinators.pattern=r(["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"]),e.languages.factor=i}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-false.min.js b/docs/js/components/prism-false.min.js new file mode 100644 index 000000000000..bd533dcf04b2 --- /dev/null +++ b/docs/js/components/prism-false.min.js @@ -0,0 +1 @@ +!function(a){a.languages.false={comment:{pattern:/\{[^}]*\}/},string:{pattern:/"[^"]*"/,greedy:!0},"character-code":{pattern:/'(?:[^\r]|\r\n?)/,alias:"number"},"assembler-code":{pattern:/\d+`/,alias:"important"},number:/\d+/,operator:/[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()!=]=?|[-+*/%]|\b(?:in|is)\b/}),delete Prism.languages["firestore-security-rules"]["class-name"],Prism.languages.insertBefore("firestore-security-rules","keyword",{path:{pattern:/(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,inside:{operator:/=/,keyword:/\*\*/,punctuation:/[.$(){}]/}},punctuation:/\//}},method:{pattern:/(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,lookbehind:!0,alias:"builtin",inside:{punctuation:/,/}}}); \ No newline at end of file diff --git a/docs/js/components/prism-flow.min.js b/docs/js/components/prism-flow.min.js new file mode 100644 index 000000000000..9cb2427fb214 --- /dev/null +++ b/docs/js/components/prism-flow.min.js @@ -0,0 +1 @@ +!function(a){a.languages.flow=a.languages.extend("javascript",{}),a.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),a.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete a.languages.flow.parameter,a.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(a.languages.flow.keyword)||(a.languages.flow.keyword=[a.languages.flow.keyword]),a.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-fortran.min.js b/docs/js/components/prism-fortran.min.js new file mode 100644 index 000000000000..f817c769c9bb --- /dev/null +++ b/docs/js/components/prism-fortran.min.js @@ -0,0 +1 @@ +Prism.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:{pattern:/!.*/,greedy:!0},boolean:/\.(?:FALSE|TRUE)\.(?:_\w+)?/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/}; \ No newline at end of file diff --git a/docs/js/components/prism-fsharp.min.js b/docs/js/components/prism-fsharp.min.js new file mode 100644 index 000000000000..73fa5e20987f --- /dev/null +++ b/docs/js/components/prism-fsharp.min.js @@ -0,0 +1 @@ +Prism.languages.fsharp=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,greedy:!0},"class-name":{pattern:/(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,lookbehind:!0,inside:{operator:/->|\*/,punctuation:/\./}},keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,number:[/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,/\b0b[01]+(?:uy|y)?\b/,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/],operator:/([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/}),Prism.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(^#)\b(?:else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.insertBefore("fsharp","punctuation",{"computation-expression":{pattern:/\b[_a-z]\w*(?=\s*\{)/i,alias:"keyword"}}),Prism.languages.insertBefore("fsharp","string",{annotation:{pattern:/\[<.+?>\]/,greedy:!0,inside:{punctuation:/^\[<|>\]$/,"class-name":{pattern:/^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,lookbehind:!0},"annotation-content":{pattern:/[\s\S]+/,inside:Prism.languages.fsharp}}},char:{pattern:/'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,greedy:!0}}); \ No newline at end of file diff --git a/docs/js/components/prism-ftl.min.js b/docs/js/components/prism-ftl.min.js new file mode 100644 index 000000000000..2b2a431a961c --- /dev/null +++ b/docs/js/components/prism-ftl.min.js @@ -0,0 +1 @@ +!function(e){for(var t="[^<()\"']|\\((?:)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\x3e|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'",n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,"[^\\s\\S]");var i={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp("(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:))*\\})*\\1".replace(//g,(function(){return t}))),greedy:!0,inside:{interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:))*\\}".replace(//g,(function(){return t}))),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};i.string[1].inside.interpolation.inside.rest=i,e.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}}},e.hooks.add("before-tokenize",(function(n){var i=RegExp("<#--[^]*?--\x3e|)*?>|\\$\\{(?:)*?\\}".replace(//g,(function(){return t})),"gi");e.languages["markup-templating"].buildPlaceholders(n,"ftl",i)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"ftl")}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-gap.min.js b/docs/js/components/prism-gap.min.js new file mode 100644 index 000000000000..af65ff2eb475 --- /dev/null +++ b/docs/js/components/prism-gap.min.js @@ -0,0 +1 @@ +Prism.languages.gap={shell:{pattern:/^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,greedy:!0,inside:{gap:{pattern:/^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,lookbehind:!0,inside:null},punctuation:/^gap>/}},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,lookbehind:!0,greedy:!0,inside:{continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"}}},keyword:/\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"},operator:/->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,punctuation:/[()[\]{},;.:]/},Prism.languages.gap.shell.inside.gap.inside=Prism.languages.gap; \ No newline at end of file diff --git a/docs/js/components/prism-gcode.min.js b/docs/js/components/prism-gcode.min.js new file mode 100644 index 000000000000..54464dfb41a5 --- /dev/null +++ b/docs/js/components/prism-gcode.min.js @@ -0,0 +1 @@ +Prism.languages.gcode={comment:/;.*|\B\(.*?\)\B/,string:{pattern:/"(?:""|[^"])*"/,greedy:!0},keyword:/\b[GM]\d+(?:\.\d+)?\b/,property:/\b[A-Z]/,checksum:{pattern:/(\*)\d+/,lookbehind:!0,alias:"number"},punctuation:/[:*]/}; \ No newline at end of file diff --git a/docs/js/components/prism-gdscript.min.js b/docs/js/components/prism-gdscript.min.js new file mode 100644 index 000000000000..e9a5a232e87c --- /dev/null +++ b/docs/js/components/prism-gdscript.min.js @@ -0,0 +1 @@ +Prism.languages.gdscript={comment:/#.*/,string:{pattern:/@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,greedy:!0},"class-name":{pattern:/(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,lookbehind:!0},keyword:/\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,variable:/\$\w+/,number:[/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,/\b(?:INF|NAN|PI|TAU)\b/],constant:/\b[A-Z][A-Z_\d]*\b/,boolean:/\b(?:false|true)\b/,operator:/->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,punctuation:/[.:,;()[\]{}]/}; \ No newline at end of file diff --git a/docs/js/components/prism-gedcom.min.js b/docs/js/components/prism-gedcom.min.js new file mode 100644 index 000000000000..c16feee9a11c --- /dev/null +++ b/docs/js/components/prism-gedcom.min.js @@ -0,0 +1 @@ +Prism.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},record:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"tag"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}; \ No newline at end of file diff --git a/docs/js/components/prism-gettext.min.js b/docs/js/components/prism-gettext.min.js new file mode 100644 index 000000000000..f542a249c5c0 --- /dev/null +++ b/docs/js/components/prism-gettext.min.js @@ -0,0 +1 @@ +Prism.languages.gettext={comment:[{pattern:/# .*/,greedy:!0,alias:"translator-comment"},{pattern:/#\..*/,greedy:!0,alias:"extracted-comment"},{pattern:/#:.*/,greedy:!0,alias:"reference-comment"},{pattern:/#,.*/,greedy:!0,alias:"flag-comment"},{pattern:/#\|.*/,greedy:!0,alias:"previously-untranslated-comment"},{pattern:/#.*/,greedy:!0}],string:{pattern:/(^|[^\\])"(?:[^"\\]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/^msg(?:ctxt|id|id_plural|str)\b/m,number:/\b\d+\b/,punctuation:/[\[\]]/},Prism.languages.po=Prism.languages.gettext; \ No newline at end of file diff --git a/docs/js/components/prism-gherkin.min.js b/docs/js/components/prism-gherkin.min.js new file mode 100644 index 000000000000..183dac72ddfe --- /dev/null +++ b/docs/js/components/prism-gherkin.min.js @@ -0,0 +1 @@ +!function(a){var n="(?:\r?\n|\r)[ \t]*\\|.+\\|(?:(?!\\|).)*";a.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+n+")(?:"+n+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(n),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-git.min.js b/docs/js/components/prism-git.min.js new file mode 100644 index 000000000000..b47266196061 --- /dev/null +++ b/docs/js/components/prism-git.min.js @@ -0,0 +1 @@ +Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}; \ No newline at end of file diff --git a/docs/js/components/prism-glsl.min.js b/docs/js/components/prism-glsl.min.js new file mode 100644 index 000000000000..655b92dac01c --- /dev/null +++ b/docs/js/components/prism-glsl.min.js @@ -0,0 +1 @@ +Prism.languages.glsl=Prism.languages.extend("c",{keyword:/\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/}); \ No newline at end of file diff --git a/docs/js/components/prism-gml.min.js b/docs/js/components/prism-gml.min.js new file mode 100644 index 000000000000..42b508de75d0 --- /dev/null +++ b/docs/js/components/prism-gml.min.js @@ -0,0 +1 @@ +Prism.languages.gamemakerlanguage=Prism.languages.gml=Prism.languages.extend("clike",{keyword:/\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,number:/(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,operator:/--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,constant:/\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,variable:/\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/}); \ No newline at end of file diff --git a/docs/js/components/prism-gn.min.js b/docs/js/components/prism-gn.min.js new file mode 100644 index 000000000000..c8208cc5c632 --- /dev/null +++ b/docs/js/components/prism-gn.min.js @@ -0,0 +1 @@ +Prism.languages.gn={comment:{pattern:/#.*/,greedy:!0},"string-literal":{pattern:/(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,lookbehind:!0,inside:{number:/^\$0x[\s\S]{2}$/,variable:/^\$\w+$/,"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:/\b(?:else|if)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,alias:"keyword"},function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,number:/-?\b\d+\b/,operator:/[-+!=<>]=?|&&|\|\|/,punctuation:/[(){}[\],.]/},Prism.languages.gn["string-literal"].inside.interpolation.inside.expression.inside=Prism.languages.gn,Prism.languages.gni=Prism.languages.gn; \ No newline at end of file diff --git a/docs/js/components/prism-go-module.min.js b/docs/js/components/prism-go-module.min.js new file mode 100644 index 000000000000..0a0974216f1a --- /dev/null +++ b/docs/js/components/prism-go-module.min.js @@ -0,0 +1 @@ +Prism.languages["go-mod"]=Prism.languages["go-module"]={comment:{pattern:/\/\/.*/,greedy:!0},version:{pattern:/(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,lookbehind:!0,alias:"number"},"go-version":{pattern:/((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,lookbehind:!0,alias:"number"},keyword:{pattern:/^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,lookbehind:!0},operator:/=>/,punctuation:/[()[\],]/}; \ No newline at end of file diff --git a/docs/js/components/prism-go.min.js b/docs/js/components/prism-go.min.js new file mode 100644 index 000000000000..9cc2699ba3ff --- /dev/null +++ b/docs/js/components/prism-go.min.js @@ -0,0 +1 @@ +Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]; \ No newline at end of file diff --git a/docs/js/components/prism-gradle.min.js b/docs/js/components/prism-gradle.min.js new file mode 100644 index 000000000000..96aae9aa041b --- /dev/null +++ b/docs/js/components/prism-gradle.min.js @@ -0,0 +1 @@ +!function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.gradle=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("gradle","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("gradle","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("gradle","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.gradle}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-graphql.min.js b/docs/js/components/prism-graphql.min.js new file mode 100644 index 000000000000..3a5133fc1b3e --- /dev/null +++ b/docs/js/components/prism-graphql.min.js @@ -0,0 +1 @@ +Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},Prism.hooks.add("after-tokenize",(function(n){if("graphql"===n.language)for(var t=n.tokens.filter((function(n){return"string"!=typeof n&&"comment"!==n.type&&"scalar"!==n.type})),e=0;e0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var u=e;u=0&&b(p,"variable-input")}}}}function l(n){return t[e+n]}function c(n,t){t=t||0;for(var e=0;e]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.groovy}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-haml.min.js b/docs/js/components/prism-haml.min.js new file mode 100644 index 000000000000..7b81c0ca7022 --- /dev/null +++ b/docs/js/components/prism-haml.min.js @@ -0,0 +1 @@ +!function(n){n.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:n.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:n.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:n.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:n.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:n.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:n.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:n.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var e=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],t={},r=0,a=e.length;r@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"handlebars")})),a.languages.hbs=a.languages.handlebars,a.languages.mustache=a.languages.handlebars}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-haskell.min.js b/docs/js/components/prism-haskell.min.js new file mode 100644 index 000000000000..4753b0d27e50 --- /dev/null +++ b/docs/js/components/prism-haskell.min.js @@ -0,0 +1 @@ +Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell; \ No newline at end of file diff --git a/docs/js/components/prism-haxe.min.js b/docs/js/components/prism-haxe.min.js new file mode 100644 index 000000000000..bc64bbb3a5ee --- /dev/null +++ b/docs/js/components/prism-haxe.min.js @@ -0,0 +1 @@ +Prism.languages.haxe=Prism.languages.extend("clike",{string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},"class-name":[{pattern:/(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,function:{pattern:/\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,greedy:!0},operator:/\.{3}|\+\+|--|&&|\|\||->|=>|(?:<{1,3}|[-+*/%!=&|^])=?|[?:~]/}),Prism.languages.insertBefore("haxe","string",{"string-interpolation":{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{interpolation:{pattern:/(^|[^\\])\$(?:\w+|\{[^{}]+\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:Prism.languages.haxe}}},string:/[\s\S]+/}}}),Prism.languages.insertBefore("haxe","class-name",{regex:{pattern:/~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,greedy:!0,inside:{"regex-flags":/\b[a-z]+$/,"regex-source":{pattern:/^(~\/)[\s\S]+(?=\/$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^~\/|\/$/}}}),Prism.languages.insertBefore("haxe","keyword",{preprocessor:{pattern:/#(?:else|elseif|end|if)\b.*/,alias:"property"},metadata:{pattern:/@:?[\w.]+/,alias:"symbol"},reification:{pattern:/\$(?:\w+|(?=\{))/,alias:"important"}}); \ No newline at end of file diff --git a/docs/js/components/prism-hcl.min.js b/docs/js/components/prism-hcl.min.js new file mode 100644 index 000000000000..2ed0a9b993de --- /dev/null +++ b/docs/js/components/prism-hcl.min.js @@ -0,0 +1 @@ +Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}; \ No newline at end of file diff --git a/docs/js/components/prism-hlsl.min.js b/docs/js/components/prism-hlsl.min.js new file mode 100644 index 000000000000..364778c8f4b9 --- /dev/null +++ b/docs/js/components/prism-hlsl.min.js @@ -0,0 +1 @@ +Prism.languages.hlsl=Prism.languages.extend("c",{"class-name":[Prism.languages.c["class-name"],/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/],keyword:[/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/],number:/(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,boolean:/\b(?:false|true)\b/}); \ No newline at end of file diff --git a/docs/js/components/prism-hoon.min.js b/docs/js/components/prism-hoon.min.js new file mode 100644 index 000000000000..7ffbe1484792 --- /dev/null +++ b/docs/js/components/prism-hoon.min.js @@ -0,0 +1 @@ +Prism.languages.hoon={comment:{pattern:/::.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/,greedy:!0},constant:/%(?:\.[ny]|[\w-]+)/,"class-name":/@(?:[a-z0-9-]*[a-z0-9])?|\*/i,function:/(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,keyword:/\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/}; \ No newline at end of file diff --git a/docs/js/components/prism-hpkp.min.js b/docs/js/components/prism-hpkp.min.js new file mode 100644 index 000000000000..50ca60cc1931 --- /dev/null +++ b/docs/js/components/prism-hpkp.min.js @@ -0,0 +1 @@ +Prism.languages.hpkp={directive:{pattern:/\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}; \ No newline at end of file diff --git a/docs/js/components/prism-hsts.min.js b/docs/js/components/prism-hsts.min.js new file mode 100644 index 000000000000..3faeef2003ab --- /dev/null +++ b/docs/js/components/prism-hsts.min.js @@ -0,0 +1 @@ +Prism.languages.hsts={directive:{pattern:/\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}; \ No newline at end of file diff --git a/docs/js/components/prism-http.min.js b/docs/js/components/prism-http.min.js new file mode 100644 index 000000000000..94a7f07b71d0 --- /dev/null +++ b/docs/js/components/prism-http.min.js @@ -0,0 +1 @@ +!function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n=t.languages,s={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css,"text/plain":n.plain},i={"application/json":!0,"application/xml":!0};function r(t){var a=t.replace(/^[a-z]+\//,"");return"(?:"+t+"|\\w+/(?:[\\w.-]+\\+)+"+a+"(?![+\\w.-]))"}for(var p in s)if(s[p]){e=e||{};var l=i[p]?r(p):p;e[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+l+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:s[p]}}e&&t.languages.insertBefore("http","header",e)}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-ichigojam.min.js b/docs/js/components/prism-ichigojam.min.js new file mode 100644 index 000000000000..445d2db436d4 --- /dev/null +++ b/docs/js/components/prism-ichigojam.min.js @@ -0,0 +1 @@ +Prism.languages.ichigojam={comment:/(?:\B'|REM)(?:[^\n\r]*)/i,string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,greedy:!0},number:/\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,function:/\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,label:/(?:\B@\S+)/,operator:/<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,punctuation:/[\[,;:()\]]/}; \ No newline at end of file diff --git a/docs/js/components/prism-icon.min.js b/docs/js/components/prism-icon.min.js new file mode 100644 index 000000000000..c9b0f22d0e47 --- /dev/null +++ b/docs/js/components/prism-icon.min.js @@ -0,0 +1 @@ +Prism.languages.icon={comment:/#.*/,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,greedy:!0},number:/\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,"builtin-keyword":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,alias:"variable"},directive:{pattern:/\$\w+/,alias:"builtin"},keyword:/\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,function:/\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,operator:/[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,punctuation:/[\[\](){},;]/}; \ No newline at end of file diff --git a/docs/js/components/prism-icu-message-format.min.js b/docs/js/components/prism-icu-message-format.min.js new file mode 100644 index 000000000000..412677d1ad0d --- /dev/null +++ b/docs/js/components/prism-icu-message-format.min.js @@ -0,0 +1 @@ +!function(e){function t(e,s){return s<=0?"[]":e.replace(//g,(function(){return t(e,s-1)}))}var s=/'[{}:=,](?:[^']|'')*'(?!')/,n={pattern:/''/,greedy:!0,alias:"operator"},r={pattern:s,greedy:!0,inside:{escape:n}},a=t("\\{(?:[^{}']|'(?![{},'])|''||)*\\}".replace(//g,(function(){return s.source})),8),i={pattern:RegExp(a),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};e.languages["icu-message-format"]={argument:{pattern:RegExp(a),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":i,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":i,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp("(^\\s*,\\s*(?=\\S))"+t("(?:[^{}']|'[^']*'|\\{(?:)?\\})+",8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:n,string:r},i.inside.message.inside=e.languages["icu-message-format"],e.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=e.languages["icu-message-format"]}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-idris.min.js b/docs/js/components/prism-idris.min.js new file mode 100644 index 000000000000..5e2bd727ab36 --- /dev/null +++ b/docs/js/components/prism-idris.min.js @@ -0,0 +1 @@ +Prism.languages.idris=Prism.languages.extend("haskell",{comment:{pattern:/(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m},keyword:/\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,builtin:void 0}),Prism.languages.insertBefore("idris","keyword",{"import-statement":{pattern:/(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,lookbehind:!0,inside:{punctuation:/\./}}}),Prism.languages.idr=Prism.languages.idris; \ No newline at end of file diff --git a/docs/js/components/prism-iecst.min.js b/docs/js/components/prism-iecst.min.js new file mode 100644 index 000000000000..270815bcec7f --- /dev/null +++ b/docs/js/components/prism-iecst.min.js @@ -0,0 +1 @@ +Prism.languages.iecst={comment:[{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:[/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,/\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/],"class-name":/\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,address:{pattern:/%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,alias:"symbol"},number:/\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/,operator:/S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,punctuation:/[()[\].,;]/}; \ No newline at end of file diff --git a/docs/js/components/prism-ignore.min.js b/docs/js/components/prism-ignore.min.js new file mode 100644 index 000000000000..066a1055b548 --- /dev/null +++ b/docs/js/components/prism-ignore.min.js @@ -0,0 +1 @@ +!function(n){n.languages.ignore={comment:/^#.*/m,entry:{pattern:/\S(?:.*(?:(?:\\ )|\S))?/,alias:"string",inside:{operator:/^!|\*\*?|\?/,regex:{pattern:/(^|[^\\])\[[^\[\]]*\]/,lookbehind:!0},punctuation:/\//}}},n.languages.gitignore=n.languages.ignore,n.languages.hgignore=n.languages.ignore,n.languages.npmignore=n.languages.ignore}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-inform7.min.js b/docs/js/components/prism-inform7.min.js new file mode 100644 index 000000000000..cffd948555dc --- /dev/null +++ b/docs/js/components/prism-inform7.min.js @@ -0,0 +1 @@ +Prism.languages.inform7={string:{pattern:/"[^"]*"/,inside:{substitution:{pattern:/\[[^\[\]]+\]/,inside:{delimiter:{pattern:/\[|\]/,alias:"punctuation"}}}}},comment:{pattern:/\[[^\[\]]+\]/,greedy:!0},title:{pattern:/^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,alias:"important"},number:{pattern:/(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,lookbehind:!0,alias:"symbol"},position:{pattern:/(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,lookbehind:!0,alias:"variable"},punctuation:/[.,:;(){}]/},Prism.languages.inform7.string.inside.substitution.inside.rest=Prism.languages.inform7,Prism.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\S(?:\s*\S)*/,alias:"comment"}; \ No newline at end of file diff --git a/docs/js/components/prism-ini.min.js b/docs/js/components/prism-ini.min.js new file mode 100644 index 000000000000..7e16e987bd2b --- /dev/null +++ b/docs/js/components/prism-ini.min.js @@ -0,0 +1 @@ +Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}; \ No newline at end of file diff --git a/docs/js/components/prism-io.min.js b/docs/js/components/prism-io.min.js new file mode 100644 index 000000000000..08bbe661da73 --- /dev/null +++ b/docs/js/components/prism-io.min.js @@ -0,0 +1 @@ +Prism.languages.io={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,lookbehind:!0,greedy:!0},"triple-quoted-string":{pattern:/"""(?:\\[\s\S]|(?!""")[^\\])*"""/,greedy:!0,alias:"string"},string:{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},keyword:/\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,builtin:/\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,boolean:/\b(?:false|nil|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,operator:/[=!*/%+\-^&|]=|>>?=?|<+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,alias:"keyword"},number:/\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,adverb:{pattern:/[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,alias:"builtin"},operator:/[=a][.:]|_\./,conjunction:{pattern:/&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,alias:"variable"},punctuation:/[()]/}; \ No newline at end of file diff --git a/docs/js/components/prism-java.min.js b/docs/js/components/prism-java.min.js new file mode 100644 index 000000000000..9b90cf3cc3fc --- /dev/null +++ b/docs/js/components/prism-java.min.js @@ -0,0 +1 @@ +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-javadoc.min.js b/docs/js/components/prism-javadoc.min.js new file mode 100644 index 000000000000..d7f0f13f2953 --- /dev/null +++ b/docs/js/components/prism-javadoc.min.js @@ -0,0 +1 @@ +!function(a){var e=/(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m,n="(?:\\b[a-zA-Z]\\w+\\s*\\.\\s*)*\\b[A-Z]\\w*(?:\\s*)?|".replace(//g,(function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"}));a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-javadoclike.min.js b/docs/js/components/prism-javadoclike.min.js new file mode 100644 index 000000000000..429dd491eacc --- /dev/null +++ b/docs/js/components/prism-javadoclike.min.js @@ -0,0 +1 @@ +!function(a){var e=a.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(e,"addSupport",{value:function(e,n){"string"==typeof e&&(e=[e]),e.forEach((function(e){!function(e,n){var t="doc-comment",r=a.languages[e];if(r){var o=r[t];if(o||(o=(r=a.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[t]),o instanceof RegExp&&(o=r[t]={pattern:o}),Array.isArray(o))for(var i=0,s=o.length;i|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; \ No newline at end of file diff --git a/docs/js/components/prism-javastacktrace.min.js b/docs/js/components/prism-javastacktrace.min.js new file mode 100644 index 000000000000..0c5949c69dbc --- /dev/null +++ b/docs/js/components/prism-javastacktrace.min.js @@ -0,0 +1 @@ +Prism.languages.javastacktrace={summary:{pattern:/^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,lookbehind:!0,inside:{keyword:{pattern:/^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,lookbehind:!0},string:{pattern:/^(\s*)"[^"]*"/,lookbehind:!0},exceptions:{pattern:/^(:?\s*)[\w$.]+(?=:|$)/,lookbehind:!0,inside:{"class-name":/[\w$]+$/,namespace:/\b[a-z]\w*\b/,punctuation:/\./}},message:{pattern:/(:\s*)\S.*/,lookbehind:!0,alias:"string"},punctuation:/:/}},"stack-frame":{pattern:/^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:)?\([^()]*\)/m,lookbehind:!0,inside:{keyword:{pattern:/^(\s*)at(?= )/,lookbehind:!0},source:[{pattern:/(\()\w+\.\w+:\d+(?=\))/,lookbehind:!0,inside:{file:/^\w+\.\w+/,punctuation:/:/,"line-number":{pattern:/\b\d+\b/,alias:"number"}}},{pattern:/(\()[^()]*(?=\))/,lookbehind:!0,inside:{keyword:/^(?:Native Method|Unknown Source)$/}}],"class-name":/[\w$]+(?=\.(?:|[\w$]+)\()/,function:/(?:|[\w$]+)(?=\()/,"class-loader":{pattern:/(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,lookbehind:!0,alias:"namespace",inside:{punctuation:/\./}},module:{pattern:/([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,lookbehind:!0,inside:{version:{pattern:/(@)[\s\S]+/,lookbehind:!0,alias:"number"},punctuation:/[@.]/}},namespace:{pattern:/(?:\b[a-z]\w*\.)+/,inside:{punctuation:/\./}},punctuation:/[()/.]/}},more:{pattern:/^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,lookbehind:!0,inside:{punctuation:/\.{3}/,number:/\d+/,keyword:/\b[a-z]+(?: [a-z]+)*\b/}}}; \ No newline at end of file diff --git a/docs/js/components/prism-jexl.min.js b/docs/js/components/prism-jexl.min.js new file mode 100644 index 000000000000..0586edfa19d3 --- /dev/null +++ b/docs/js/components/prism-jexl.min.js @@ -0,0 +1 @@ +Prism.languages.jexl={string:/(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,transform:{pattern:/(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,alias:"function",lookbehind:!0},function:/[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+\b/,operator:/[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,boolean:/\b(?:false|true)\b/,keyword:/\bin\b/,punctuation:/[{}[\](),.]/}; \ No newline at end of file diff --git a/docs/js/components/prism-jolie.min.js b/docs/js/components/prism-jolie.min.js new file mode 100644 index 000000000000..1ee8f0f3dfd0 --- /dev/null +++ b/docs/js/components/prism-jolie.min.js @@ -0,0 +1 @@ +Prism.languages.jolie=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,lookbehind:!0,greedy:!0},"class-name":{pattern:/((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,lookbehind:!0},keyword:/\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,function:/\b[a-z_]\w*(?=[ \t]*[@(])/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,operator:/-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,punctuation:/[()[\]{},;.:]/,builtin:/\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/}),Prism.languages.insertBefore("jolie","keyword",{aggregates:{pattern:/(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,lookbehind:!0,inside:{keyword:/\bwith\b/,"class-name":/\w+/,punctuation:/,/}},redirects:{pattern:/(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,lookbehind:!0,inside:{punctuation:/,/,"class-name":/\w+/,operator:/=>/}},property:{pattern:/\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/}}); \ No newline at end of file diff --git a/docs/js/components/prism-jq.min.js b/docs/js/components/prism-jq.min.js new file mode 100644 index 000000000000..c9c5eeb3ea7d --- /dev/null +++ b/docs/js/components/prism-jq.min.js @@ -0,0 +1 @@ +!function(e){var n="\\\\\\((?:[^()]|\\([^()]*\\))*\\)",t=RegExp('(^|[^\\\\])"(?:[^"\r\n\\\\]|\\\\[^\r\n(]|__)*"'.replace(/__/g,(function(){return n}))),i={interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\{2})*)"+n),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},a=e.languages.jq={comment:/#.*/,property:{pattern:RegExp(t.source+"(?=\\s*:(?!:))"),lookbehind:!0,greedy:!0,inside:i},string:{pattern:t,lookbehind:!0,greedy:!0,inside:i},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};i.interpolation.inside.content.inside=a}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-js-extras.min.js b/docs/js/components/prism-js-extras.min.js new file mode 100644 index 000000000000..8d8cba12f435 --- /dev/null +++ b/docs/js/components/prism-js-extras.min.js @@ -0,0 +1 @@ +!function(a){function e(a,e){return RegExp(a.replace(//g,(function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"})),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r=c.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=c[o],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++o;var p=i.substring(0,s),u=l(g[a]),f=i.substring(s+a.length),y=[];if(p&&y.push(p),y.push(u),f){var v=[f];e(v),y.push.apply(y,v)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(y)),n+=y.length-1):r.content=y}}else{var d=r.content;Array.isArray(d)?e(d):e([d])}}}(u),new e.Token(r,u,"language-"+r,t)}e.languages.javascript["template-string"]=[o("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),o("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),o("svg","\\bsvg"),o("markdown","\\b(?:markdown|md)"),o("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),o("sql","\\bsql"),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function c(e){return"string"==typeof e?e:Array.isArray(e)?e.map(c).join(""):c(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var r=0,a=n.length;r\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(//g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-json.min.js b/docs/js/components/prism-json.min.js new file mode 100644 index 000000000000..4256f8200dea --- /dev/null +++ b/docs/js/components/prism-json.min.js @@ -0,0 +1 @@ +Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json; \ No newline at end of file diff --git a/docs/js/components/prism-json5.min.js b/docs/js/components/prism-json5.min.js new file mode 100644 index 000000000000..359d02f2d184 --- /dev/null +++ b/docs/js/components/prism-json5.min.js @@ -0,0 +1 @@ +!function(n){var e=/("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;n.languages.json5=n.languages.extend("json",{property:[{pattern:RegExp(e.source+"(?=\\s*:)"),greedy:!0},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,alias:"unquoted"}],string:{pattern:e,greedy:!0},number:/[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-jsonp.min.js b/docs/js/components/prism-jsonp.min.js new file mode 100644 index 000000000000..9717ded0eabe --- /dev/null +++ b/docs/js/components/prism-jsonp.min.js @@ -0,0 +1 @@ +Prism.languages.jsonp=Prism.languages.extend("json",{punctuation:/[{}[\]();,.]/}),Prism.languages.insertBefore("jsonp","punctuation",{function:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/}); \ No newline at end of file diff --git a/docs/js/components/prism-jsstacktrace.min.js b/docs/js/components/prism-jsstacktrace.min.js new file mode 100644 index 000000000000..328156a476dd --- /dev/null +++ b/docs/js/components/prism-jsstacktrace.min.js @@ -0,0 +1 @@ +Prism.languages.jsstacktrace={"error-message":{pattern:/^\S.*/m,alias:"string"},"stack-frame":{pattern:/(^[ \t]+)at[ \t].*/m,lookbehind:!0,inside:{"not-my-code":{pattern:/^at[ \t]+(?!\s)(?:node\.js||.*(?:node_modules|\(\)|\(|$|\(internal\/|\(node\.js)).*/m,alias:"comment"},filename:{pattern:/(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,lookbehind:!0,alias:"url"},function:{pattern:/(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,lookbehind:!0,inside:{punctuation:/\./}},punctuation:/[()]/,keyword:/\b(?:at|new)\b/,alias:{pattern:/\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,alias:"variable"},"line-number":{pattern:/:\d+(?::\d+)?\b/,alias:"number",inside:{punctuation:/:/}}}}}; \ No newline at end of file diff --git a/docs/js/components/prism-jsx.min.js b/docs/js/components/prism-jsx.min.js new file mode 100644 index 000000000000..8aa6362fa394 --- /dev/null +++ b/docs/js/components/prism-jsx.min.js @@ -0,0 +1 @@ +!function(t){var n=t.util.clone(t.languages.javascript),e="(?:\\{*\\.{3}(?:[^{}]|)*\\})";function a(t,n){return t=t.replace(//g,(function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"})).replace(//g,(function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"})).replace(//g,(function(){return e})),RegExp(t,n)}e=a(e).source,t.languages.jsx=t.languages.extend("markup",n),t.languages.jsx.tag.pattern=a("+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|))?|))**/?)?>"),t.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,t.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,t.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,t.languages.jsx.tag.inside.comment=n.comment,t.languages.insertBefore("inside","attr-name",{spread:{pattern:a(""),inside:t.languages.jsx}},t.languages.jsx.tag),t.languages.insertBefore("inside","special-attr",{script:{pattern:a("="),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:t.languages.jsx}}},t.languages.jsx.tag);var s=function(t){return t?"string"==typeof t?t:"string"==typeof t.content?t.content:t.content.map(s).join(""):""},g=function(n){for(var e=[],a=0;a0&&e[e.length-1].tagName===s(o.content[0].content[1])&&e.pop():"/>"===o.content[o.content.length-1].content||e.push({tagName:s(o.content[0].content[1]),openedBraces:0}):e.length>0&&"punctuation"===o.type&&"{"===o.content?e[e.length-1].openedBraces++:e.length>0&&e[e.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?e[e.length-1].openedBraces--:i=!0),(i||"string"==typeof o)&&e.length>0&&0===e[e.length-1].openedBraces){var r=s(o);a0&&("string"==typeof n[a-1]||"plain-text"===n[a-1].type)&&(r=s(n[a-1])+r,n.splice(a-1,1),a--),n[a]=new t.Token("plain-text",r,null,r)}o.content&&"string"!=typeof o.content&&g(o.content)}};t.hooks.add("after-tokenize",(function(t){"jsx"!==t.language&&"tsx"!==t.language||g(t.tokens)}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-julia.min.js b/docs/js/components/prism-julia.min.js new file mode 100644 index 000000000000..b677d30824ae --- /dev/null +++ b/docs/js/components/prism-julia.min.js @@ -0,0 +1 @@ +Prism.languages.julia={comment:{pattern:/(^|[^\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,lookbehind:!0},regex:{pattern:/r"(?:\\.|[^"\\\r\n])*"[imsx]{0,4}/,greedy:!0},string:{pattern:/"""[\s\S]+?"""|(?:\b\w+)?"(?:\\.|[^"\\\r\n])*"|`(?:[^\\`\r\n]|\\.)*`/,greedy:!0},char:{pattern:/(^|[^\w'])'(?:\\[^\r\n][^'\r\n]*|[^\\\r\n])'/,lookbehind:!0,greedy:!0},keyword:/\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[box])?(?:[\da-f]+(?:_[\da-f]+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[efp][+-]?\d+(?:_\d+)*)?j?/i,operator:/&&|\|\||[-+*^%÷⊻&$\\]=?|\/[\/=]?|!=?=?|\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,punctuation:/::?|[{}[\]();,.?]/,constant:/\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/}; \ No newline at end of file diff --git a/docs/js/components/prism-keepalived.min.js b/docs/js/components/prism-keepalived.min.js new file mode 100644 index 000000000000..8a82b4ca48db --- /dev/null +++ b/docs/js/components/prism-keepalived.min.js @@ -0,0 +1 @@ +Prism.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp("\\b(?:(?:(?:[\\da-f]{1,4}:){7}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}:[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){5}:(?:[\\da-f]{1,4}:)?[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){4}:(?:[\\da-f]{1,4}:){0,2}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){3}:(?:[\\da-f]{1,4}:){0,3}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){2}:(?:[\\da-f]{1,4}:){0,4}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}|(?:[\\da-f]{1,4}:){0,5}:|::(?:[\\da-f]{1,4}:){0,5}|[\\da-f]{1,4}::(?:[\\da-f]{1,4}:){0,5}[\\da-f]{1,4}|::(?:[\\da-f]{1,4}:){0,6}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){1,7}:)(?:/\\d{1,3})?|(?:/\\d{1,2})?)\\b".replace(//g,(function(){return"(?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))"})),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/}; \ No newline at end of file diff --git a/docs/js/components/prism-keyman.min.js b/docs/js/components/prism-keyman.min.js new file mode 100644 index 000000000000..f24968c0a9d3 --- /dev/null +++ b/docs/js/components/prism-keyman.min.js @@ -0,0 +1 @@ +Prism.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}; \ No newline at end of file diff --git a/docs/js/components/prism-kotlin.min.js b/docs/js/components/prism-kotlin.min.js new file mode 100644 index 000000000000..78a9057188e8 --- /dev/null +++ b/docs/js/components/prism-kotlin.min.js @@ -0,0 +1 @@ +!function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-kumir.min.js b/docs/js/components/prism-kumir.min.js new file mode 100644 index 000000000000..ec3a4df13bfd --- /dev/null +++ b/docs/js/components/prism-kumir.min.js @@ -0,0 +1 @@ +!function(n){function o(n,o){return RegExp(n.replace(//g,"\\s\\x00-\\x1f\\x22-\\x2f\\x3a-\\x3f\\x5b-\\x5e\\x60\\x7b-\\x7e"),o)}n.languages.kumir={comment:{pattern:/\|.*/},prolog:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^\n\r"]*"|'[^\n\r']*'/,greedy:!0},boolean:{pattern:o("(^|[])(?:да|нет)(?=[]|$)"),lookbehind:!0},"operator-word":{pattern:o("(^|[])(?:и|или|не)(?=[]|$)"),lookbehind:!0,alias:"keyword"},"system-variable":{pattern:o("(^|[])знач(?=[]|$)"),lookbehind:!0,alias:"keyword"},type:[{pattern:o("(^|[])(?:вещ|лит|лог|сим|цел)(?:\\x20*таб)?(?=[]|$)"),lookbehind:!0,alias:"builtin"},{pattern:o("(^|[])(?:компл|сканкод|файл|цвет)(?=[]|$)"),lookbehind:!0,alias:"important"}],keyword:{pattern:o("(^|[])(?:алг|арг(?:\\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\\x20+|_)исп)?|кц(?:(?:\\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[]|$)"),lookbehind:!0},name:{pattern:o("(^|[])[^\\d][^]*(?:\\x20+[^]+)*(?=[]|$)"),lookbehind:!0},number:{pattern:o("(^|[])(?:\\B\\$[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)(?=[]|$)","i"),lookbehind:!0},punctuation:/:=|[(),:;\[\]]/,"operator-char":{pattern:/\*\*?|<[=>]?|>=?|[-+/=]/,alias:"operator"}},n.languages.kum=n.languages.kumir}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-kusto.min.js b/docs/js/components/prism-kusto.min.js new file mode 100644 index 000000000000..780789653cc3 --- /dev/null +++ b/docs/js/components/prism-kusto.min.js @@ -0,0 +1 @@ +Prism.languages.kusto={comment:{pattern:/\/\/.*/,greedy:!0},string:{pattern:/```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,greedy:!0},verb:{pattern:/(\|\s*)[a-z][\w-]*/i,lookbehind:!0,alias:"keyword"},command:{pattern:/\.[a-z][a-z\d-]*\b/,alias:"keyword"},"class-name":/\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,keyword:/\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,boolean:/\b(?:false|null|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/,datetime:[{pattern:/\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,alias:"number"},{pattern:/[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,alias:"number"}],number:/\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,operator:/=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,punctuation:/[()\[\]{},;.:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-latex.min.js b/docs/js/components/prism-latex.min.js new file mode 100644 index 000000000000..38fe50736236 --- /dev/null +++ b/docs/js/components/prism-latex.min.js @@ -0,0 +1 @@ +!function(a){var e=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};a.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/},a.languages.tex=a.languages.latex,a.languages.context=a.languages.latex}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-latte.min.js b/docs/js/components/prism-latte.min.js new file mode 100644 index 000000000000..3d86f031f09e --- /dev/null +++ b/docs/js/components/prism-latte.min.js @@ -0,0 +1 @@ +!function(a){a.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:a.languages.php}};var t=a.languages.extend("markup",{});a.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:a.languages.php}}}}}},t.tag),a.hooks.add("before-tokenize",(function(e){"latte"===e.language&&(a.languages["markup-templating"].buildPlaceholders(e,"latte",/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g),e.grammar=t)})),a.hooks.add("after-tokenize",(function(t){a.languages["markup-templating"].tokenizePlaceholders(t,"latte")}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-less.min.js b/docs/js/components/prism-less.min.js new file mode 100644 index 000000000000..f4a10f66a17d --- /dev/null +++ b/docs/js/components/prism-less.min.js @@ -0,0 +1 @@ +Prism.languages.less=Prism.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),Prism.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}); \ No newline at end of file diff --git a/docs/js/components/prism-lilypond.min.js b/docs/js/components/prism-lilypond.min.js new file mode 100644 index 000000000000..0ca11e5b64b9 --- /dev/null +++ b/docs/js/components/prism-lilypond.min.js @@ -0,0 +1 @@ +!function(e){for(var n='\\((?:[^();"#\\\\]|\\\\[^]|;.*(?!.)|"(?:[^"\\\\]|\\\\.)*"|#(?:\\{(?:(?!#\\})[^])*#\\}|[^{])|)*\\)',i=0;i<5;i++)n=n.replace(//g,(function(){return n}));n=n.replace(//g,"[^\\s\\S]");var d=e.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp('(^|[=\\s])#(?:"(?:[^"\\\\]|\\\\.)*"|[^\\s()"]*(?:[^\\s()]|))'.replace(//g,(function(){return n})),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:e.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};d["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=d,e.languages.ly=d}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-linker-script.min.js b/docs/js/components/prism-linker-script.min.js new file mode 100644 index 000000000000..1cf2981243cb --- /dev/null +++ b/docs/js/components/prism-linker-script.min.js @@ -0,0 +1 @@ +Prism.languages["linker-script"]={comment:{pattern:/(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,lookbehind:!0,greedy:!0},identifier:{pattern:/"[^"\r\n]*"/,greedy:!0},"location-counter":{pattern:/\B\.\B/,alias:"important"},section:{pattern:/(^|[^\w*])\.\w+\b/,lookbehind:!0,alias:"keyword"},function:/\b[A-Z][A-Z_]*(?=\s*\()/,number:/\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,operator:/>>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,punctuation:/[(){},;]/},Prism.languages.ld=Prism.languages["linker-script"]; \ No newline at end of file diff --git a/docs/js/components/prism-liquid.min.js b/docs/js/components/prism-liquid.min.js new file mode 100644 index 000000000000..9829caedf7ab --- /dev/null +++ b/docs/js/components/prism-liquid.min.js @@ -0,0 +1 @@ +Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},Prism.hooks.add("before-tokenize",(function(e){var t=!1;Prism.languages["markup-templating"].buildPlaceholders(e,"liquid",/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,(function(e){var n=/^\{%-?\s*(\w+)/.exec(e);if(n){var i=n[1];if("raw"===i&&!t)return t=!0,!0;if("endraw"===i)return t=!1,!0}return!t}))})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"liquid")})); \ No newline at end of file diff --git a/docs/js/components/prism-lisp.min.js b/docs/js/components/prism-lisp.min.js new file mode 100644 index 000000000000..66f74bdce337 --- /dev/null +++ b/docs/js/components/prism-lisp.min.js @@ -0,0 +1 @@ +!function(e){function n(e){return RegExp("(\\()(?:"+e+")(?=[\\s\\)])")}function a(e){return RegExp("([\\s([])(?:"+e+")(?=[\\s)])")}var t="(?!\\d)[-+*/~!@$%^=<>{}\\w]+",r="(\\()",i="(?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\))*\\))*\\))*",s={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+t+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+t),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+t),alias:"property"},splice:{pattern:RegExp(",@?"+t),alias:["symbol","variable"]},keyword:[{pattern:RegExp("(\\()(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)(?=\\s)"),lookbehind:!0},{pattern:RegExp("(\\()(?:append|by|collect|concat|do|finally|for|in|return)(?=\\s)"),lookbehind:!0}],declare:{pattern:n("declare"),lookbehind:!0,alias:"keyword"},interactive:{pattern:n("interactive"),lookbehind:!0,alias:"keyword"},boolean:{pattern:a("nil|t"),lookbehind:!0},number:{pattern:a("[-+]?\\d+(?:\\.\\d*)?"),lookbehind:!0},defvar:{pattern:RegExp("(\\()def(?:const|custom|group|var)\\s+"+t),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(t)}},defun:{pattern:RegExp("(\\()(?:cl-)?(?:defmacro|defun\\*?)\\s+"+t+"\\s+\\("+i+"\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+t),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp("(\\()lambda\\s+\\(\\s*(?:&?"+t+"(?:\\s+&?"+t+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(r+t),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},l={"lisp-marker":RegExp("&(?!\\d)[-+*/~!@$%^=<>{}\\w]+"),varform:{pattern:RegExp("\\("+t+"\\s+(?=\\S)"+i+"\\)"),inside:s},argument:{pattern:RegExp("(^|[\\s(])"+t),lookbehind:!0,alias:"variable"},rest:s},o="\\S+(?:\\s+\\S+)*",p={pattern:RegExp(r+i+"(?=\\))"),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+o),inside:l},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+o),inside:l},keys:{pattern:RegExp("&key\\s+"+o+"(?:\\s+&allow-other-keys)?"),inside:l},argument:{pattern:RegExp(t),alias:"variable"},punctuation:/[()]/}};s.lambda.inside.arguments=p,s.defun.inside.arguments=e.util.clone(p),s.defun.inside.arguments.inside.sublist=p,e.languages.lisp=s,e.languages.elisp=s,e.languages.emacs=s,e.languages["emacs-lisp"]=s}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-livescript.min.js b/docs/js/components/prism-livescript.min.js new file mode 100644 index 000000000000..c639e5f39697 --- /dev/null +++ b/docs/js/components/prism-livescript.min.js @@ -0,0 +1 @@ +Prism.languages.livescript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\])#.*/,lookbehind:!0}],"interpolated-string":{pattern:/(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,lookbehind:!0},interpolation:{pattern:/(^|[^\\])#\{[^}]+\}/m,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^#\{|\}$/,alias:"variable"}}},string:/[\s\S]+/}},string:[{pattern:/('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/<\[[\s\S]*?\]>/,greedy:!0},/\\[^\s,;\])}]+/],regex:[{pattern:/\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,greedy:!0,inside:{comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0}}},{pattern:/\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,greedy:!0}],keyword:{pattern:/(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,lookbehind:!0},"keyword-operator":{pattern:/(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,lookbehind:!0,alias:"operator"},boolean:{pattern:/(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,lookbehind:!0},argument:{pattern:/(^|(?!\.&\.)[^&])&(?!&)\d*/m,lookbehind:!0,alias:"variable"},number:/\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,identifier:/[a-z_](?:-?[a-z]|[\d_])*/i,operator:[{pattern:/( )\.(?= )/,lookbehind:!0},/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/],punctuation:/[(){}\[\]|.,:;`]/},Prism.languages.livescript["interpolated-string"].inside.interpolation.inside.rest=Prism.languages.livescript; \ No newline at end of file diff --git a/docs/js/components/prism-llvm.min.js b/docs/js/components/prism-llvm.min.js new file mode 100644 index 000000000000..9088cbd53c7c --- /dev/null +++ b/docs/js/components/prism-llvm.min.js @@ -0,0 +1 @@ +!function(a){a.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-log.min.js b/docs/js/components/prism-log.min.js new file mode 100644 index 000000000000..c93bd9077552 --- /dev/null +++ b/docs/js/components/prism-log.min.js @@ -0,0 +1 @@ +Prism.languages.log={string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,greedy:!0},exception:{pattern:/(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,lookbehind:!0,greedy:!0,alias:["javastacktrace","language-javastacktrace"],inside:Prism.languages.javastacktrace||{keyword:/\bat\b/,function:/[a-z_][\w$]*(?=\()/,punctuation:/[.:()]/}},level:[{pattern:/\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,alias:["error","important"]},{pattern:/\b(?:WARN|WARNING|WRN)\b/,alias:["warning","important"]},{pattern:/\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,alias:["info","keyword"]},{pattern:/\b(?:DBG|DEBUG|FINE)\b/,alias:["debug","keyword"]},{pattern:/\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,alias:["trace","comment"]}],property:{pattern:/((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,lookbehind:!0},separator:{pattern:/(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,lookbehind:!0,alias:"comment"},url:/\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp("\\b\\d{4}[-/]\\d{2}[-/]\\d{2}(?:T(?=\\d{1,2}:)|(?=\\s\\d{1,2}:))|\\b\\d{1,4}[-/ ](?:\\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\\d{2,4}T?\\b|\\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\\s{1,2}\\d{1,2}\\b","i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:false|null|true)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/}; \ No newline at end of file diff --git a/docs/js/components/prism-lolcode.min.js b/docs/js/components/prism-lolcode.min.js new file mode 100644 index 000000000000..3df52aba6a45 --- /dev/null +++ b/docs/js/components/prism-lolcode.min.js @@ -0,0 +1 @@ +Prism.languages.lolcode={comment:[/\bOBTW\s[\s\S]*?\sTLDR\b/,/\bBTW.+/],string:{pattern:/"(?::.|[^":])*"/,inside:{variable:/:\{[^}]+\}/,symbol:[/:\([a-f\d]+\)/i,/:\[[^\]]+\]/,/:[)>o":]/]},greedy:!0},number:/(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,symbol:{pattern:/(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\s)/}},label:{pattern:/((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,lookbehind:!0,alias:"string"},function:{pattern:/((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,lookbehind:!0},keyword:[{pattern:/(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,lookbehind:!0},/'Z(?=\s|,|$)/],boolean:{pattern:/(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\s)IT(?=\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,lookbehind:!0},punctuation:/\.{3}|…|,|!/}; \ No newline at end of file diff --git a/docs/js/components/prism-lua.min.js b/docs/js/components/prism-lua.min.js new file mode 100644 index 000000000000..cd94e29ef4d4 --- /dev/null +++ b/docs/js/components/prism-lua.min.js @@ -0,0 +1 @@ +Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}; \ No newline at end of file diff --git a/docs/js/components/prism-magma.min.js b/docs/js/components/prism-magma.min.js new file mode 100644 index 000000000000..93898f77ab43 --- /dev/null +++ b/docs/js/components/prism-magma.min.js @@ -0,0 +1 @@ +Prism.languages.magma={output:{pattern:/^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,boolean:/\b(?:false|true)\b/,generator:{pattern:/\b[a-z_]\w*(?=\s*<)/i,alias:"class-name"},function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},operator:/->|[-+*/^~!|#=]|:=|\.\./,punctuation:/[()[\]{}<>,;.:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-makefile.min.js b/docs/js/components/prism-makefile.min.js new file mode 100644 index 000000000000..43f317782f42 --- /dev/null +++ b/docs/js/components/prism-makefile.min.js @@ -0,0 +1 @@ +Prism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}; \ No newline at end of file diff --git a/docs/js/components/prism-markdown.min.js b/docs/js/components/prism-markdown.min.js new file mode 100644 index 000000000000..2b16ba515f20 --- /dev/null +++ b/docs/js/components/prism-markdown.min.js @@ -0,0 +1 @@ +!function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-markup-templating.min.js b/docs/js/components/prism-markup-templating.min.js new file mode 100644 index 000000000000..3a171d0431bc --- /dev/null +++ b/docs/js/components/prism-markup-templating.min.js @@ -0,0 +1 @@ +!function(e){function n(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,a,r,o){if(t.language===a){var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r})),t.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(t,a){if(t.language===a&&t.tokenStack){t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){for(var u=0;u=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-markup.min.js b/docs/js/components/prism-markup.min.js new file mode 100644 index 000000000000..d39ab7faf942 --- /dev/null +++ b/docs/js/components/prism-markup.min.js @@ -0,0 +1 @@ +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; \ No newline at end of file diff --git a/docs/js/components/prism-mata.min.js b/docs/js/components/prism-mata.min.js new file mode 100644 index 000000000000..09fc0a7c6776 --- /dev/null +++ b/docs/js/components/prism-mata.min.js @@ -0,0 +1 @@ +!function(t){var e="\\bvoid\\b||\\b(?:complex|numeric|pointer(?:\\s*\\([^()]*\\))?|real|string|(?:class|struct)\\s+\\w+|transmorphic)(?:\\s*)?".replace(//g,"\\b(?:(?:col|row)?vector|matrix|scalar)\\b");t.languages.mata={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,lookbehind:!0},type:{pattern:RegExp(e),alias:"class-name",inside:{punctuation:/[()]/,keyword:/\b(?:class|function|struct|void)\b/}},keyword:/\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,constant:/\bNULL\b/,number:{pattern:/(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,lookbehind:!0},missing:{pattern:/(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,lookbehind:!0,alias:"symbol"},function:/\b[a-z_]\w*(?=\s*\()/i,operator:/\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,punctuation:/[()[\]{},;.]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-matlab.min.js b/docs/js/components/prism-matlab.min.js new file mode 100644 index 000000000000..06d3a98112f3 --- /dev/null +++ b/docs/js/components/prism-matlab.min.js @@ -0,0 +1 @@ +Prism.languages.matlab={comment:[/%\{[\s\S]*?\}%/,/%.+/],string:{pattern:/\B'(?:''|[^'\r\n])*'/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,keyword:/\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,function:/\b(?!\d)\w+(?=\s*\()/,operator:/\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,punctuation:/\.{3}|[.,;\[\](){}!]/}; \ No newline at end of file diff --git a/docs/js/components/prism-maxscript.min.js b/docs/js/components/prism-maxscript.min.js new file mode 100644 index 000000000000..ea4b35af79a9 --- /dev/null +++ b/docs/js/components/prism-maxscript.min.js @@ -0,0 +1 @@ +!function(t){var e=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;t.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:^|[;=<>+\\-*/^({\\[]|\\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\\b)[ \t]*)(?!"+e.source+")[a-z_]\\w*\\b(?=[ \t]*(?:(?!"+e.source+")[a-z_]|\\d|-\\.?\\d|[({'\"$@#?]))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:e,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-mel.min.js b/docs/js/components/prism-mel.min.js new file mode 100644 index 000000000000..a0866882dcd9 --- /dev/null +++ b/docs/js/components/prism-mel.min.js @@ -0,0 +1 @@ +Prism.languages.mel={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},code:{pattern:/`(?:\\.|[^\\`])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},statement:{pattern:/[\s\S]+/,inside:null}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:{pattern:/((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,lookbehind:!0,greedy:!0},"tensor-punctuation":{pattern:/<<|>>/,alias:"punctuation"},operator:/\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,punctuation:/[.,:;?\[\](){}]/},Prism.languages.mel.code.inside.statement.inside=Prism.languages.mel; \ No newline at end of file diff --git a/docs/js/components/prism-mermaid.min.js b/docs/js/components/prism-mermaid.min.js new file mode 100644 index 000000000000..054b4350b029 --- /dev/null +++ b/docs/js/components/prism-mermaid.min.js @@ -0,0 +1 @@ +Prism.languages.mermaid={comment:{pattern:/%%.*/,greedy:!0},style:{pattern:/^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,lookbehind:!0,inside:{property:/\b\w[\w-]*(?=[ \t]*:)/,operator:/:/,punctuation:/,/}},"inter-arrow-label":{pattern:/([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,lookbehind:!0,greedy:!0,inside:{arrow:{pattern:/(?:\.+->?|--+[->]|==+[=>])$/,alias:"operator"},label:{pattern:/^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,lookbehind:!0,alias:"property"},"arrow-head":{pattern:/^\S+/,alias:["arrow","operator"]}}},arrow:[{pattern:/(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>ox.=-])(?:[ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,lookbehind:!0,alias:"operator"}],label:{pattern:/(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,lookbehind:!0,greedy:!0,alias:"property"},text:{pattern:/(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,alias:"string"},string:{pattern:/"[^"\r\n]*"/,greedy:!0},annotation:{pattern:/<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,alias:"important"},keyword:[{pattern:/(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,lookbehind:!0,greedy:!0},{pattern:/(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,lookbehind:!0,greedy:!0}],entity:/#[a-z0-9]+;/,operator:{pattern:/(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,lookbehind:!0},punctuation:/[(){};]/}; \ No newline at end of file diff --git a/docs/js/components/prism-metafont.min.js b/docs/js/components/prism-metafont.min.js new file mode 100644 index 000000000000..ac9da74bcbb9 --- /dev/null +++ b/docs/js/components/prism-metafont.min.js @@ -0,0 +1 @@ +Prism.languages.metafont={comment:{pattern:/%.*/,greedy:!0},string:{pattern:/"[^\r\n"]*"/,greedy:!0},number:/\d*\.?\d+/,boolean:/\b(?:false|true)\b/,punctuation:[/[,;()]/,{pattern:/(^|[^{}])(?:\{|\})(?![{}])/,lookbehind:!0},{pattern:/(^|[^[])\[(?!\[)/,lookbehind:!0},{pattern:/(^|[^\]])\](?!\])/,lookbehind:!0}],constant:[{pattern:/(^|[^!?])\?\?\?(?![!?])/,lookbehind:!0},{pattern:/(^|[^/*\\])(?:\\|\\\\)(?![/*\\])/,lookbehind:!0},/\b(?:_|blankpicture|bp|cc|cm|dd|ditto|down|eps|epsilon|fullcircle|halfcircle|identity|in|infinity|left|mm|nullpen|nullpicture|origin|pc|penrazor|penspeck|pensquare|penstroke|proof|pt|quartercircle|relax|right|smoke|unitpixel|unitsquare|up)\b/],quantity:{pattern:/\b(?:autorounding|blacker|boundarychar|charcode|chardp|chardx|chardy|charext|charht|charic|charwd|currentwindow|day|designsize|displaying|fillin|fontmaking|granularity|hppp|join_radius|month|o_correction|pausing|pen_(?:bot|lft|rt|top)|pixels_per_inch|proofing|showstopping|smoothing|time|tolerance|tracingcapsules|tracingchoices|tracingcommands|tracingedges|tracingequations|tracingmacros|tracingonline|tracingoutput|tracingpens|tracingrestores|tracingspecs|tracingstats|tracingtitles|turningcheck|vppp|warningcheck|xoffset|year|yoffset)\b/,alias:"keyword"},command:{pattern:/\b(?:addto|batchmode|charlist|cull|display|errhelp|errmessage|errorstopmode|everyjob|extensible|fontdimen|headerbyte|inner|interim|let|ligtable|message|newinternal|nonstopmode|numspecial|openwindow|outer|randomseed|save|scrollmode|shipout|show|showdependencies|showstats|showtoken|showvariable|special)\b/,alias:"builtin"},operator:[{pattern:/(^|[^>=<:|])(?:<|<=|=|=:|\|=:|\|=:>|=:\|>|=:\||\|=:\||\|=:\|>|\|=:\|>>|>|>=|:|:=|<>|::|\|\|:)(?![>=<:|])/,lookbehind:!0},{pattern:/(^|[^+-])(?:\+|\+\+|-{1,3}|\+-\+)(?![+-])/,lookbehind:!0},{pattern:/(^|[^/*\\])(?:\*|\*\*|\/)(?![/*\\])/,lookbehind:!0},{pattern:/(^|[^.])(?:\.{2,3})(?!\.)/,lookbehind:!0},{pattern:/(^|[^@#&$])&(?![@#&$])/,lookbehind:!0},/\b(?:and|not|or)\b/],macro:{pattern:/\b(?:abs|beginchar|bot|byte|capsule_def|ceiling|change_width|clear_pen_memory|clearit|clearpen|clearxy|counterclockwise|cullit|cutdraw|cutoff|decr|define_blacker_pixels|define_corrected_pixels|define_good_x_pixels|define_good_y_pixels|define_horizontal_corrected_pixels|define_pixels|define_whole_blacker_pixels|define_whole_pixels|define_whole_vertical_blacker_pixels|define_whole_vertical_pixels|dir|direction|directionpoint|div|dotprod|downto|draw|drawdot|endchar|erase|fill|filldraw|fix_units|flex|font_coding_scheme|font_extra_space|font_identifier|font_normal_shrink|font_normal_space|font_normal_stretch|font_quad|font_size|font_slant|font_x_height|gfcorners|gobble|gobbled|good\.(?:bot|lft|rt|top|x|y)|grayfont|hide|hround|imagerules|incr|interact|interpath|intersectionpoint|inverse|italcorr|killtext|labelfont|labels|lft|loggingall|lowres_fix|makegrid|makelabel(?:\.(?:bot|lft|rt|top)(?:\.nodot)?)?|max|min|mod|mode_def|mode_setup|nodisplays|notransforms|numtok|openit|penlabels|penpos|pickup|proofoffset|proofrule|proofrulethickness|range|reflectedabout|rotatedabout|rotatedaround|round|rt|savepen|screenchars|screenrule|screenstrokes|shipit|showit|slantfont|softjoin|solve|stop|superellipse|tensepath|thru|titlefont|top|tracingall|tracingnone|undraw|undrawdot|unfill|unfilldraw|upto|vround)\b/,alias:"function"},builtin:/\b(?:ASCII|angle|char|cosd|decimal|directiontime|floor|hex|intersectiontimes|jobname|known|length|makepath|makepen|mexp|mlog|normaldeviate|oct|odd|pencircle|penoffset|point|postcontrol|precontrol|reverse|rotated|sind|sqrt|str|subpath|substring|totalweight|turningnumber|uniformdeviate|unknown|xpart|xxpart|xypart|ypart|yxpart|yypart)\b/,keyword:/\b(?:also|at|atleast|begingroup|charexists|contour|controls|curl|cycle|def|delimiters|doublepath|dropping|dump|else|elseif|end|enddef|endfor|endgroup|endinput|exitif|exitunless|expandafter|fi|for|forever|forsuffixes|from|if|input|inwindow|keeping|kern|of|primarydef|quote|readstring|scaled|scantokens|secondarydef|shifted|skipto|slanted|step|tension|tertiarydef|to|transformed|until|vardef|withpen|withweight|xscaled|yscaled|zscaled)\b/,type:{pattern:/\b(?:boolean|expr|numeric|pair|path|pen|picture|primary|secondary|string|suffix|tertiary|text|transform)\b/,alias:"property"},variable:{pattern:/(^|[^@#&$])(?:@#|#@|#|@)(?![@#&$])|\b(?:aspect_ratio|currentpen|currentpicture|currenttransform|d|extra_beginchar|extra_endchar|extra_setup|h|localfont|mag|mode|screen_cols|screen_rows|w|whatever|x|y|z)\b/,lookbehind:!0}}; \ No newline at end of file diff --git a/docs/js/components/prism-mizar.min.js b/docs/js/components/prism-mizar.min.js new file mode 100644 index 000000000000..dd38293b61e4 --- /dev/null +++ b/docs/js/components/prism-mizar.min.js @@ -0,0 +1 @@ +Prism.languages.mizar={comment:/::.+/,keyword:/@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,parameter:{pattern:/\$(?:10|\d)/,alias:"variable"},variable:/\b\w+(?=:)/,number:/(?:\b|-)\d+\b/,operator:/\.\.\.|->|&|\.?=/,punctuation:/\(#|#\)|[,:;\[\](){}]/}; \ No newline at end of file diff --git a/docs/js/components/prism-mongodb.min.js b/docs/js/components/prism-mongodb.min.js new file mode 100644 index 000000000000..a71210d1ffc7 --- /dev/null +++ b/docs/js/components/prism-mongodb.min.js @@ -0,0 +1 @@ +!function($){var e=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],t="(?:"+(e=e.map((function($){return $.replace("$","\\$")}))).join("|")+")\\b";$.languages.mongodb=$.languages.extend("javascript",{}),$.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp("^(['\"])?"+t+"(?:\\1)?$")}}}),$.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},$.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"].join("|")+")\\b"),alias:"keyword"}})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-monkey.min.js b/docs/js/components/prism-monkey.min.js new file mode 100644 index 000000000000..5908950a5051 --- /dev/null +++ b/docs/js/components/prism-monkey.min.js @@ -0,0 +1 @@ +Prism.languages.monkey={comment:{pattern:/^#Rem\s[\s\S]*?^#End|'.+/im,greedy:!0},string:{pattern:/"[^"\r\n]*"/,greedy:!0},preprocessor:{pattern:/(^[ \t]*)#.+/m,lookbehind:!0,greedy:!0,alias:"property"},function:/\b\w+(?=\()/,"type-char":{pattern:/\b[?%#$]/,alias:"class-name"},number:{pattern:/((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,lookbehind:!0},keyword:/\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,operator:/\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,punctuation:/[.,:;()\[\]]/}; \ No newline at end of file diff --git a/docs/js/components/prism-moonscript.min.js b/docs/js/components/prism-moonscript.min.js new file mode 100644 index 000000000000..bf3f99c5e2f5 --- /dev/null +++ b/docs/js/components/prism-moonscript.min.js @@ -0,0 +1 @@ +Prism.languages.moonscript={comment:/--.*/,string:[{pattern:/'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,greedy:!0},{pattern:/"[^"]*"/,greedy:!0,inside:{interpolation:{pattern:/#\{[^{}]*\}/,inside:{moonscript:{pattern:/(^#\{)[\s\S]+(?=\})/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/#\{|\}/,alias:"punctuation"}}}}}],"class-name":[{pattern:/(\b(?:class|extends)[ \t]+)\w+/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,variable:/@@?\w*/,property:{pattern:/\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,lookbehind:!0},function:{pattern:/\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,inside:{punctuation:/\./}},boolean:/\b(?:false|true)\b/,number:/(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,operator:/\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,punctuation:/[.,()[\]{}\\]/},Prism.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside=Prism.languages.moonscript,Prism.languages.moon=Prism.languages.moonscript; \ No newline at end of file diff --git a/docs/js/components/prism-n1ql.min.js b/docs/js/components/prism-n1ql.min.js new file mode 100644 index 000000000000..97ae24823143 --- /dev/null +++ b/docs/js/components/prism-n1ql.min.js @@ -0,0 +1 @@ +Prism.languages.n1ql={comment:{pattern:/\/\*[\s\S]*?(?:$|\*\/)|--.*/,greedy:!0},string:{pattern:/(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,greedy:!0},identifier:{pattern:/`(?:\\[\s\S]|[^\\`]|``)*`/,greedy:!0},parameter:/\$[\w.]+/,keyword:/\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:FALSE|TRUE)\b/i,number:/(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,punctuation:/[;[\](),.{}:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-n4js.min.js b/docs/js/components/prism-n4js.min.js new file mode 100644 index 000000000000..1ce5ed5ce870 --- /dev/null +++ b/docs/js/components/prism-n4js.min.js @@ -0,0 +1 @@ +Prism.languages.n4js=Prism.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),Prism.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),Prism.languages.n4jsd=Prism.languages.n4js; \ No newline at end of file diff --git a/docs/js/components/prism-nand2tetris-hdl.min.js b/docs/js/components/prism-nand2tetris-hdl.min.js new file mode 100644 index 000000000000..fc8ea3dfbd47 --- /dev/null +++ b/docs/js/components/prism-nand2tetris-hdl.min.js @@ -0,0 +1 @@ +Prism.languages["nand2tetris-hdl"]={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,keyword:/\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,boolean:/\b(?:false|true)\b/,function:/\b[A-Za-z][A-Za-z0-9]*(?=\()/,number:/\b\d+\b/,operator:/=|\.\./,punctuation:/[{}[\];(),:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-naniscript.min.js b/docs/js/components/prism-naniscript.min.js new file mode 100644 index 000000000000..5df872e5f857 --- /dev/null +++ b/docs/js/components/prism-naniscript.min.js @@ -0,0 +1 @@ +!function(e){var a=/\{[^\r\n\[\]{}]*\}/,n={"quoted-string":{pattern:/"(?:[^"\\]|\\.)*"/,alias:"operator"},"command-param-id":{pattern:/(\s)\w+:/,lookbehind:!0,alias:"property"},"command-param-value":[{pattern:a,alias:"selector"},{pattern:/([\t ])\S+/,lookbehind:!0,greedy:!0,alias:"operator"},{pattern:/\S(?:.*\S)?/,alias:"operator"}]};function t(e){return"string"==typeof e?e:Array.isArray(e)?e.map(t).join(""):t(e.content)}e.languages.naniscript={comment:{pattern:/^([\t ]*);.*/m,lookbehind:!0},define:{pattern:/^>.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:a,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:n}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:a,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:n},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},e.languages.nani=e.languages.naniscript,e.hooks.add("after-tokenize",(function(e){e.tokens.forEach((function(e){if("string"!=typeof e&&"generic-text"===e.type){var a=t(e);(function(e){for(var a=[],n=0;n=&|$!]/}; \ No newline at end of file diff --git a/docs/js/components/prism-neon.min.js b/docs/js/components/prism-neon.min.js new file mode 100644 index 000000000000..1bb5915bbfaf --- /dev/null +++ b/docs/js/components/prism-neon.min.js @@ -0,0 +1 @@ +Prism.languages.neon={comment:{pattern:/#.*/,greedy:!0},datetime:{pattern:/(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,lookbehind:!0,alias:"number"},key:{pattern:/(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,lookbehind:!0,alias:"property"},number:{pattern:/(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,lookbehind:!0},boolean:{pattern:/(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,lookbehind:!0},null:{pattern:/(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,lookbehind:!0,alias:"keyword"},string:{pattern:/(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,lookbehind:!0,greedy:!0},literal:{pattern:/(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,lookbehind:!0,alias:"string"},punctuation:/[,:=[\]{}()-]/}; \ No newline at end of file diff --git a/docs/js/components/prism-nevod.min.js b/docs/js/components/prism-nevod.min.js new file mode 100644 index 000000000000..1cb6b8a24d65 --- /dev/null +++ b/docs/js/components/prism-nevod.min.js @@ -0,0 +1 @@ +Prism.languages.nevod={comment:/\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,string:{pattern:/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,greedy:!0,inside:{"string-attrs":/!$|!\*$|\*$/}},namespace:{pattern:/(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,lookbehind:!0},pattern:{pattern:/(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,lookbehind:!0,inside:{"pattern-name":{pattern:/^#?[a-zA-Z0-9\-.]+/,alias:"class-name"},fields:{pattern:/\(.*\)/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},punctuation:/[,()]/,operator:{pattern:/~/,alias:"field-hidden-mark"}}}}},search:{pattern:/(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,alias:"function",lookbehind:!0},keyword:/@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,"standard-pattern":{pattern:/\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,inside:{"standard-pattern-name":{pattern:/^[a-zA-Z0-9\-.]+/,alias:"builtin"},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},"standard-pattern-attr":{pattern:/[a-zA-Z0-9\-.]+/,alias:"builtin"},punctuation:/[,()]/}},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},operator:[{pattern:/=/,alias:"pattern-def"},{pattern:/&/,alias:"conjunction"},{pattern:/~/,alias:"exception"},{pattern:/\?/,alias:"optionality"},{pattern:/[[\]]/,alias:"repetition"},{pattern:/[{}]/,alias:"variation"},{pattern:/[+_]/,alias:"sequence"},{pattern:/\.{2,3}/,alias:"span"}],"field-capture":[{pattern:/([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,lookbehind:!0,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}},{pattern:/[a-zA-Z0-9\-.]+\s*:/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}}],punctuation:/[:;,()]/,name:/[a-zA-Z0-9\-.]+/}; \ No newline at end of file diff --git a/docs/js/components/prism-nginx.min.js b/docs/js/components/prism-nginx.min.js new file mode 100644 index 000000000000..ac2b6559e200 --- /dev/null +++ b/docs/js/components/prism-nginx.min.js @@ -0,0 +1 @@ +!function(e){var n=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:n}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:n}},punctuation:/[{};]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-nim.min.js b/docs/js/components/prism-nim.min.js new file mode 100644 index 000000000000..e7ed392bd9ee --- /dev/null +++ b/docs/js/components/prism-nim.min.js @@ -0,0 +1 @@ +Prism.languages.nim={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,greedy:!0},char:{pattern:/'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,greedy:!0},function:{pattern:/(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,greedy:!0,inside:{operator:/\*$/}},identifier:{pattern:/`[^`\r\n]+`/,greedy:!0,inside:{punctuation:/`/}},number:/\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,keyword:/\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,operator:{pattern:/(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,lookbehind:!0},punctuation:/[({\[]\.|\.[)}\]]|[`(){}\[\],:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-nix.min.js b/docs/js/components/prism-nix.min.js new file mode 100644 index 000000000000..9e0bfc02a1ad --- /dev/null +++ b/docs/js/components/prism-nix.min.js @@ -0,0 +1 @@ +Prism.languages.nix={comment:{pattern:/\/\*[\s\S]*?\*\/|#.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:null}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"important"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},Prism.languages.nix.string.inside.interpolation.inside=Prism.languages.nix; \ No newline at end of file diff --git a/docs/js/components/prism-nsis.min.js b/docs/js/components/prism-nsis.min.js new file mode 100644 index 000000000000..9aa0719a0a04 --- /dev/null +++ b/docs/js/components/prism-nsis.min.js @@ -0,0 +1 @@ +Prism.languages.nsis={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,lookbehind:!0,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:{pattern:/(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|KnownFolderPath|LabelAddress|TempFileName|WinVer)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|RtlLanguage|ShellVarContextAll|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|Target|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,lookbehind:!0},property:/\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,constant:/\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,variable:/\$\w[\w\.]*/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,punctuation:/[{}[\];(),.:]/,important:{pattern:/(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,lookbehind:!0}}; \ No newline at end of file diff --git a/docs/js/components/prism-objectivec.min.js b/docs/js/components/prism-objectivec.min.js new file mode 100644 index 000000000000..f8932973eaa7 --- /dev/null +++ b/docs/js/components/prism-objectivec.min.js @@ -0,0 +1 @@ +Prism.languages.objectivec=Prism.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete Prism.languages.objectivec["class-name"],Prism.languages.objc=Prism.languages.objectivec; \ No newline at end of file diff --git a/docs/js/components/prism-ocaml.min.js b/docs/js/components/prism-ocaml.min.js new file mode 100644 index 000000000000..c7b21ad693ba --- /dev/null +++ b/docs/js/components/prism-ocaml.min.js @@ -0,0 +1 @@ +Prism.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/}; \ No newline at end of file diff --git a/docs/js/components/prism-odin.min.js b/docs/js/components/prism-odin.min.js new file mode 100644 index 000000000000..5abcdf70c85f --- /dev/null +++ b/docs/js/components/prism-odin.min.js @@ -0,0 +1 @@ +!function(e){var t=/\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:/'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/,greedy:!0,inside:{symbol:t}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:/"(?:\\.|[^\n\r"\\])*"/,greedy:!0,inside:{symbol:t}}],directive:{pattern:/#\w+/,alias:"property"},number:/\b0(?:b[01_]+|d[\d_]+|h_*(?:(?:(?:[\dA-Fa-f]_*){8}){1,2}|(?:[\dA-Fa-f]_*){4})|o[0-7_]+|x[\dA-F_a-f]+|z[\dAB_ab]+)\b|(?:\b\d+(?:\.(?!\.)\d*)?|\B\.\d+)(?:[Ee][+-]?\d*)?[ijk]?(?!\w)/,discard:{pattern:/\b_\b/,alias:"keyword"},"procedure-definition":{pattern:/\b\w+(?=[ \t]*(?::\s*){2}proc\b)/,alias:"function"},keyword:/\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\b/,"procedure-name":{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"},boolean:/\b(?:false|nil|true)\b/,"constant-parameter-sign":{pattern:/\$/,alias:"important"},undefined:{pattern:/---/,alias:"operator"},arrow:{pattern:/->/,alias:"punctuation"},operator:/\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,punctuation:/[(),.:;@\[\]{}]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-opencl.min.js b/docs/js/components/prism-opencl.min.js new file mode 100644 index 000000000000..bb4cb843699c --- /dev/null +++ b/docs/js/components/prism-opencl.min.js @@ -0,0 +1 @@ +!function(E){E.languages.opencl=E.languages.extend("c",{keyword:/\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,boolean:/\b(?:false|true)\b/,"constant-opencl-kernel":{pattern:/\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,alias:"constant"}}),E.languages.insertBefore("opencl","class-name",{"builtin-type":{pattern:/\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,alias:"keyword"}});var _={"type-opencl-host":{pattern:/\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,alias:"keyword"},"boolean-opencl-host":{pattern:/\bCL_(?:FALSE|TRUE)\b/,alias:"boolean"},"constant-opencl-host":{pattern:/\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,alias:"constant"},"function-opencl-host":{pattern:/\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,alias:"function"}};E.languages.insertBefore("c","keyword",_),E.languages.cpp&&(_["type-opencl-host-cpp"]={pattern:/\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,alias:"keyword"},E.languages.insertBefore("cpp","keyword",_))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-openqasm.min.js b/docs/js/components/prism-openqasm.min.js new file mode 100644 index 000000000000..fe0b45c39edc --- /dev/null +++ b/docs/js/components/prism-openqasm.min.js @@ -0,0 +1 @@ +Prism.languages.openqasm={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"[^"\r\n\t]*"|'[^'\r\n\t]*'/,greedy:!0},keyword:/\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,"class-name":/\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,function:/\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,constant:/\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,number:{pattern:/(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,lookbehind:!0},operator:/->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,punctuation:/[(){}\[\];,:.]/},Prism.languages.qasm=Prism.languages.openqasm; \ No newline at end of file diff --git a/docs/js/components/prism-oz.min.js b/docs/js/components/prism-oz.min.js new file mode 100644 index 000000000000..45b826b72ac1 --- /dev/null +++ b/docs/js/components/prism-oz.min.js @@ -0,0 +1 @@ +Prism.languages.oz={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=[ \t]*:(?![:=]))/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/}; \ No newline at end of file diff --git a/docs/js/components/prism-parigp.min.js b/docs/js/components/prism-parigp.min.js new file mode 100644 index 000000000000..d7ed6e9e4f7e --- /dev/null +++ b/docs/js/components/prism-parigp.min.js @@ -0,0 +1 @@ +Prism.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var r=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return r=r.map((function(r){return r.split("").join(" *")})).join("|"),RegExp("\\b(?:"+r+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}; \ No newline at end of file diff --git a/docs/js/components/prism-parser.min.js b/docs/js/components/prism-parser.min.js new file mode 100644 index 000000000000..7a01f8cbc2a5 --- /dev/null +++ b/docs/js/components/prism-parser.min.js @@ -0,0 +1 @@ +!function(e){var n=e.languages.parser=e.languages.extend("markup",{keyword:{pattern:/(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{punctuation:/\.|:+/}},function:{pattern:/(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\.|:+/}},escape:{pattern:/\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,alias:"builtin"},punctuation:/[\[\](){};]/});n=e.languages.insertBefore("parser","keyword",{"parser-comment":{pattern:/(\s)#.*/,lookbehind:!0,alias:"comment"},expression:{pattern:/(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,greedy:!0,lookbehind:!0,inside:{string:{pattern:/(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,lookbehind:!0},keyword:n.keyword,variable:n.variable,function:n.function,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,escape:n.escape,operator:/[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,punctuation:n.punctuation}}}),e.languages.insertBefore("inside","punctuation",{expression:n.expression,keyword:n.keyword,variable:n.variable,function:n.function,escape:n.escape,"parser-punctuation":{pattern:n.punctuation,alias:"punctuation"}},n.tag.inside["attr-value"])}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-pascal.min.js b/docs/js/components/prism-pascal.min.js new file mode 100644 index 000000000000..3f21ba69b303 --- /dev/null +++ b/docs/js/components/prism-pascal.min.js @@ -0,0 +1 @@ +Prism.languages.pascal={directive:{pattern:/\{\$[\s\S]*?\}/,greedy:!0,alias:["marco","property"]},comment:{pattern:/\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,greedy:!0},string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},asm:{pattern:/(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,lookbehind:!0,greedy:!0,inside:null},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},Prism.languages.pascal.asm.inside=Prism.languages.extend("pascal",{asm:void 0,keyword:void 0,operator:void 0}),Prism.languages.objectpascal=Prism.languages.pascal; \ No newline at end of file diff --git a/docs/js/components/prism-pascaligo.min.js b/docs/js/components/prism-pascaligo.min.js new file mode 100644 index 000000000000..85c18b347906 --- /dev/null +++ b/docs/js/components/prism-pascaligo.min.js @@ -0,0 +1 @@ +!function(e){var n="(?:\\b\\w+(?:)?|)".replace(//g,(function(){return"\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)"})),t=e.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp("(\\btype\\s+\\w+\\s+is\\s+)".replace(//g,(function(){return n})),"i"),lookbehind:!0,inside:null},{pattern:RegExp("(?=\\s+is\\b)".replace(//g,(function(){return n})),"i"),inside:null},{pattern:RegExp("(:\\s*)".replace(//g,(function(){return n}))),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce((function(e,n){return e[n]=t[n],e}),{});t["class-name"].forEach((function(e){e.inside=i}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-pcaxis.min.js b/docs/js/components/prism-pcaxis.min.js new file mode 100644 index 000000000000..c44e6fff6863 --- /dev/null +++ b/docs/js/components/prism-pcaxis.min.js @@ -0,0 +1 @@ +Prism.languages.pcaxis={string:/"[^"]*"/,keyword:{pattern:/((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,lookbehind:!0,greedy:!0,inside:{keyword:/^[-A-Z\d]+/,language:{pattern:/^(\s*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/^\[|\]$/,property:/[-\w]+/}},"sub-key":{pattern:/^(\s*)\S[\s\S]*/,lookbehind:!0,inside:{parameter:{pattern:/"[^"]*"/,alias:"property"},punctuation:/^\(|\)$|,/}}}},operator:/=/,tlist:{pattern:/TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,greedy:!0,inside:{function:/^TLIST/,property:{pattern:/^(\s*\(\s*)\w+/,lookbehind:!0},string:/"[^"]*"/,punctuation:/[(),]/,operator:/-/}},punctuation:/[;,]/,number:{pattern:/(^|\s)\d+(?:\.\d+)?(?!\S)/,lookbehind:!0},boolean:/NO|YES/},Prism.languages.px=Prism.languages.pcaxis; \ No newline at end of file diff --git a/docs/js/components/prism-peoplecode.min.js b/docs/js/components/prism-peoplecode.min.js new file mode 100644 index 000000000000..2753baa88b0e --- /dev/null +++ b/docs/js/components/prism-peoplecode.min.js @@ -0,0 +1 @@ +Prism.languages.peoplecode={comment:RegExp(["/\\*[^]*?\\*/","\\bREM[^;]*;","<\\*(?:[^<*]|\\*(?!>)|<(?!\\*)|<\\*(?:(?!\\*>)[^])*\\*>)*\\*>","/\\+[^]*?\\+/"].join("|")),string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},variable:/%\w+/,"function-definition":{pattern:/((?:^|[^\w-])(?:function|method)\s+)\w+/i,lookbehind:!0,alias:"function"},"class-name":{pattern:/((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,lookbehind:!0,inside:{punctuation:/:/}},keyword:/\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,"operator-keyword":{pattern:/\b(?:and|not|or)\b/i,alias:"operator"},function:/[_a-z]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/\b\d+(?:\.\d+)?\b/,operator:/<>|[<>]=?|!=|\*\*|[-+*/|=@]/,punctuation:/[:.;,()[\]]/},Prism.languages.pcode=Prism.languages.peoplecode; \ No newline at end of file diff --git a/docs/js/components/prism-perl.min.js b/docs/js/components/prism-perl.min.js new file mode 100644 index 000000000000..ab71b1da1598 --- /dev/null +++ b/docs/js/components/prism-perl.min.js @@ -0,0 +1 @@ +!function(e){var n="(?:\\((?:[^()\\\\]|\\\\[^])*\\)|\\{(?:[^{}\\\\]|\\\\[^])*\\}|\\[(?:[^[\\]\\\\]|\\\\[^])*\\]|<(?:[^<>\\\\]|\\\\[^])*>)";e.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp("\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp("\\b(?:m|qr)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")[msixpodualngc]*"),greedy:!0},{pattern:RegExp("(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2(?:(?!\\2)[^\\\\]|\\\\[^])*\\2","([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[^])*\\3(?:(?!\\3)[^\\\\]|\\\\[^])*\\3",n+"\\s*"+n].join("|")+")[msixpodualngcer]*"),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-php-extras.min.js b/docs/js/components/prism-php-extras.min.js new file mode 100644 index 000000000000..50fc6a2cb9a0 --- /dev/null +++ b/docs/js/components/prism-php-extras.min.js @@ -0,0 +1 @@ +Prism.languages.insertBefore("php","variable",{this:{pattern:/\$this\b/,alias:"keyword"},global:/\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/\b(?:parent|self|static)\b/,punctuation:/::|\\/}}}); \ No newline at end of file diff --git a/docs/js/components/prism-php.min.js b/docs/js/components/prism-php.min.js new file mode 100644 index 000000000000..974a4270a890 --- /dev/null +++ b/docs/js/components/prism-php.min.js @@ -0,0 +1 @@ +!function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-phpdoc.min.js b/docs/js/components/prism-phpdoc.min.js new file mode 100644 index 000000000000..85aaeea9836b --- /dev/null +++ b/docs/js/components/prism-phpdoc.min.js @@ -0,0 +1 @@ +!function(a){var e="(?:\\b[a-zA-Z]\\w*|[|\\\\[\\]])+";a.languages.phpdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:"+e+"\\s+)?)\\$\\w+"),lookbehind:!0}}),a.languages.insertBefore("phpdoc","keyword",{"class-name":[{pattern:RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)"+e),lookbehind:!0,inside:{keyword:/\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,punctuation:/[|\\[\]()]/}}]}),a.languages.javadoclike.addSupport("php",a.languages.phpdoc)}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-plant-uml.min.js b/docs/js/components/prism-plant-uml.min.js new file mode 100644 index 000000000000..078bc25e9a36 --- /dev/null +++ b/docs/js/components/prism-plant-uml.min.js @@ -0,0 +1 @@ +!function(e){var t=/\$\w+|%[a-z]+%/;e.languages["plant-uml"]={comment:{pattern:/(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m,lookbehind:!0,greedy:!0},preprocessor:{pattern:/(^[ \t]*)!.*/m,lookbehind:!0,greedy:!0,alias:"property",inside:{variable:t}},delimiter:{pattern:/(^[ \t]*)@(?:end|start)uml\b/m,lookbehind:!0,greedy:!0,alias:"punctuation"},arrow:{pattern:RegExp("(^|[^-.<>?|\\\\[\\]ox])[[?]?[ox]?(?:(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo])|(?:<{1,2}|/{1,2}|\\\\{1,2}|<\\||[#*^+}xo])(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo]))?)[ox]?[\\]?]?(?![-.<>?|\\\\\\]ox])"),lookbehind:!0,greedy:!0,alias:"operator",inside:{expression:{pattern:/(\[)[^[\]]+(?=\])/,lookbehind:!0,inside:null},punctuation:/\[(?=$|\])|^\]/}},string:{pattern:/"[^"]*"/,greedy:!0},text:{pattern:/(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/,lookbehind:!0,greedy:!0,alias:"string"},keyword:[{pattern:/^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m,lookbehind:!0,greedy:!0},/\b(?:elseif|equals|not|while)(?=\s*\()/,/\b(?:as|is|then)\b/],divider:{pattern:/^==.+==$/m,greedy:!0,alias:"important"},time:{pattern:/@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i,greedy:!0,alias:"number"},color:{pattern:/#(?:[a-z_]+|[a-fA-F0-9]+)\b/,alias:"symbol"},variable:t,punctuation:/[:,;()[\]{}]|\.{3}/},e.languages["plant-uml"].arrow.inside.expression.inside=e.languages["plant-uml"],e.languages.plantuml=e.languages["plant-uml"]}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-plsql.min.js b/docs/js/components/prism-plsql.min.js new file mode 100644 index 000000000000..e20f68e45692 --- /dev/null +++ b/docs/js/components/prism-plsql.min.js @@ -0,0 +1 @@ +Prism.languages.plsql=Prism.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),Prism.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}}); \ No newline at end of file diff --git a/docs/js/components/prism-powerquery.min.js b/docs/js/components/prism-powerquery.min.js new file mode 100644 index 000000000000..7d773085597d --- /dev/null +++ b/docs/js/components/prism-powerquery.min.js @@ -0,0 +1 @@ +Prism.languages.powerquery={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},"quoted-identifier":{pattern:/#"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},string:{pattern:/(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},constant:[/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,/\bOccurrence\.(?:All|First|Last)\b/,/\bOrder\.(?:Ascending|Descending)\b/,/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,/\bMissingField\.(?:Error|Ignore|UseNull)\b/,/\bQuoteStyle\.(?:Csv|None)\b/,/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,/\bGroupKind\.(?:Global|Local)\b/,/\bExtraValues\.(?:Error|Ignore|List)\b/,/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,/\bJoinSide\.(?:Left|Right)\b/,/\bPrecision\.(?:Decimal|Double)\b/,/\bRelativePosition\.From(?:End|Start)\b/,/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,/\bnull\b/],boolean:/\b(?:false|true)\b/,keyword:/\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,function:{pattern:/(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,lookbehind:!0},"data-type":{pattern:/\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,alias:"class-name"},number:{pattern:/\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,lookbehind:!0},operator:/[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,punctuation:/[,;\[\](){}]/},Prism.languages.pq=Prism.languages.powerquery,Prism.languages.mscript=Prism.languages.powerquery; \ No newline at end of file diff --git a/docs/js/components/prism-powershell.min.js b/docs/js/components/prism-powershell.min.js new file mode 100644 index 000000000000..80442e70419f --- /dev/null +++ b/docs/js/components/prism-powershell.min.js @@ -0,0 +1 @@ +!function(e){var i=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-processing.min.js b/docs/js/components/prism-processing.min.js new file mode 100644 index 000000000000..91d36ca1d7ab --- /dev/null +++ b/docs/js/components/prism-processing.min.js @@ -0,0 +1 @@ +Prism.languages.processing=Prism.languages.extend("clike",{keyword:/\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,function:/\b\w+(?=\s*\()/,operator:/<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/}),Prism.languages.insertBefore("processing","number",{constant:/\b(?!XML\b)[A-Z][A-Z\d_]+\b/,type:{pattern:/\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,alias:"class-name"}}); \ No newline at end of file diff --git a/docs/js/components/prism-prolog.min.js b/docs/js/components/prism-prolog.min.js new file mode 100644 index 000000000000..531b2fd4edad --- /dev/null +++ b/docs/js/components/prism-prolog.min.js @@ -0,0 +1 @@ +Prism.languages.prolog={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,greedy:!0},builtin:/\b(?:fx|fy|xf[xy]?|yfx?)\b/,function:/\b[a-z]\w*(?:(?=\()|\/\d+)/,number:/\b\d+(?:\.\d*)?/,operator:/[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,punctuation:/[(){}\[\],]/}; \ No newline at end of file diff --git a/docs/js/components/prism-promql.min.js b/docs/js/components/prism-promql.min.js new file mode 100644 index 000000000000..46253c326365 --- /dev/null +++ b/docs/js/components/prism-promql.min.js @@ -0,0 +1 @@ +!function(t){var n=["on","ignoring","group_right","group_left","by","without"],a=["sum","min","max","avg","group","stddev","stdvar","count","count_values","bottomk","topk","quantile"].concat(n,["offset"]);t.languages.promql={comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},"vector-match":{pattern:new RegExp("((?:"+n.join("|")+")\\s*)\\([^)]*\\)"),lookbehind:!0,inside:{"label-key":{pattern:/\b[^,]+\b/,alias:"attr-name"},punctuation:/[(),]/}},"context-labels":{pattern:/\{[^{}]*\}/,inside:{"label-key":{pattern:/\b[a-z_]\w*(?=\s*(?:=|![=~]))/,alias:"attr-name"},"label-value":{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0,alias:"attr-value"},punctuation:/\{|\}|=~?|![=~]|,/}},"context-range":[{pattern:/\[[\w\s:]+\]/,inside:{punctuation:/\[|\]|:/,"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}},{pattern:/(\boffset\s+)\w+/,lookbehind:!0,inside:{"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}}],keyword:new RegExp("\\b(?:"+a.join("|")+")\\b","i"),function:/\b[a-z_]\w*(?=\s*\()/i,number:/[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,operator:/[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,punctuation:/[{};()`,.[\]]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-properties.min.js b/docs/js/components/prism-properties.min.js new file mode 100644 index 000000000000..5976d47656ae --- /dev/null +++ b/docs/js/components/prism-properties.min.js @@ -0,0 +1 @@ +Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-protobuf.min.js b/docs/js/components/prism-protobuf.min.js new file mode 100644 index 000000000000..9bc79f4632e1 --- /dev/null +++ b/docs/js/components/prism-protobuf.min.js @@ -0,0 +1 @@ +!function(e){var s=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:s}},builtin:s,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-psl.min.js b/docs/js/components/prism-psl.min.js new file mode 100644 index 000000000000..288f9464bfed --- /dev/null +++ b/docs/js/components/prism-psl.min.js @@ -0,0 +1 @@ +Prism.languages.psl={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0,inside:{symbol:/\\[ntrbA-Z"\\]/}},"heredoc-string":{pattern:/<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,alias:"string",greedy:!0},keyword:/\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,constant:/\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,boolean:/\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,variable:/\b(?:PslDebug|errno|exit_status)\b/,builtin:{pattern:/\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,alias:"builtin-function"},"foreach-variable":{pattern:/(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,lookbehind:!0,greedy:!0},function:/\b[_a-z]\w*\b(?=\s*\()/i,number:/\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,operator:/--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,punctuation:/[(){}\[\];,]/}; \ No newline at end of file diff --git a/docs/js/components/prism-pug.min.js b/docs/js/components/prism-pug.min.js new file mode 100644 index 000000000000..265211a1d226 --- /dev/null +++ b/docs/js/components/prism-pug.min.js @@ -0,0 +1 @@ +!function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],n={},a=0,i=t.length;a(?:(?:\r?\n|\r(?!\n))(?:\\2[\t ].+|\\s*?(?=\r?\n|\r)))+".replace("",(function(){return r.filter})),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[r.language,"language-"+r.language],inside:e.languages[r.language]}}})}e.languages.insertBefore("pug","filter",n)}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-puppet.min.js b/docs/js/components/prism-puppet.min.js new file mode 100644 index 000000000000..6ba5359b423e --- /dev/null +++ b/docs/js/components/prism-puppet.min.js @@ -0,0 +1 @@ +!function(e){e.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,greedy:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,greedy:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,greedy:!0,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\b\w+|\*)(?=\s*=>)/,function:[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,boolean:/\b(?:false|true)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var n=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:e.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];e.languages.puppet.heredoc[0].inside.interpolation=n,e.languages.puppet.string.inside["double-quoted"].inside.interpolation=n}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-pure.min.js b/docs/js/components/prism-pure.min.js new file mode 100644 index 000000000000..dc8508220df1 --- /dev/null +++ b/docs/js/components/prism-pure.min.js @@ -0,0 +1 @@ +!function(e){e.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/},["c",{lang:"c++",alias:"cpp"},"fortran"].forEach((function(t){var a=t;if("string"!=typeof t&&(a=t.alias,t=t.lang),e.languages[a]){var r={};r["inline-lang-"+a]={pattern:RegExp("%< *-\\*- *\\d* *-\\*-[^]+?%>".replace("",t.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:e.util.clone(e.languages.pure["inline-lang"].inside)},r["inline-lang-"+a].inside.rest=e.util.clone(e.languages[a]),e.languages.insertBefore("pure","inline-lang",r)}})),e.languages.c&&(e.languages.pure["inline-lang"].inside.rest=e.util.clone(e.languages.c))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-purebasic.min.js b/docs/js/components/prism-purebasic.min.js new file mode 100644 index 000000000000..91cb9f8d69ea --- /dev/null +++ b/docs/js/components/prism-purebasic.min.js @@ -0,0 +1 @@ +Prism.languages.purebasic=Prism.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),Prism.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete Prism.languages.purebasic["class-name"],delete Prism.languages.purebasic.boolean,Prism.languages.pbfasm=Prism.languages.purebasic; \ No newline at end of file diff --git a/docs/js/components/prism-purescript.min.js b/docs/js/components/prism-purescript.min.js new file mode 100644 index 000000000000..c6e56a333ab7 --- /dev/null +++ b/docs/js/components/prism-purescript.min.js @@ -0,0 +1 @@ +Prism.languages.purescript=Prism.languages.extend("haskell",{keyword:/\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import)\b/,punctuation:/\./}},builtin:/\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,operator:[Prism.languages.haskell.operator[0],Prism.languages.haskell.operator[2],/[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/]}),Prism.languages.purs=Prism.languages.purescript; \ No newline at end of file diff --git a/docs/js/components/prism-python.min.js b/docs/js/components/prism-python.min.js new file mode 100644 index 000000000000..96932b01ef6f --- /dev/null +++ b/docs/js/components/prism-python.min.js @@ -0,0 +1 @@ +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; \ No newline at end of file diff --git a/docs/js/components/prism-q.min.js b/docs/js/components/prism-q.min.js new file mode 100644 index 000000000000..5b419f87ebb0 --- /dev/null +++ b/docs/js/components/prism-q.min.js @@ -0,0 +1 @@ +Prism.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/}; \ No newline at end of file diff --git a/docs/js/components/prism-qml.min.js b/docs/js/components/prism-qml.min.js new file mode 100644 index 000000000000..7181f66654a3 --- /dev/null +++ b/docs/js/components/prism-qml.min.js @@ -0,0 +1 @@ +!function(e){for(var r="(?:[^\\\\()[\\]{}\"'/]||/(?![*/])||\\(*\\)|\\[*\\]|\\{*\\}|\\\\[^])".replace(//g,(function(){return"\"(?:\\\\.|[^\\\\\"\r\n])*\"|'(?:\\\\.|[^\\\\'\r\n])*'"})).replace(//g,(function(){return"//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"})),t=0;t<2;t++)r=r.replace(//g,(function(){return r}));r=r.replace(//g,"[^\\s\\S]"),e.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp("((?:^|;)[ \t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(*\\)\\s*\\{*\\}".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp("(:[ \t]*)(?![\\s;}[])(?:(?!$|[;}]))+".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-qore.min.js b/docs/js/components/prism-qore.min.js new file mode 100644 index 000000000000..ed1efaa4380e --- /dev/null +++ b/docs/js/components/prism-qore.min.js @@ -0,0 +1 @@ +Prism.languages.qore=Prism.languages.extend("clike",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,lookbehind:!0},string:{pattern:/("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,boolean:/\b(?:false|true)\b/i,function:/\$?\b(?!\d)\w+(?=\()/,number:/\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,lookbehind:!0},variable:/\$(?!\d)\w+\b/}); \ No newline at end of file diff --git a/docs/js/components/prism-qsharp.min.js b/docs/js/components/prism-qsharp.min.js new file mode 100644 index 000000000000..3fa2597bd9b2 --- /dev/null +++ b/docs/js/components/prism-qsharp.min.js @@ -0,0 +1 @@ +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,r){return"(?:"+n[+r]+")"}))}function r(e,r,a){return RegExp(n(e,r),a||"")}var a=RegExp("\\b(?:"+"Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within".trim().replace(/ /g,"|")+")\\b"),t=n("<<0>>(?:\\s*\\.\\s*<<0>>)*",["\\b[A-Za-z_]\\w*\\b"]),i={keyword:a,punctuation:/[<>()?,.:[\]]/},s='"(?:\\\\.|[^\\\\"])*"';e.languages.qsharp=e.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:r("(^|[^$\\\\])<<0>>",[s]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:r("(\\b(?:as|open)\\s+)<<0>>(?=\\s*(?:;|as\\b))",[t]),lookbehind:!0,inside:i},{pattern:r("(\\bnamespace\\s+)<<0>>(?=\\s*\\{)",[t]),lookbehind:!0,inside:i}],keyword:a,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),e.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var o=function(e,n){for(var r=0;r<2;r++)e=e.replace(/<>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}(n('\\{(?:[^"{}]|<<0>>|<>)*\\}',[s]));e.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:r('\\$"(?:\\\\.|<<0>>|[^\\\\"{])*"',[o]),greedy:!0,inside:{interpolation:{pattern:r("((?:^|[^\\\\])(?:\\\\\\\\)*)<<0>>",[o]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:e.languages.qsharp}}},string:/[\s\S]+/}}})}(Prism),Prism.languages.qs=Prism.languages.qsharp; \ No newline at end of file diff --git a/docs/js/components/prism-r.min.js b/docs/js/components/prism-r.min.js new file mode 100644 index 000000000000..47513bb1537b --- /dev/null +++ b/docs/js/components/prism-r.min.js @@ -0,0 +1 @@ +Prism.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:FALSE|TRUE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:Inf|NaN)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/}; \ No newline at end of file diff --git a/docs/js/components/prism-racket.min.js b/docs/js/components/prism-racket.min.js new file mode 100644 index 000000000000..5f3c44d03950 --- /dev/null +++ b/docs/js/components/prism-racket.min.js @@ -0,0 +1 @@ +Prism.languages.racket=Prism.languages.extend("scheme",{"lambda-parameter":{pattern:/([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,lookbehind:!0}}),Prism.languages.insertBefore("racket","string",{lang:{pattern:/^#lang.+/m,greedy:!0,alias:"keyword"}}),Prism.languages.rkt=Prism.languages.racket; \ No newline at end of file diff --git a/docs/js/components/prism-reason.min.js b/docs/js/components/prism-reason.min.js new file mode 100644 index 000000000000..e574faf9f95f --- /dev/null +++ b/docs/js/components/prism-reason.min.js @@ -0,0 +1 @@ +Prism.languages.reason=Prism.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),Prism.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete Prism.languages.reason.function; \ No newline at end of file diff --git a/docs/js/components/prism-regex.min.js b/docs/js/components/prism-regex.min.js new file mode 100644 index 000000000000..f14e7f0a5fea --- /dev/null +++ b/docs/js/components/prism-regex.min.js @@ -0,0 +1 @@ +!function(a){var e={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,t="(?:[^\\\\-]|"+n.source+")",s=RegExp(t+"-"+t),i={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};a.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":e,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":e,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":i}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|:=]=?|!=|\b_\b/,punctuation:/[,;.\[\]{}()]/}; \ No newline at end of file diff --git a/docs/js/components/prism-renpy.min.js b/docs/js/components/prism-renpy.min.js new file mode 100644 index 000000000000..06bd925671e4 --- /dev/null +++ b/docs/js/components/prism-renpy.min.js @@ -0,0 +1 @@ +Prism.languages.renpy={comment:{pattern:/(^|[^\\])#.+/,lookbehind:!0},string:{pattern:/("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,greedy:!0},function:/\b[a-z_]\w*(?=\()/i,property:/\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,tag:/\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,keyword:/\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,boolean:/\b(?:[Ff]alse|[Tt]rue)\b/,number:/(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,punctuation:/[{}[\];(),.:]/},Prism.languages.rpy=Prism.languages.renpy; \ No newline at end of file diff --git a/docs/js/components/prism-rescript.min.js b/docs/js/components/prism-rescript.min.js new file mode 100644 index 000000000000..5d00666f4300 --- /dev/null +++ b/docs/js/components/prism-rescript.min.js @@ -0,0 +1 @@ +Prism.languages.rescript={comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},char:{pattern:/'(?:[^\r\n\\]|\\(?:.|\w+))'/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/,function:{pattern:/[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/,lookbehind:!0},number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,boolean:/\b(?:false|true)\b/,"attr-value":/[A-Za-z]\w*(?==)/,constant:{pattern:/(\btype\s+)[a-z]\w*/,lookbehind:!0},tag:{pattern:/(<)[a-z]\w*|(?:<\/)[a-z]\w*/,lookbehind:!0,inside:{operator:/<|>|\//}},keyword:/\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/,operator:/\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/,punctuation:/[(){}[\],;.]/},Prism.languages.insertBefore("rescript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"tag"},rest:Prism.languages.rescript}},string:/[\s\S]+/}}}),Prism.languages.res=Prism.languages.rescript; \ No newline at end of file diff --git a/docs/js/components/prism-rest.min.js b/docs/js/components/prism-rest.min.js new file mode 100644 index 000000000000..1228d1bf436c --- /dev/null +++ b/docs/js/components/prism-rest.min.js @@ -0,0 +1 @@ +Prism.languages.rest={table:[{pattern:/(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,lookbehind:!0,inside:{punctuation:/\||(?:\+[=-]+)+\+/}},{pattern:/(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,lookbehind:!0,inside:{punctuation:/[=-]+/}}],"substitution-def":{pattern:/(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,alias:"attr-value",inside:{punctuation:/^\||\|$/}},directive:{pattern:/( )(?! )[^:]+::/,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}}}},"link-target":[{pattern:/(^[\t ]*\.\. )\[[^\]]+\]/m,lookbehind:!0,alias:"string",inside:{punctuation:/^\[|\]$/}},{pattern:/(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,lookbehind:!0,alias:"string",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^[\t ]*\.\. )[^:]+::/m,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}},comment:{pattern:/(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,inside:{punctuation:/^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,lookbehind:!0,inside:{punctuation:/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,lookbehind:!0,alias:"punctuation"},field:{pattern:/(^[\t ]*):[^:\r\n]+:(?= )/m,lookbehind:!0,alias:"attr-name"},"command-line-option":{pattern:/(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,lookbehind:!0,alias:"symbol"},"literal-block":{pattern:/::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,inside:{"literal-block-punctuation":{pattern:/^::/,alias:"punctuation"}}},"quoted-literal-block":{pattern:/::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,inside:{"literal-block-punctuation":{pattern:/^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,alias:"punctuation"}}},"list-bullet":{pattern:/(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,lookbehind:!0,alias:"punctuation"},"doctest-block":{pattern:/(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\*\*).+(?=\*\*$)/,lookbehind:!0},italic:{pattern:/(^\*).+(?=\*$)/,lookbehind:!0},"inline-literal":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:"symbol"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:"function",inside:{punctuation:/^:|:$/}},"interpreted-text":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:"attr-value"},substitution:{pattern:/(^\|).+(?=\|$)/,lookbehind:!0,alias:"attr-value"},punctuation:/\*\*?|``?|\|/}}],link:[{pattern:/\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,alias:"string",inside:{punctuation:/^\[|\]_$/}},{pattern:/(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,alias:"string",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,lookbehind:!0}}; \ No newline at end of file diff --git a/docs/js/components/prism-rip.min.js b/docs/js/components/prism-rip.min.js new file mode 100644 index 000000000000..80e3425f76c1 --- /dev/null +++ b/docs/js/components/prism-rip.min.js @@ -0,0 +1 @@ +Prism.languages.rip={comment:{pattern:/#.*/,greedy:!0},char:{pattern:/\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},regex:{pattern:/(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},keyword:/(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,builtin:/@|\bSystem\b/,boolean:/\b(?:false|true)\b/,date:/\b\d{4}-\d{2}-\d{2}\b/,time:/\b\d{2}:\d{2}:\d{2}\b/,datetime:/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,symbol:/:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,number:/[+-]?\b(?:\d+\.\d+|\d+)\b/,punctuation:/(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,reference:/[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/}; \ No newline at end of file diff --git a/docs/js/components/prism-roboconf.min.js b/docs/js/components/prism-roboconf.min.js new file mode 100644 index 000000000000..f9969d2dcb0a --- /dev/null +++ b/docs/js/components/prism-roboconf.min.js @@ -0,0 +1 @@ +Prism.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,lookbehind:!0},component:{pattern:/[\w-]+(?=[ \t]*\{)/,alias:"variable"},property:/[\w.-]+(?=[ \t]*:)/,value:{pattern:/(=[ \t]*(?![ \t]))[^,;]+/,lookbehind:!0,alias:"attr-value"},optional:{pattern:/\(optional\)/,alias:"builtin"},wildcard:{pattern:/(\.)\*/,lookbehind:!0,alias:"operator"},punctuation:/[{},.;:=]/}; \ No newline at end of file diff --git a/docs/js/components/prism-robotframework.min.js b/docs/js/components/prism-robotframework.min.js new file mode 100644 index 000000000000..a0397f51b54f --- /dev/null +++ b/docs/js/components/prism-robotframework.min.js @@ -0,0 +1 @@ +!function(t){var n={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},e={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function a(t,a){var r={"section-header":{pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"}};for(var o in a)r[o]=a[o];return r.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},r.variable=e,r.comment=n,{pattern:RegExp("^ ?\\*{3}[ \t]*[ \t]*\\*{3}(?:.|[\r\n](?!\\*{3}))*".replace(//g,(function(){return t})),"im"),alias:"section",inside:r}}var r={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},o={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:e}},i={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:e}};t.languages.robotframework={settings:a("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:a("Variables"),"test-cases":a("Test Cases",{"test-name":o,documentation:r,property:i}),keywords:a("Keywords",{"keyword-name":o,documentation:r,property:i}),tasks:a("Tasks",{"task-name":o,documentation:r,property:i}),comment:n},t.languages.robot=t.languages.robotframework}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-ruby.min.js b/docs/js/components/prism-ruby.min.js new file mode 100644 index 000000000000..7c5bec2aae95 --- /dev/null +++ b/docs/js/components/prism-ruby.min.js @@ -0,0 +1 @@ +!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var n={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var t="(?:"+["([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^]|\\((?:[^()\\\\]|\\\\[^])*\\))*\\)","\\{(?:[^{}\\\\]|\\\\[^]|\\{(?:[^{}\\\\]|\\\\[^])*\\})*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^]|\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\])*\\]","<(?:[^<>\\\\]|\\\\[^]|<(?:[^<>\\\\]|\\\\[^])*>)*>"].join("|")+")",i='(?:"(?:\\\\.|[^"\\\\\r\n])*"|(?:\\b[a-zA-Z_]\\w*|[^\\s\0-\\x7F]+)[?!]?|\\$.)';e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp("%r"+t+"[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp("(^|[^:]):"+i),lookbehind:!0,greedy:!0},{pattern:RegExp("([\r\n{(,][ \t]*)"+i+"(?=:(?!:))"),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp("%[qQiIwWs]?"+t),greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp("%x"+t),greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-rust.min.js b/docs/js/components/prism-rust.min.js new file mode 100644 index 000000000000..d37ce8c574ae --- /dev/null +++ b/docs/js/components/prism-rust.min.js @@ -0,0 +1 @@ +!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,(function(){return a}));a=a.replace(//g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-sas.min.js b/docs/js/components/prism-sas.min.js new file mode 100644 index 000000000000..181589c39bc9 --- /dev/null +++ b/docs/js/components/prism-sas.min.js @@ -0,0 +1 @@ +!function(e){var t="(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))",a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,n={pattern:RegExp(t+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},r={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},s={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},o=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],l={pattern:RegExp(t),greedy:!0},c=/[$%@.(){}\[\];,\\]/,d={pattern:/%?\b\w+(?=\()/,alias:"keyword"},p={function:d,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l},u={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},m={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},b={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},g={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},k="aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce",y={pattern:RegExp("(^|\\s)(?:action\\s+)?(?:)\\.[a-z]+\\b[^;]+".replace(//g,(function(){return k})),"i"),lookbehind:!0,inside:{keyword:RegExp("(?:)\\.[a-z]+\\b".replace(//g,(function(){return k})),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:o,function:d,"arg-value":p["arg-value"],operator:p.operator,argument:p.arg,number:a,"numeric-constant":n,punctuation:c,string:l}},S={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};e.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp("^[ \t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:|[^;\"'])+;".replace(//g,(function(){return t})),"im"),alias:"language-sql",inside:e.languages.sql},"global-statements":b,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,groovy:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-groovy",inside:e.languages.groovy},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,lua:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-lua",inside:e.languages.lua},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:p}},"cas-actions":y,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:p},step:s,keyword:S,function:d,format:u,altformat:m,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-args":{pattern:RegExp("(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|)+;".replace(//g,(function(){return t})),"im"),lookbehind:!0,inside:p},"macro-keyword":r,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":r,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:c}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:o,number:a,"numeric-constant":n}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:p},"cas-actions":y,comment:o,function:d,format:u,altformat:m,"numeric-constant":n,datetime:{pattern:RegExp(t+"(?:dt?|t)"),alias:"number"},string:l,step:s,keyword:S,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:c}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-sass.min.js b/docs/js/components/prism-sass.min.js new file mode 100644 index 000000000000..f6ce6f154a6d --- /dev/null +++ b/docs/js/components/prism-sass.min.js @@ -0,0 +1 @@ +!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-scala.min.js b/docs/js/components/prism-scala.min.js new file mode 100644 index 000000000000..560000f43af5 --- /dev/null +++ b/docs/js/components/prism-scala.min.js @@ -0,0 +1 @@ +Prism.languages.scala=Prism.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|derives|do|else|enum|extends|extension|final|finally|for|forSome|given|if|implicit|import|infix|inline|lazy|match|new|null|object|opaque|open|override|package|private|protected|return|sealed|self|super|this|throw|trait|transparent|try|type|using|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),Prism.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:Prism.languages.scala}}},string:/[\s\S]+/}}}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function,delete Prism.languages.scala.constant; \ No newline at end of file diff --git a/docs/js/components/prism-scheme.min.js b/docs/js/components/prism-scheme.min.js new file mode 100644 index 000000000000..2aa445193d53 --- /dev/null +++ b/docs/js/components/prism-scheme.min.js @@ -0,0 +1 @@ +!function(e){e.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(e){for(var r in e)e[r]=e[r].replace(/<[\w\s]+>/g,(function(r){return"(?:"+e[r].trim()+")"}));return e[r]}({"":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[esfdl][+-]?\\d+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?","":"[0-9a-f]+(?:/[0-9a-f]+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"#[box](?:#[ei])?|(?:#[ei])?#[box]","":"(^|[()\\[\\]\\s])(?:|)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-scss.min.js b/docs/js/components/prism-scss.min.js new file mode 100644 index 000000000000..61f069c076ee --- /dev/null +++ b/docs/js/components/prism-scss.min.js @@ -0,0 +1 @@ +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; \ No newline at end of file diff --git a/docs/js/components/prism-shell-session.min.js b/docs/js/components/prism-shell-session.min.js new file mode 100644 index 000000000000..470c9ce03ddc --- /dev/null +++ b/docs/js/components/prism-shell-session.min.js @@ -0,0 +1 @@ +!function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\\1\\s[^]*?[\r\n]\\2"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^\0-\\x1F$#%*?"<>:;|]+)?|[/~.][^\0-\\x1F$#%*?"<>@:;|]*)?[$#%](?=\\s)'+"(?:[^\\\\\r\n \t'\"<$]|[ \t](?:(?!#)|#.*$)|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<(?!<)|<>)+".replace(/<>/g,(function(){return n})),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-smali.min.js b/docs/js/components/prism-smali.min.js new file mode 100644 index 000000000000..771f976b7acc --- /dev/null +++ b/docs/js/components/prism-smali.min.js @@ -0,0 +1 @@ +Prism.languages.smali={comment:/#.*/,string:{pattern:/"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,greedy:!0},"class-name":{pattern:/(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,lookbehind:!0,inside:{"class-name":{pattern:/(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,lookbehind:!0},namespace:{pattern:/^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,lookbehind:!0,inside:{punctuation:/\//}},builtin:/^L/}},builtin:[{pattern:/([();\[])[BCDFIJSVZ]+/,lookbehind:!0},{pattern:/([\w$>]:)[BCDFIJSVZ]/,lookbehind:!0}],keyword:[{pattern:/(\.end\s+)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])\.(?!\d)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,lookbehind:!0}],function:{pattern:/(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,lookbehind:!0},field:{pattern:/[\w$]+(?=:)/,alias:"variable"},register:{pattern:/(^|[^\w.-])[vp]\d(?![\w.-])/,lookbehind:!0,alias:"variable"},boolean:{pattern:/(^|[^\w.-])(?:false|true)(?![\w.-])/,lookbehind:!0},number:{pattern:/(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,lookbehind:!0},label:{pattern:/(:)\w+/,lookbehind:!0,alias:"property"},operator:/->|\.\.|[\[=]/,punctuation:/[{}(),;:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-smalltalk.min.js b/docs/js/components/prism-smalltalk.min.js new file mode 100644 index 000000000000..32e30465c04b --- /dev/null +++ b/docs/js/components/prism-smalltalk.min.js @@ -0,0 +1 @@ +Prism.languages.smalltalk={comment:{pattern:/"(?:""|[^"])*"/,greedy:!0},char:{pattern:/\$./,greedy:!0},string:{pattern:/'(?:''|[^'])*'/,greedy:!0},symbol:/#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,"block-arguments":{pattern:/(\[\s*):[^\[|]*\|/,lookbehind:!0,inside:{variable:/:[\da-z]+/i,punctuation:/\|/}},"temporary-variables":{pattern:/\|[^|]+\|/,inside:{variable:/[\da-z]+/i,punctuation:/\|/}},keyword:/\b(?:new|nil|self|super)\b/,boolean:/\b(?:false|true)\b/,number:[/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,/\b\d+(?:\.\d+)?(?:e-?\d+)?/],operator:/[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,punctuation:/[.;:?\[\](){}]/}; \ No newline at end of file diff --git a/docs/js/components/prism-smarty.min.js b/docs/js/components/prism-smarty.min.js new file mode 100644 index 000000000000..1e397744d3cd --- /dev/null +++ b/docs/js/components/prism-smarty.min.js @@ -0,0 +1 @@ +!function(e){e.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:e.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},e.languages.smarty["embedded-php"].inside.smarty.inside=e.languages.smarty,e.languages.smarty.string[0].inside.interpolation.inside.expression.inside=e.languages.smarty;var n=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,t=RegExp("\\{\\*[^]*?\\*\\}|\\{php\\}[^]*?\\{/php\\}|"+"\\{(?:[^{}\"']||\\{(?:[^{}\"']||\\{(?:[^{}\"']|)*\\})*\\})*\\}".replace(//g,(function(){return n.source})),"g");e.hooks.add("before-tokenize",(function(n){var a=!1;e.languages["markup-templating"].buildPlaceholders(n,"smarty",t,(function(e){return"{/literal}"===e&&(a=!1),!a&&("{literal}"===e&&(a=!0),!0)}))})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"smarty")}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-sml.min.js b/docs/js/components/prism-sml.min.js new file mode 100644 index 000000000000..cb6152870c9a --- /dev/null +++ b/docs/js/components/prism-sml.min.js @@ -0,0 +1 @@ +!function(e){var n=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;e.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp("((?:^|[^:]):\\s*)(?:\\s*(?:(?:\\*|->)\\s*|,\\s*(?:(?=)|(?!)\\s+)))*".replace(//g,(function(){return"\\s*(?:[*,]|->)"})).replace(//g,(function(){return"(?:'[\\w']*||\\((?:[^()]|\\([^()]*\\))*\\)|\\{(?:[^{}]|\\{[^{}]*\\})*\\})(?:\\s+)*"})).replace(//g,(function(){return"(?!)[a-z\\d_][\\w'.]*"})).replace(//g,(function(){return n.source})),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:n,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},e.languages.sml["class-name"][0].inside=e.languages.sml,e.languages.smlnj=e.languages.sml}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-solidity.min.js b/docs/js/components/prism-solidity.min.js new file mode 100644 index 000000000000..104f413ce93c --- /dev/null +++ b/docs/js/components/prism-solidity.min.js @@ -0,0 +1 @@ +Prism.languages.solidity=Prism.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),Prism.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),Prism.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),Prism.languages.sol=Prism.languages.solidity; \ No newline at end of file diff --git a/docs/js/components/prism-solution-file.min.js b/docs/js/components/prism-solution-file.min.js new file mode 100644 index 000000000000..8531a255cc13 --- /dev/null +++ b/docs/js/components/prism-solution-file.min.js @@ -0,0 +1 @@ +!function(n){var t={pattern:/\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,alias:"constant",inside:{punctuation:/[{}]/}};n.languages["solution-file"]={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0,inside:{guid:t}},object:{pattern:/^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,lookbehind:!0,greedy:!0,alias:"keyword"},property:{pattern:/^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,lookbehind:!0,inside:{guid:t}},guid:t,number:/\b\d+(?:\.\d+)*\b/,boolean:/\b(?:FALSE|TRUE)\b/,operator:/=/,punctuation:/[(),]/},n.languages.sln=n.languages["solution-file"]}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-soy.min.js b/docs/js/components/prism-soy.min.js new file mode 100644 index 000000000000..dd8071096ee9 --- /dev/null +++ b/docs/js/components/prism-soy.min.js @@ -0,0 +1 @@ +!function(e){var a=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,t=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;e.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:a,greedy:!0},number:t,punctuation:/[\[\].?]/}},string:{pattern:a,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:t,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},e.hooks.add("before-tokenize",(function(a){var t=!1;e.languages["markup-templating"].buildPlaceholders(a,"soy",/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,(function(e){return"{/literal}"===e&&(t=!1),!t&&("{literal}"===e&&(t=!0),!0)}))})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"soy")}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-sparql.min.js b/docs/js/components/prism-sparql.min.js new file mode 100644 index 000000000000..fd5a7c6bb47f --- /dev/null +++ b/docs/js/components/prism-sparql.min.js @@ -0,0 +1 @@ +Prism.languages.sparql=Prism.languages.extend("turtle",{boolean:/\b(?:false|true)\b/i,variable:{pattern:/[?$]\w+/,greedy:!0}}),Prism.languages.insertBefore("sparql","punctuation",{keyword:[/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,/\b(?:BASE|GRAPH|PREFIX)\b/i]}),Prism.languages.rq=Prism.languages.sparql; \ No newline at end of file diff --git a/docs/js/components/prism-splunk-spl.min.js b/docs/js/components/prism-splunk-spl.min.js new file mode 100644 index 000000000000..8a0e24fdff6d --- /dev/null +++ b/docs/js/components/prism-splunk-spl.min.js @@ -0,0 +1 @@ +Prism.languages["splunk-spl"]={comment:/`comment\("(?:\\.|[^\\"])*"\)`/,string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0},keyword:/\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,"operator-word":{pattern:/\b(?:and|as|by|not|or|xor)\b/i,alias:"operator"},function:/\b\w+(?=\s*\()/,property:/\b\w+(?=\s*=(?!=))/,date:{pattern:/\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,alias:"number"},number:/\b\d+(?:\.\d+)?\b/,boolean:/\b(?:f|false|t|true)\b/i,operator:/[<>=]=?|[-+*/%|]/,punctuation:/[()[\],]/}; \ No newline at end of file diff --git a/docs/js/components/prism-sqf.min.js b/docs/js/components/prism-sqf.min.js new file mode 100644 index 000000000000..d4e731da8b6d --- /dev/null +++ b/docs/js/components/prism-sqf.min.js @@ -0,0 +1 @@ +Prism.languages.sqf=Prism.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),Prism.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:Prism.languages.sqf.comment}}}),delete Prism.languages.sqf["class-name"]; \ No newline at end of file diff --git a/docs/js/components/prism-sql.min.js b/docs/js/components/prism-sql.min.js new file mode 100644 index 000000000000..86259a6b4f62 --- /dev/null +++ b/docs/js/components/prism-sql.min.js @@ -0,0 +1 @@ +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; \ No newline at end of file diff --git a/docs/js/components/prism-squirrel.min.js b/docs/js/components/prism-squirrel.min.js new file mode 100644 index 000000000000..c45f650c430e --- /dev/null +++ b/docs/js/components/prism-squirrel.min.js @@ -0,0 +1 @@ +Prism.languages.squirrel=Prism.languages.extend("clike",{comment:[Prism.languages.clike.comment[0],{pattern:/(^|[^\\:])(?:\/\/|#).*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,lookbehind:!0,greedy:!0},"class-name":{pattern:/(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,lookbehind:!0,inside:{punctuation:/\./}},keyword:/\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,number:/\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,operator:/\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,punctuation:/[(){}\[\],;.]/}),Prism.languages.insertBefore("squirrel","string",{char:{pattern:/(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore("squirrel","operator",{"attribute-punctuation":{pattern:/<\/|\/>/,alias:"important"},lambda:{pattern:/@(?=\()/,alias:"operator"}}); \ No newline at end of file diff --git a/docs/js/components/prism-stan.min.js b/docs/js/components/prism-stan.min.js new file mode 100644 index 000000000000..5db623fab4b4 --- /dev/null +++ b/docs/js/components/prism-stan.min.js @@ -0,0 +1 @@ +!function(e){var r=/\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;e.languages.stan={comment:/\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,string:{pattern:/"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,greedy:!0},directive:{pattern:/^([ \t]*)#include\b.*/m,lookbehind:!0,alias:"property"},"function-arg":{pattern:RegExp("("+r.source+"\\s*\\(\\s*)[a-zA-Z]\\w*"),lookbehind:!0,alias:"function"},constraint:{pattern:/(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,lookbehind:!0,inside:{expression:{pattern:/(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,lookbehind:!0,inside:null},property:/\b[a-z]\w*(?=\s*=)/i,operator:/=/,punctuation:/^<|>$|,/}},keyword:[{pattern:/\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,alias:"program-block"},/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,r],function:/\b[a-z]\w*(?=\s*\()/i,number:/(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,boolean:/\b(?:false|true)\b/,operator:/<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,punctuation:/[()\[\]{},;]/},e.languages.stan.constraint.inside.expression.inside=e.languages.stan}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-stata.min.js b/docs/js/components/prism-stata.min.js new file mode 100644 index 000000000000..f6ccbfdf204b --- /dev/null +++ b/docs/js/components/prism-stata.min.js @@ -0,0 +1 @@ +Prism.languages.stata={comment:[{pattern:/(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0}],"string-literal":{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,inside:{punctuation:/^\$\{|\}$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},mata:{pattern:/(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-mata",inside:Prism.languages.mata},java:{pattern:/(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-java",inside:Prism.languages.java},python:{pattern:/(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-python",inside:Prism.languages.python},command:{pattern:/(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,lookbehind:!0,greedy:!0,alias:"keyword"},variable:/\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,keyword:/\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,boolean:/\b(?:off|on)\b/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+/,function:/\b[a-z_]\w*(?=\()/i,operator:/\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,punctuation:/[(){}[\],:]/},Prism.languages.stata["string-literal"].inside.interpolation.inside.expression.inside=Prism.languages.stata; \ No newline at end of file diff --git a/docs/js/components/prism-stylus.min.js b/docs/js/components/prism-stylus.min.js new file mode 100644 index 000000000000..a9682d8f28d0 --- /dev/null +++ b/docs/js/components/prism-stylus.min.js @@ -0,0 +1 @@ +!function(e){var n={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},t={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:n,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:n,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:r,punctuation:/[{}()\[\];:,]/};t.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:t}},t.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:t}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:t}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:t}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:t}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:t.interpolation,comment:t.comment,punctuation:/[{},]/}},func:t.func,string:t.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:t.interpolation,punctuation:/[{}()\[\];:.]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-supercollider.min.js b/docs/js/components/prism-supercollider.min.js new file mode 100644 index 000000000000..52376717c2e3 --- /dev/null +++ b/docs/js/components/prism-supercollider.min.js @@ -0,0 +1 @@ +Prism.languages.supercollider={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/,lookbehind:!0,greedy:!0},char:{pattern:/\$(?:[^\\\r\n]|\\.)/,greedy:!0},symbol:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|arg|classvar|const|nil|var|while)\b/,boolean:/\b(?:false|true)\b/,label:{pattern:/\b[a-z_]\w*(?=\s*:)/,alias:"property"},number:/\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/,"class-name":/\b[A-Z]\w*\b/,operator:/\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/,punctuation:/[{}()[\].:,;]|#[[{]/},Prism.languages.sclang=Prism.languages.supercollider; \ No newline at end of file diff --git a/docs/js/components/prism-swift.min.js b/docs/js/components/prism-swift.min.js new file mode 100644 index 000000000000..b4f87f4637fe --- /dev/null +++ b/docs/js/components/prism-swift.min.js @@ -0,0 +1 @@ +Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift})); \ No newline at end of file diff --git a/docs/js/components/prism-systemd.min.js b/docs/js/components/prism-systemd.min.js new file mode 100644 index 000000000000..25b98f672fdc --- /dev/null +++ b/docs/js/components/prism-systemd.min.js @@ -0,0 +1 @@ +!function(e){var t={pattern:/^[;#].*/m,greedy:!0},n='"(?:[^\r\n"\\\\]|\\\\(?:[^\r]|\r\n?))*"(?!\\S)';e.languages.systemd={comment:t,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp("(=[ \t]*(?!\\s))(?:"+n+'|(?=[^"\r\n]))(?:[^\\s\\\\]|[ \t]+(?:(?![ \t"])|'+n+")|\\\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;]))*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:t,quoted:{pattern:RegExp("(^|\\s)"+n),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-t4-cs.min.js b/docs/js/components/prism-t4-cs.min.js new file mode 100644 index 000000000000..fe276ebf9ae8 --- /dev/null +++ b/docs/js/components/prism-t4-cs.min.js @@ -0,0 +1 @@ +Prism.languages.t4=Prism.languages["t4-cs"]=Prism.languages["t4-templating"].createT4("csharp"); \ No newline at end of file diff --git a/docs/js/components/prism-t4-templating.min.js b/docs/js/components/prism-t4-templating.min.js new file mode 100644 index 000000000000..365b8e8549d7 --- /dev/null +++ b/docs/js/components/prism-t4-templating.min.js @@ -0,0 +1 @@ +!function(e){function t(e,t,a){return{pattern:RegExp("<#"+e+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+e+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:t,alias:a}}}}e.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:function(a){var n=e.languages[a],i="language-"+a;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:t("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:t("=",n,i),"class-feature":t("\\+",n,i),standard:t("",n,i)}}}}})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-t4-vb.min.js b/docs/js/components/prism-t4-vb.min.js new file mode 100644 index 000000000000..23b0ddad8f1c --- /dev/null +++ b/docs/js/components/prism-t4-vb.min.js @@ -0,0 +1 @@ +Prism.languages["t4-vb"]=Prism.languages["t4-templating"].createT4("vbnet"); \ No newline at end of file diff --git a/docs/js/components/prism-tap.min.js b/docs/js/components/prism-tap.min.js new file mode 100644 index 000000000000..65585b0635bb --- /dev/null +++ b/docs/js/components/prism-tap.min.js @@ -0,0 +1 @@ +Prism.languages.tap={fail:/not ok[^#{\n\r]*/,pass:/ok[^#{\n\r]*/,pragma:/pragma [+-][a-z]+/,bailout:/bail out!.*/i,version:/TAP version \d+/i,plan:/\b\d+\.\.\d+(?: +#.*)?/,subtest:{pattern:/# Subtest(?:: .*)?/,greedy:!0},punctuation:/[{}]/,directive:/#.*/,yamlish:{pattern:/(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,lookbehind:!0,inside:Prism.languages.yaml,alias:"language-yaml"}}; \ No newline at end of file diff --git a/docs/js/components/prism-tcl.min.js b/docs/js/components/prism-tcl.min.js new file mode 100644 index 000000000000..2704aadac714 --- /dev/null +++ b/docs/js/components/prism-tcl.min.js @@ -0,0 +1 @@ +Prism.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$)\{[^}]+\}/,lookbehind:!0},{pattern:/(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^[\t ]*proc[ \t]+)\S+/m,lookbehind:!0},builtin:[{pattern:/(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,lookbehind:!0},/\b(?:else|elseif)\b/],scope:{pattern:/(^[\t ]*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,punctuation:/[{}()\[\]]/}; \ No newline at end of file diff --git a/docs/js/components/prism-textile.min.js b/docs/js/components/prism-textile.min.js new file mode 100644 index 000000000000..a98dfd8b5e65 --- /dev/null +++ b/docs/js/components/prism-textile.min.js @@ -0,0 +1 @@ +!function(n){function e(n,e){return RegExp(n.replace(//g,(function(){return"(?:\\([^|()\n]+\\)|\\[[^\\]\n]+\\]|\\{[^}\n]+\\})"})).replace(//g,(function(){return"(?:\\)|\\((?![^|()\n]+\\)))"})),e||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},t=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:e("^[a-z]\\w*(?:||[<>=])*\\."),inside:{modifier:{pattern:e("(^[a-z]\\w*)(?:||[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:e("^[*#]+*\\s+\\S.*","m"),inside:{modifier:{pattern:e("(^[*#]+)+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e("^(?:(?:||[<>=^~])+\\.\\s*)?(?:\\|(?:(?:||[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:||[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:e("(^|\\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:e("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:e("(^(\\*\\*?)*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:e("(^(__?)*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:e("(^\\?\\?*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:e("(^@*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:e("(^\\+*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:e("(^-*).+?(?=-)"),lookbehind:!0},span:{pattern:e("(^%*).+?(?=%)"),lookbehind:!0},modifier:{pattern:e("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:e('"*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:e('(^"*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:e('(^")+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:e("!(?:||[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:e("(^!(?:||[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:e("(^!)(?:||[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),a=t.phrase.inside,o={inline:a.inline,link:a.link,image:a.image,footnote:a.footnote,acronym:a.acronym,mark:a.mark};t.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var r=a.inline.inside;r.bold.inside=o,r.italic.inside=o,r.inserted.inside=o,r.deleted.inside=o,r.span.inside=o;var d=a.table.inside;d.inline=o.inline,d.link=o.link,d.image=o.image,d.footnote=o.footnote,d.acronym=o.acronym,d.mark=o.mark}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-toml.min.js b/docs/js/components/prism-toml.min.js new file mode 100644 index 000000000000..0dec967cdeb3 --- /dev/null +++ b/docs/js/components/prism-toml.min.js @@ -0,0 +1 @@ +!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-tremor.min.js b/docs/js/components/prism-tremor.min.js new file mode 100644 index 000000000000..7c8718cfeb48 --- /dev/null +++ b/docs/js/components/prism-tremor.min.js @@ -0,0 +1 @@ +!function(e){e.languages.tremor={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},"interpolated-string":null,extractor:{pattern:/\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,greedy:!0,inside:{regex:{pattern:/(^re)\|[\s\S]+/,lookbehind:!0},function:/^\w+/,value:/\|[\s\S]+/}},identifier:{pattern:/`[^`]*`/,greedy:!0},function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,keyword:/\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,"pattern-punctuation":{pattern:/%(?=[({[])/,alias:"punctuation"},operator:/[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?>?=?|(?:absent|and|not|or|present|xor)\b/,punctuation:/::|[;\[\]()\{\},.:]/};var n='#\\{(?:[^"{}]|\\{[^{}]*\\}|"(?:[^"\\\\\r\n]|\\\\(?:\r\n|[^]))*")*\\}';e.languages.tremor["interpolated-string"]={pattern:RegExp('(^|[^\\\\])(?:"""(?:[^"\\\\#]|\\\\[^]|"(?!"")|#(?!\\{)|'+n+')*"""|"(?:[^"\\\\\r\n#]|\\\\(?:\r\n|[^])|#(?!\\{)|'+n+')*")'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:RegExp(n),inside:{punctuation:/^#\{|\}$/,expression:{pattern:/[\s\S]+/,inside:e.languages.tremor}}},string:/[\s\S]+/}},e.languages.troy=e.languages.tremor,e.languages.trickle=e.languages.tremor}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-tsx.min.js b/docs/js/components/prism-tsx.min.js new file mode 100644 index 000000000000..5819dcdd2b50 --- /dev/null +++ b/docs/js/components/prism-tsx.min.js @@ -0,0 +1 @@ +!function(e){var a=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",a),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var t=e.languages.tsx.tag;t.pattern=RegExp("(^|[^\\w$]|(?==]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),e.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),e.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete e.languages.tt2.string,e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"tt2",/\[%[\s\S]+?%\]/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"tt2")}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-turtle.min.js b/docs/js/components/prism-turtle.min.js new file mode 100644 index 000000000000..57856d458c6a --- /dev/null +++ b/docs/js/components/prism-turtle.min.js @@ -0,0 +1 @@ +Prism.languages.turtle={comment:{pattern:/#.*/,greedy:!0},"multiline-string":{pattern:/"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,greedy:!0,alias:"string",inside:{comment:/#.*/}},string:{pattern:/"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,greedy:!0},url:{pattern:/<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,greedy:!0,inside:{punctuation:/[<>]/}},function:{pattern:/(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,inside:{"local-name":{pattern:/([^:]*:)[\s\S]+/,lookbehind:!0},prefix:{pattern:/[\s\S]+/,inside:{punctuation:/:/}}}},number:/[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[{}.,;()[\]]|\^\^/,boolean:/\b(?:false|true)\b/,keyword:[/(?:\ba|@prefix|@base)\b|=/,/\b(?:base|graph|prefix)\b/i],tag:{pattern:/@[a-z]+(?:-[a-z\d]+)*/i,inside:{punctuation:/@/}}},Prism.languages.trig=Prism.languages.turtle; \ No newline at end of file diff --git a/docs/js/components/prism-twig.min.js b/docs/js/components/prism-twig.min.js new file mode 100644 index 000000000000..5ad764529b50 --- /dev/null +++ b/docs/js/components/prism-twig.min.js @@ -0,0 +1 @@ +Prism.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},Prism.hooks.add("before-tokenize",(function(e){"twig"===e.language&&Prism.languages["markup-templating"].buildPlaceholders(e,"twig",/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g)})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"twig")})); \ No newline at end of file diff --git a/docs/js/components/prism-typescript.min.js b/docs/js/components/prism-typescript.min.js new file mode 100644 index 000000000000..b512c1617101 --- /dev/null +++ b/docs/js/components/prism-typescript.min.js @@ -0,0 +1 @@ +!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-typoscript.min.js b/docs/js/components/prism-typoscript.min.js new file mode 100644 index 000000000000..c41b8e82a0f5 --- /dev/null +++ b/docs/js/components/prism-typoscript.min.js @@ -0,0 +1 @@ +!function(E){var n=/\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;E.languages.typoscript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^"'])#.*/,lookbehind:!0,greedy:!0}],function:[{pattern://,inside:{string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,inside:{keyword:n}},keyword:{pattern:/INCLUDE_TYPOSCRIPT/}}},{pattern:/@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,inside:{string:/"[^"\r\n]*"|'[^'\r\n]*'/}}],string:{pattern:/^([^=]*=[< ]?)(?:(?!\]\n).)*/,lookbehind:!0,inside:{function:/\{\$.*\}/,keyword:n,number:/^\d+$/,punctuation:/[,|:]/}},keyword:n,number:{pattern:/\b\d+\s*[.{=]/,inside:{operator:/[.{=]/}},tag:{pattern:/\.?[-\w\\]+\.?/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:|]/,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/},E.languages.tsconfig=E.languages.typoscript}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-unrealscript.min.js b/docs/js/components/prism-unrealscript.min.js new file mode 100644 index 000000000000..3db40a5d9ff1 --- /dev/null +++ b/docs/js/components/prism-unrealscript.min.js @@ -0,0 +1 @@ +Prism.languages.unrealscript={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},category:{pattern:/(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,lookbehind:!0,greedy:!0,alias:"property"},metadata:{pattern:/(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,lookbehind:!0,greedy:!0,inside:{property:/\b\w+(?=\s*=)/,operator:/=/,punctuation:/[<>|]/}},macro:{pattern:/`\w+/,alias:"property"},"class-name":{pattern:/(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,lookbehind:!0},keyword:/\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/>>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,punctuation:/[()[\]{};,.]/},Prism.languages.uc=Prism.languages.uscript=Prism.languages.unrealscript; \ No newline at end of file diff --git a/docs/js/components/prism-uorazor.min.js b/docs/js/components/prism-uorazor.min.js new file mode 100644 index 000000000000..7c047d24f7e1 --- /dev/null +++ b/docs/js/components/prism-uorazor.min.js @@ -0,0 +1 @@ +Prism.languages.uorazor={"comment-hash":{pattern:/#.*/,alias:"comment",greedy:!0},"comment-slash":{pattern:/\/\/.*/,alias:"comment",greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/},greedy:!0},"source-layers":{pattern:/\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,alias:"function"},"source-commands":{pattern:/\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,alias:"function"},"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},function:/\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,keyword:/\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/}; \ No newline at end of file diff --git a/docs/js/components/prism-uri.min.js b/docs/js/components/prism-uri.min.js new file mode 100644 index 000000000000..c6479c05932b --- /dev/null +++ b/docs/js/components/prism-uri.min.js @@ -0,0 +1 @@ +Prism.languages.uri={scheme:{pattern:/^[a-z][a-z0-9+.-]*:/im,greedy:!0,inside:{"scheme-delimiter":/:$/}},fragment:{pattern:/#[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"fragment-delimiter":/^#/}},query:{pattern:/\?[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"query-delimiter":{pattern:/^\?/,greedy:!0},"pair-delimiter":/[&;]/,pair:{pattern:/^[^=][\s\S]*/,inside:{key:/^[^=]+/,value:{pattern:/(^=)[\s\S]+/,lookbehind:!0}}}}},authority:{pattern:RegExp("^//(?:[\\w\\-.~!$&'()*+,;=%:]*@)?(?:\\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\\.[\\w\\-.~!$&'()*+,;=]+)\\]|[\\w\\-.~!$&'()*+,;=%]*)(?::\\d*)?","m"),inside:{"authority-delimiter":/^\/\//,"user-info-segment":{pattern:/^[\w\-.~!$&'()*+,;=%:]*@/,inside:{"user-info-delimiter":/@$/,"user-info":/^[\w\-.~!$&'()*+,;=%:]+/}},"port-segment":{pattern:/:\d*$/,inside:{"port-delimiter":/^:/,port:/^\d+/}},host:{pattern:/[\s\S]+/,inside:{"ip-literal":{pattern:/^\[[\s\S]+\]$/,inside:{"ip-literal-delimiter":/^\[|\]$/,"ipv-future":/^v[\s\S]+/,"ipv6-address":/^[\s\S]+/}},"ipv4-address":/^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/}}}},path:{pattern:/^[\w\-.~!$&'()*+,;=%:@/]+/m,inside:{"path-separator":/\//}}},Prism.languages.url=Prism.languages.uri; \ No newline at end of file diff --git a/docs/js/components/prism-v.min.js b/docs/js/components/prism-v.min.js new file mode 100644 index 000000000000..db0c0f5add4a --- /dev/null +++ b/docs/js/components/prism-v.min.js @@ -0,0 +1 @@ +!function(e){var n={pattern:/[\s\S]+/,inside:null};e.languages.v=e.languages.extend("clike",{string:{pattern:/r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,alias:"quoted-string",greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,lookbehind:!0,inside:{"interpolation-variable":{pattern:/^\$\w[\s\S]*$/,alias:"variable"},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},"interpolation-expression":n}}}},"class-name":{pattern:/(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,lookbehind:!0},keyword:/(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,number:/\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,operator:/~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,builtin:/\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/}),n.inside=e.languages.v,e.languages.insertBefore("v","string",{char:{pattern:/`(?:\\`|\\?[^`]{1,2})`/,alias:"rune"}}),e.languages.insertBefore("v","operator",{attribute:{pattern:/(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,lookbehind:!0,alias:"annotation",inside:{punctuation:/[\[\]]/,keyword:/\w+/}},generic:{pattern:/<\w+>(?=\s*[\)\{])/,inside:{punctuation:/[<>]/,"class-name":/\w+/}}}),e.languages.insertBefore("v","function",{"generic-function":{pattern:/\b\w+\s*<\w+>(?=\()/,inside:{function:/^\w+/,generic:{pattern:/<\w+>/,inside:e.languages.v.generic.inside}}}})}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-vala.min.js b/docs/js/components/prism-vala.min.js new file mode 100644 index 000000000000..d26bfc753aa5 --- /dev/null +++ b/docs/js/components/prism-vala.min.js @@ -0,0 +1 @@ +Prism.languages.vala=Prism.languages.extend("clike",{"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],keyword:/\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,function:/\b\w+(?=\s*\()/,number:/(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,operator:/\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,punctuation:/[{}[\];(),.:]/,constant:/\b[A-Z0-9_]+\b/}),Prism.languages.insertBefore("vala","string",{"raw-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"template-string":{pattern:/@"[\s\S]*?"/,greedy:!0,inside:{interpolation:{pattern:/\$(?:\([^)]*\)|[a-zA-Z]\w*)/,inside:{delimiter:{pattern:/^\$\(?|\)$/,alias:"punctuation"},rest:Prism.languages.vala}},string:/[\s\S]+/}}}),Prism.languages.insertBefore("vala","keyword",{regex:{pattern:/\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\//,"regex-flags":/^[a-z]+$/}}}); \ No newline at end of file diff --git a/docs/js/components/prism-vbnet.min.js b/docs/js/components/prism-vbnet.min.js new file mode 100644 index 000000000000..8a148a86fcac --- /dev/null +++ b/docs/js/components/prism-vbnet.min.js @@ -0,0 +1 @@ +Prism.languages.vbnet=Prism.languages.extend("basic",{comment:[{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},{pattern:/(^|[^\\:])'.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^"])"(?:""|[^"])*"(?!")/,lookbehind:!0,greedy:!0},keyword:/(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,punctuation:/[,;:(){}]/}); \ No newline at end of file diff --git a/docs/js/components/prism-velocity.min.js b/docs/js/components/prism-velocity.min.js new file mode 100644 index 000000000000..5661b8ea51cb --- /dev/null +++ b/docs/js/components/prism-velocity.min.js @@ -0,0 +1 @@ +!function(e){e.languages.velocity=e.languages.extend("markup",{});var n={variable:{pattern:/(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,lookbehind:!0,inside:{}},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},number:/\b\d+\b/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,punctuation:/[(){}[\]:,.]/};n.variable.inside={string:n.string,function:{pattern:/([^\w-])[a-z][\w-]*(?=\()/,lookbehind:!0},number:n.number,boolean:n.boolean,punctuation:n.punctuation},e.languages.insertBefore("velocity","comment",{unparsed:{pattern:/(^|[^\\])#\[\[[\s\S]*?\]\]#/,lookbehind:!0,greedy:!0,inside:{punctuation:/^#\[\[|\]\]#$/}},"velocity-comment":[{pattern:/(^|[^\\])#\*[\s\S]*?\*#/,lookbehind:!0,greedy:!0,alias:"comment"},{pattern:/(^|[^\\])##.*/,lookbehind:!0,greedy:!0,alias:"comment"}],directive:{pattern:/(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,lookbehind:!0,inside:{keyword:{pattern:/^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,inside:{punctuation:/[{}]/}},rest:n}},variable:n.variable}),e.languages.velocity.tag.inside["attr-value"].inside.rest=e.languages.velocity}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-verilog.min.js b/docs/js/components/prism-verilog.min.js new file mode 100644 index 000000000000..f728520ac58c --- /dev/null +++ b/docs/js/components/prism-verilog.min.js @@ -0,0 +1 @@ +Prism.languages.verilog={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"kernel-function":{pattern:/\B\$\w+\b/,alias:"property"},constant:/\B`\w+\b/,function:/\b\w+(?=\()/,keyword:/\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,important:/\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,number:/\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,operator:/[-+{}^~%*\/?=!<>&|]+/,punctuation:/[[\];(),.:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-vhdl.min.js b/docs/js/components/prism-vhdl.min.js new file mode 100644 index 000000000000..17fd67df3dbf --- /dev/null +++ b/docs/js/components/prism-vhdl.min.js @@ -0,0 +1 @@ +Prism.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-vim.min.js b/docs/js/components/prism-vim.min.js new file mode 100644 index 000000000000..65cc261da5e8 --- /dev/null +++ b/docs/js/components/prism-vim.min.js @@ -0,0 +1 @@ +Prism.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,function:/\b\w+(?=\()/,keyword:/\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-visual-basic.min.js b/docs/js/components/prism-visual-basic.min.js new file mode 100644 index 000000000000..d18b6fafe610 --- /dev/null +++ b/docs/js/components/prism-visual-basic.min.js @@ -0,0 +1 @@ +Prism.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,alias:"property",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,alias:"number"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,boolean:/\b(?:False|Nothing|True)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,operator:/[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,punctuation:/[{}().,:?]/},Prism.languages.vb=Prism.languages["visual-basic"],Prism.languages.vba=Prism.languages["visual-basic"]; \ No newline at end of file diff --git a/docs/js/components/prism-warpscript.min.js b/docs/js/components/prism-warpscript.min.js new file mode 100644 index 000000000000..6cece0dae24a --- /dev/null +++ b/docs/js/components/prism-warpscript.min.js @@ -0,0 +1 @@ +Prism.languages.warpscript={comment:/#.*|\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,greedy:!0},variable:/\$\S+/,macro:{pattern:/@\S+/,alias:"property"},keyword:/\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,number:/[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,boolean:/\b(?:F|T|false|true)\b/,punctuation:/<%|%>|[{}[\]()]/,operator:/==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/}; \ No newline at end of file diff --git a/docs/js/components/prism-wasm.min.js b/docs/js/components/prism-wasm.min.js new file mode 100644 index 000000000000..c62a5f4702ae --- /dev/null +++ b/docs/js/components/prism-wasm.min.js @@ -0,0 +1 @@ +Prism.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/}; \ No newline at end of file diff --git a/docs/js/components/prism-web-idl.min.js b/docs/js/components/prism-web-idl.min.js new file mode 100644 index 000000000000..2ea1c79b7307 --- /dev/null +++ b/docs/js/components/prism-web-idl.min.js @@ -0,0 +1 @@ +!function(e){var n="(?:\\B-|\\b_|\\b)[A-Za-z][\\w-]*(?![\\w-])",t="(?:\\b(?:unsigned\\s+)?long\\s+long(?![\\w-])|\\b(?:unrestricted|unsigned)\\s+[a-z]+(?![\\w-])|(?!(?:unrestricted|unsigned)\\b)"+n+"(?:\\s*<(?:[^<>]|<[^<>]*>)*>)?)(?:\\s*\\?)?",i={};for(var r in e.languages["web-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"[^"]*"/,greedy:!0},namespace:{pattern:RegExp("(\\bnamespace\\s+)"+n),lookbehind:!0},"class-name":[{pattern:/(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,lookbehind:!0,inside:i},{pattern:RegExp("(\\b(?:attribute|const|deleter|getter|optional|setter)\\s+)"+t),lookbehind:!0,inside:i},{pattern:RegExp("(\\bcallback\\s+"+n+"\\s*=\\s*)"+t),lookbehind:!0,inside:i},{pattern:RegExp("(\\btypedef\\b\\s*)"+t),lookbehind:!0,inside:i},{pattern:RegExp("(\\b(?:callback|dictionary|enum|interface(?:\\s+mixin)?)\\s+)(?!(?:interface|mixin)\\b)"+n),lookbehind:!0},{pattern:RegExp("(:\\s*)"+n),lookbehind:!0},RegExp(n+"(?=\\s+(?:implements|includes)\\b)"),{pattern:RegExp("(\\b(?:implements|includes)\\s+)"+n),lookbehind:!0},{pattern:RegExp(t+"(?=\\s*(?:\\.{3}\\s*)?"+n+"\\s*[(),;=])"),inside:i}],builtin:/\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,keyword:[/\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,/\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/],boolean:/\b(?:false|true)\b/,number:{pattern:/(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,lookbehind:!0},operator:/\.{3}|[=:?<>-]/,punctuation:/[(){}[\].,;]/},e.languages["web-idl"])"class-name"!==r&&(i[r]=e.languages["web-idl"][r]);e.languages.webidl=e.languages["web-idl"]}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-wgsl.min.js b/docs/js/components/prism-wgsl.min.js new file mode 100644 index 000000000000..d3b7f3cdc5ea --- /dev/null +++ b/docs/js/components/prism-wgsl.min.js @@ -0,0 +1 @@ +Prism.languages.wgsl={comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"builtin-attribute":{pattern:/(@)builtin\(.*?\)/,lookbehind:!0,inside:{attribute:{pattern:/^builtin/,alias:"attr-name"},punctuation:/[(),]/,"built-in-values":{pattern:/\b(?:frag_depth|front_facing|global_invocation_id|instance_index|local_invocation_id|local_invocation_index|num_workgroups|position|sample_index|sample_mask|vertex_index|workgroup_id)\b/,alias:"attr-value"}}},attributes:{pattern:/(@)(?:align|binding|compute|const|fragment|group|id|interpolate|invariant|location|size|vertex|workgroup_size)/i,lookbehind:!0,alias:"attr-name"},functions:{pattern:/\b(fn\s+)[_a-zA-Z]\w*(?=[(<])/,lookbehind:!0,alias:"function"},keyword:/\b(?:bitcast|break|case|const|continue|continuing|default|discard|else|enable|fallthrough|fn|for|function|if|let|loop|private|return|storage|struct|switch|type|uniform|var|while|workgroup)\b/,builtin:/\b(?:abs|acos|acosh|all|any|array|asin|asinh|atan|atan2|atanh|atomic|atomicAdd|atomicAnd|atomicCompareExchangeWeak|atomicExchange|atomicLoad|atomicMax|atomicMin|atomicOr|atomicStore|atomicSub|atomicXor|bool|ceil|clamp|cos|cosh|countLeadingZeros|countOneBits|countTrailingZeros|cross|degrees|determinant|distance|dot|dpdx|dpdxCoarse|dpdxFine|dpdy|dpdyCoarse|dpdyFine|exp|exp2|extractBits|f32|f64|faceForward|firstLeadingBit|floor|fma|fract|frexp|fwidth|fwidthCoarse|fwidthFine|i32|i64|insertBits|inverseSqrt|ldexp|length|log|log2|mat[2-4]x[2-4]|max|min|mix|modf|normalize|override|pack2x16float|pack2x16snorm|pack2x16unorm|pack4x8snorm|pack4x8unorm|pow|ptr|quantizeToF16|radians|reflect|refract|reverseBits|round|sampler|sampler_comparison|select|shiftLeft|shiftRight|sign|sin|sinh|smoothstep|sqrt|staticAssert|step|storageBarrier|tan|tanh|textureDimensions|textureGather|textureGatherCompare|textureLoad|textureNumLayers|textureNumLevels|textureNumSamples|textureSample|textureSampleBias|textureSampleCompare|textureSampleCompareLevel|textureSampleGrad|textureSampleLevel|textureStore|texture_1d|texture_2d|texture_2d_array|texture_3d|texture_cube|texture_cube_array|texture_depth_2d|texture_depth_2d_array|texture_depth_cube|texture_depth_cube_array|texture_depth_multisampled_2d|texture_multisampled_2d|texture_storage_1d|texture_storage_2d|texture_storage_2d_array|texture_storage_3d|transpose|trunc|u32|u64|unpack2x16float|unpack2x16snorm|unpack2x16unorm|unpack4x8snorm|unpack4x8unorm|vec[2-4]|workgroupBarrier)\b/,"function-calls":{pattern:/\b[_a-z]\w*(?=\()/i,alias:"function"},"class-name":/\b(?:[A-Z][A-Za-z0-9]*)\b/,"bool-literal":{pattern:/\b(?:false|true)\b/,alias:"boolean"},"hex-int-literal":{pattern:/\b0[xX][0-9a-fA-F]+[iu]?\b(?![.pP])/,alias:"number"},"hex-float-literal":{pattern:/\b0[xX][0-9a-fA-F]*(?:\.[0-9a-fA-F]*)?(?:[pP][+-]?\d+[fh]?)?/,alias:"number"},"decimal-float-literal":[{pattern:/\d*\.\d+(?:[eE](?:\+|-)?\d+)?[fh]?/,alias:"number"},{pattern:/\d+\.\d*(?:[eE](?:\+|-)?\d+)?[fh]?/,alias:"number"},{pattern:/\d+[eE](?:\+|-)?\d+[fh]?/,alias:"number"},{pattern:/\b\d+[fh]\b/,alias:"number"}],"int-literal":{pattern:/\b\d+[iu]?\b/,alias:"number"},operator:[{pattern:/(?:\^|~|\|(?!\|)|\|\||&&|<<|>>|!)(?!=)/},{pattern:/&(?![&=])/},{pattern:/(?:\+=|-=|\*=|\/=|%=|\^=|&=|\|=|<<=|>>=)/},{pattern:/(^|[^<>=!])=(?![=>])/,lookbehind:!0},{pattern:/(?:==|!=|<=|\+\+|--|(^|[^=])>=)/,lookbehind:!0},{pattern:/(?:(?:[+%]|(?:\*(?!\w)))(?!=))|(?:-(?!>))|(?:\/(?!\/))/},{pattern:/->/}],punctuation:/[@(){}[\],;<>:.]/}; \ No newline at end of file diff --git a/docs/js/components/prism-wiki.min.js b/docs/js/components/prism-wiki.min.js new file mode 100644 index 000000000000..4176b64d335b --- /dev/null +++ b/docs/js/components/prism-wiki.min.js @@ -0,0 +1 @@ +Prism.languages.wiki=Prism.languages.extend("markup",{"block-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,alias:"comment"},heading:{pattern:/^(=+)[^=\r\n].*?\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\1/,inside:{"bold-italic":{pattern:/(''''').+?(?=\1)/,lookbehind:!0,alias:["bold","italic"]},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:"punctuation"},url:[/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,/\[\[.+?\]\]|\[.+?\]/],variable:[/__[A-Z]+__/,/\{{3}.+?\}{3}/,/\{\{.+?\}\}/],symbol:[/^#redirect/im,/~{3,5}/],"table-tag":{pattern:/((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,lookbehind:!0,inside:{"table-bar":{pattern:/\|$/,alias:"punctuation"},rest:Prism.languages.markup.tag.inside}},punctuation:/^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m}),Prism.languages.insertBefore("wiki","tag",{nowiki:{pattern:/<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,inside:Prism.languages.markup.tag.inside}}}}); \ No newline at end of file diff --git a/docs/js/components/prism-wolfram.min.js b/docs/js/components/prism-wolfram.min.js new file mode 100644 index 000000000000..57db919dd3e5 --- /dev/null +++ b/docs/js/components/prism-wolfram.min.js @@ -0,0 +1 @@ +Prism.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.mathematica=Prism.languages.wolfram,Prism.languages.wl=Prism.languages.wolfram,Prism.languages.nb=Prism.languages.wolfram; \ No newline at end of file diff --git a/docs/js/components/prism-wren.min.js b/docs/js/components/prism-wren.min.js new file mode 100644 index 000000000000..c0cf6ef127c2 --- /dev/null +++ b/docs/js/components/prism-wren.min.js @@ -0,0 +1 @@ +Prism.languages.wren={comment:[{pattern:/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"string-literal":null,hashbang:{pattern:/^#!\/.+/,greedy:!0,alias:"comment"},attribute:{pattern:/#!?[ \t\u3000]*\w+/,alias:"keyword"},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},/\b[A-Z][a-z\d_]*\b/],constant:/\b[A-Z][A-Z\d_]*\b/,null:{pattern:/\bnull\b/,alias:"keyword"},keyword:/\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,function:/\b[a-z_]\w*(?=\s*[({])/i,operator:/<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,punctuation:/[\[\](){}.,;]/},Prism.languages.wren["string-literal"]={pattern:/(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,lookbehind:!0,inside:{expression:{pattern:/^(%\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:Prism.languages.wren},"interpolation-punctuation":{pattern:/^%\(|\)$/,alias:"punctuation"}}},string:/[\s\S]+/}}; \ No newline at end of file diff --git a/docs/js/components/prism-xeora.min.js b/docs/js/components/prism-xeora.min.js new file mode 100644 index 000000000000..24424caa552c --- /dev/null +++ b/docs/js/components/prism-xeora.min.js @@ -0,0 +1 @@ +!function(n){n.languages.xeora=n.languages.extend("markup",{constant:{pattern:/\$(?:DomainContents|PageRenderDuration)\$/,inside:{punctuation:{pattern:/\$/}}},variable:{pattern:/\$@?(?:#+|[-+*~=^])?[\w.]+\$/,inside:{punctuation:{pattern:/[$.]/},operator:{pattern:/#+|[-+*~=^@]/}}},"function-inline":{pattern:/\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,inside:{variable:{pattern:/(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,inside:{punctuation:{pattern:/[,.|]/},operator:{pattern:/#+|[-+*~=^@]/}}},punctuation:{pattern:/\$\w:|[$:?.,|]/}},alias:"function"},"function-block":{pattern:/\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,inside:{punctuation:{pattern:/[$:{}?.,|]/}},alias:"function"},"directive-inline":{pattern:/\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}}},alias:"function"},"directive-block-open":{pattern:/\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}},attribute:{pattern:/![A-Z]+$/,inside:{punctuation:{pattern:/!/}},alias:"keyword"}},alias:"function"},"directive-block-separator":{pattern:/\}:[-\w.]+:\{/,inside:{punctuation:{pattern:/[:{}]/}},alias:"function"},"directive-block-close":{pattern:/\}:[-\w.]+\$/,inside:{punctuation:{pattern:/[:{}$]/}},alias:"function"}}),n.languages.insertBefore("inside","punctuation",{variable:n.languages.xeora["function-inline"].inside.variable},n.languages.xeora["function-block"]),n.languages.xeoracube=n.languages.xeora}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-xml-doc.min.js b/docs/js/components/prism-xml-doc.min.js new file mode 100644 index 000000000000..85074eb3787a --- /dev/null +++ b/docs/js/components/prism-xml-doc.min.js @@ -0,0 +1 @@ +!function(a){function e(e,n){a.languages[e]&&a.languages.insertBefore(e,"comment",{"doc-comment":n})}var n=a.languages.markup.tag,t={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:n}},g={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:n}};e("csharp",t),e("fsharp",t),e("vbnet",g)}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-xojo.min.js b/docs/js/components/prism-xojo.min.js new file mode 100644 index 000000000000..015aed5b78c8 --- /dev/null +++ b/docs/js/components/prism-xojo.min.js @@ -0,0 +1 @@ +Prism.languages.xojo={comment:{pattern:/(?:'|\/\/|Rem\b).+/i,greedy:!0},string:{pattern:/"(?:""|[^"])*"/,greedy:!0},number:[/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,/&[bchou][a-z\d]+/i],directive:{pattern:/#(?:Else|ElseIf|Endif|If|Pragma)\b/i,alias:"property"},keyword:/\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,operator:/<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,punctuation:/[.,;:()]/}; \ No newline at end of file diff --git a/docs/js/components/prism-xquery.min.js b/docs/js/components/prism-xquery.min.js new file mode 100644 index 000000000000..f206e0c990b0 --- /dev/null +++ b/docs/js/components/prism-xquery.min.js @@ -0,0 +1 @@ +!function(e){e.languages.xquery=e.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),e.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,e.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,e.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,e.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:e.languages.xquery,alias:"language-xquery"};var t=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join("")},n=function(a){for(var o=[],i=0;i0&&o[o.length-1].tagName===t(r.content[0].content[1])&&o.pop():"/>"===r.content[r.content.length-1].content||o.push({tagName:t(r.content[0].content[1]),openedBraces:0}):!(o.length>0&&"punctuation"===r.type&&"{"===r.content)||a[i+1]&&"punctuation"===a[i+1].type&&"{"===a[i+1].content||a[i-1]&&"plain-text"===a[i-1].type&&"{"===a[i-1].content?o.length>0&&o[o.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?o[o.length-1].openedBraces--:"comment"!==r.type&&(s=!0):o[o.length-1].openedBraces++),(s||"string"==typeof r)&&o.length>0&&0===o[o.length-1].openedBraces){var l=t(r);i0&&("string"==typeof a[i-1]||"plain-text"===a[i-1].type)&&(l=t(a[i-1])+l,a.splice(i-1,1),i--),/^\s+$/.test(l)?a[i]=l:a[i]=new e.Token("plain-text",l,null,l)}r.content&&"string"!=typeof r.content&&n(r.content)}};e.hooks.add("after-tokenize",(function(e){"xquery"===e.language&&n(e.tokens)}))}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-yaml.min.js b/docs/js/components/prism-yaml.min.js new file mode 100644 index 000000000000..5cd16d3d7fc2 --- /dev/null +++ b/docs/js/components/prism-yaml.min.js @@ -0,0 +1 @@ +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); \ No newline at end of file diff --git a/docs/js/components/prism-yang.min.js b/docs/js/components/prism-yang.min.js new file mode 100644 index 000000000000..8297cfab8a1c --- /dev/null +++ b/docs/js/components/prism-yang.min.js @@ -0,0 +1 @@ +Prism.languages.yang={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"(?:[^\\"]|\\.)*"|'[^']*'/,greedy:!0},keyword:{pattern:/(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,lookbehind:!0},namespace:{pattern:/(\s)[a-z_][\w.-]*(?=:)/i,lookbehind:!0},boolean:/\b(?:false|true)\b/,operator:/\+/,punctuation:/[{};:]/}; \ No newline at end of file diff --git a/docs/js/components/prism-zig.min.js b/docs/js/components/prism-zig.min.js new file mode 100644 index 000000000000..26316b46044a --- /dev/null +++ b/docs/js/components/prism-zig.min.js @@ -0,0 +1 @@ +!function(e){function n(e){return function(){return e}}var r=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,a="\\b(?!"+r.source+")(?!\\d)\\w+\\b",o="align\\s*\\((?:[^()]|\\([^()]*\\))*\\)",s="(?!\\s)(?:!?\\s*(?:"+"(?:\\?|\\bpromise->|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)".replace(//g,n(o))+"\\s*)*"+"(?:\\bpromise\\b|(?:\\berror\\.)?(?:\\.)*(?!\\s+))".replace(//g,n(a))+")+";e.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp("(:\\s*)(?=\\s*(?:\\s*)?[=;,)])|(?=\\s*(?:\\s*)?\\{)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null},{pattern:RegExp("(\\)\\s*)(?=\\s*(?:\\s*)?;)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:r,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},e.languages.zig["class-name"].forEach((function(n){null===n.inside&&(n.inside=e.languages.zig)}))}(Prism); \ No newline at end of file diff --git a/docs/mstile-150x150.png b/docs/mstile-150x150.png new file mode 100644 index 000000000000..10c8ab212d15 Binary files /dev/null and b/docs/mstile-150x150.png differ diff --git a/docs/safari-pinned-tab.svg b/docs/safari-pinned-tab.svg new file mode 100644 index 000000000000..dacecafdfc86 --- /dev/null +++ b/docs/safari-pinned-tab.svg @@ -0,0 +1,32 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + diff --git a/docs/scss/style.css.map b/docs/scss/style.css.map new file mode 100644 index 000000000000..60b1f21cd9da --- /dev/null +++ b/docs/scss/style.css.map @@ -0,0 +1,299 @@ +{ + "version": 3, + "file": "style.css", + "sourceRoot": "/home/runner/work/FastGPT/FastGPT/docSite", + "sources": [ + "assets/docs/scss/style.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/plugins/icons/_google-material.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_functions.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_variables.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/colors/_blue.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_mixins.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/gohugoio/hugo-mod-bootstrap-scss/v5@v5.20300.20200/assets/scss/bootstrap/_vendor/_rfs.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_deprecate.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_breakpoints.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_color-mode.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_color-scheme.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_image.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_resize.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_visually-hidden.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_reset-text.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_text-truncate.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_utilities.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_backdrop.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_buttons.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_caret.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_pagination.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_lists.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_forms.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_table-variants.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_border-radius.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_box-shadow.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_gradients.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_transition.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_clearfix.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_container.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_grid.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/bootstrap.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_banner.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_functions.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_variables.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_variables-dark.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_maps.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_mixins.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/gohugoio/hugo-mod-bootstrap-scss/v5@v5.20300.20200/assets/scss/bootstrap/_vendor/_rfs.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_deprecate.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_breakpoints.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_color-mode.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_color-scheme.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_image.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_resize.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_visually-hidden.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_reset-text.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_text-truncate.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_utilities.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_backdrop.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_buttons.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_caret.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_pagination.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_lists.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_forms.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_table-variants.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_border-radius.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_box-shadow.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_gradients.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_transition.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_clearfix.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_container.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/mixins/_grid.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_utilities.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_root.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_reboot.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_type.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_images.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_containers.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_grid.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_tables.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_forms.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/forms/_labels.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/forms/_form-text.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/forms/_form-control.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/forms/_form-select.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/forms/_form-check.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/forms/_form-range.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/forms/_floating-labels.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/forms/_input-group.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/forms/_validation.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_buttons.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_transitions.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_dropdown.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_button-group.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_nav.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_navbar.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_card.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_accordion.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_breadcrumb.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_pagination.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_badge.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_alert.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_progress.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_list-group.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_close.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_toasts.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_modal.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_tooltip.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_popover.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_carousel.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_spinners.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_offcanvas.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_placeholders.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/_helpers.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_clearfix.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_color-bg.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_colored-links.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_focus-ring.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_icon-link.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_ratio.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_position.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_stacks.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_visually-hidden.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_stretched-link.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_text-truncation.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/helpers/_vr.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.2+incompatible/scss/utilities/_api.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/_variables.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/plugins/docsearch/_style.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/structure/_general.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/structure/_content.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/structure/_sidebar.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/structure/_doc-nav.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/structure/_toc.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/structure/_footer.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_buttons.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_modal.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_breadcrumb.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_badge.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_backgrounds.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_alerts.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_card.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_forms.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_table.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_tabs.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/components/_tooltip.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/pages/_features.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/pages/_helper.scss", + "assets/docs/scss/custom/plugins/prism/themes/_lotusdocs.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/plugins/prism/_prism.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/plugins/flexsearch/_flexsearch.scss", + "../../../../../../tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/colinwilson/lotusdocs@v0.1.0/assets/docs/scss/custom/plugins/mermaid/_mermaid.scss", + "assets/docs/scss/custom/pages/_custom.scss" + ], + "sourcesContent": [ + "/* Template Name: Lotus Docs\n Author: Colin Wilson\n E-mail: colin@aigis.uk\n Created: October 2022\n Version: 1.2.0\n File Description: Main CSS file for Lotus Docs\n*/\n\n// Custom Font Variables\n$font-family-secondary: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Ubuntu';\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Ubuntu';\n$font-family-monospace: JetBrains Mono;\n\n// Code Padding Variables\n$code-block-padding-top: 0;\n\n// Icon Fonts\n@import \"custom/plugins/icons/google-material\";\n\n// Core files\n@import \"../../scss/bootstrap/functions\";\n@import \"../../scss/bootstrap/variables\";\n@import 'custom/colors/blue'; // current theme color\n@import \"../../scss/bootstrap/mixins\";\n@import \"../../scss/bootstrap/bootstrap\";\n@import \"variables\";\n\n@import \"custom/plugins/docsearch/style\";\n\n\n// Structure\n@import \"custom/structure/general\";\n@import \"custom/structure/content\";\n@import \"custom/structure/sidebar\";\n@import \"custom/structure/doc-nav\";\n@import \"custom/structure/toc\";\n@import \"custom/structure/footer\";\n\n// Components\n@import \"custom/components/buttons\";\n@import \"custom/components/modal\";\n@import \"custom/components/breadcrumb\";\n@import \"custom/components/badge\";\n@import \"custom/components/backgrounds\";\n@import \"custom/components/alerts\";\n@import \"custom/components/card\";\n@import \"custom/components/forms\";\n@import \"custom/components/table\";\n@import \"custom/components/tabs\";\n@import \"custom/components/tooltip\";\n\n// Pages\n@import \"custom/pages/features\";\n@import \"custom/pages/helper\";\n\n// Plugins\n\n// Prism / Chroma\n@import 'custom/plugins/prism/themes/lotusdocs'; // current prism theme\n@import \"custom/plugins/prism/prism\";// FlexSearch\n@import \"custom/plugins/flexsearch/flexsearch\";\n\n// Feedback Widget\n\n\n// Mermaid\n@import \"custom/plugins/mermaid/mermaid\";\n\n// change\n@import \"custom/pages/custom\";", + "// Google Material Icon Font via\n// https://github.com/marella/material-symbols/tree/main/material-symbols\n\n@font-face {\n font-family: 'Material Symbols Outlined';\n font-weight: 400 700;\n font-display: block;\n font-style: normal;\n src: local('Material Symbols Outlined'), local('Material Icons'), local('MaterialIcons-Outlined'),\n url('../fonts/material-symbols-outlined.woff2') format('woff2'), /* Super Modern Browsers */\n // url('../fonts/material-symbols-outlined.woff') format('woff'); /* Modern Browsers */\n }", + "// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" or unit($prev-num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n @if length($map) > 0 {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n }\n}\n\n// Colors\n@function to-rgb($value) {\n @return red($value), green($value), blue($value);\n}\n\n// stylelint-disable scss/dollar-variable-pattern\n@function rgba-css-var($identifier, $target) {\n @if $identifier == \"body\" and $target == \"bg\" {\n @return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity));\n } @if $identifier == \"body\" and $target == \"text\" {\n @return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity));\n } @else {\n @return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity));\n }\n}\n\n@function map-loop($map, $func, $args...) {\n $_map: ();\n\n @each $key, $value in $map {\n // allow to pass the $key and $value of the map as an function argument\n $_args: ();\n @each $arg in $args {\n $_args: append($_args, if($arg == \"$key\", $key, if($arg == \"$value\", $value, $arg)));\n }\n\n $_map: map-merge($_map, ($key: call(get-function($func), $_args...)));\n }\n\n @return $_map;\n}\n// stylelint-enable scss/dollar-variable-pattern\n\n@function varify($list) {\n $result: null;\n @each $entry in $list {\n $result: append($result, var(--#{$prefix}#{$entry}), space);\n }\n @return $result;\n}\n\n// Internal Bootstrap function to turn maps into its negative variant.\n// It prefixes the keys with `n` and makes the value negative.\n@function negativify-map($map) {\n $result: ();\n @each $key, $value in $map {\n @if $key != 0 {\n $result: map-merge($result, (\"n\" + $key: (-$value)));\n }\n }\n @return $result;\n}\n\n// Get multiple keys from a sass map\n@function map-get-multiple($map, $values) {\n $result: ();\n @each $key, $value in $map {\n @if (index($values, $key) != null) {\n $result: map-merge($result, ($key: $value));\n }\n }\n @return $result;\n}\n\n// Merge multiple maps\n@function map-merge-multiple($maps...) {\n $merged-maps: ();\n\n @each $map in $maps {\n $merged-maps: map-merge($merged-maps, $map);\n }\n @return $merged-maps;\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Kitty Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// See https://codepen.io/kevinweber/pen/dXWoRw\n//\n// Requires the use of quotes around data URIs.\n\n@function escape-svg($string) {\n @if str-index($string, \"data:image/svg+xml\") {\n @each $char, $encoded in $escaped-characters {\n // Do not escape the url brackets\n @if str-index($string, \"url(\") == 1 {\n $string: url(\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\");\n } @else {\n $string: str-replace($string, $char, $encoded);\n }\n }\n }\n\n @return $string;\n}\n\n// Color contrast\n// See https://github.com/twbs/bootstrap/pull/30168\n\n// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255)\n// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern\n$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;\n\n@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {\n $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;\n $max-ratio: 0;\n $max-ratio-color: null;\n\n @each $color in $foregrounds {\n $contrast-ratio: contrast-ratio($background, $color);\n @if $contrast-ratio > $min-contrast-ratio {\n @return $color;\n } @else if $contrast-ratio > $max-ratio {\n $max-ratio: $contrast-ratio;\n $max-ratio-color: $color;\n }\n }\n\n @warn \"Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...\";\n\n @return $max-ratio-color;\n}\n\n@function contrast-ratio($background, $foreground: $color-contrast-light) {\n $l1: luminance($background);\n $l2: luminance(opaque($background, $foreground));\n\n @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05));\n}\n\n// Return WCAG2.1 relative luminance\n// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance\n// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio\n@function luminance($color) {\n $rgb: (\n \"r\": red($color),\n \"g\": green($color),\n \"b\": blue($color)\n );\n\n @each $name, $value in $rgb {\n $value: if(divide($value, 255) < .04045, divide(divide($value, 255), 12.92), nth($_luminance-list, $value + 1));\n $rgb: map-merge($rgb, ($name: $value));\n }\n\n @return (map-get($rgb, \"r\") * .2126) + (map-get($rgb, \"g\") * .7152) + (map-get($rgb, \"b\") * .0722);\n}\n\n// Return opaque color\n// opaque(#fff, rgba(0, 0, 0, .5)) => #808080\n@function opaque($background, $foreground) {\n @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%);\n}\n\n// scss-docs-start color-functions\n// Tint a color: mix a color with white\n@function tint-color($color, $weight) {\n @return mix(white, $color, $weight);\n}\n\n// Shade a color: mix a color with black\n@function shade-color($color, $weight) {\n @return mix(black, $color, $weight);\n}\n\n// Shade the color if the weight is positive, else tint it\n@function shift-color($color, $weight) {\n @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));\n}\n// scss-docs-end color-functions\n\n// Return valid calc\n@function add($value1, $value2, $return-calc: true) {\n @if $value1 == null {\n @return $value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 + $value2;\n }\n\n @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\" + \") + $value2);\n}\n\n@function subtract($value1, $value2, $return-calc: true) {\n @if $value1 == null and $value2 == null {\n @return null;\n }\n\n @if $value1 == null {\n @return -$value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 - $value2;\n }\n\n @if type-of($value2) != number {\n $value2: unquote(\"(\") + $value2 + unquote(\")\");\n }\n\n @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\" - \") + $value2);\n}\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n", + "// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: 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\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n", + "// blue (default)\n:root {\n --primary: var(--blue);\n --primary-50: var(--blue-50);\n --primary-100: var(--blue-100);\n --primary-200: var(--blue-200);\n --primary-300: var(--blue-300);\n --primary-400: var(--blue-400);\n --primary-800: var(--blue-800);\n\n --primary-hsl: var(--blue-500-hsl);\n --primary-50-hsl: var(--blue-50-hsl);\n --primary-100-hsl: var(--blue-100-hsl);\n --primary-200-hsl: var(--blue-200-hsl);\n --primary-300-hsl: var(--blue-300-hsl);\n --primary-800-hsl: var(--blue-800-hsl);\n}", + "// Toggles\n//\n// Used in conjunction with global variables to enable certain theme features.\n\n// Vendor\n@import \"vendor/rfs\";\n\n// Deprecate\n@import \"mixins/deprecate\";\n\n// Helpers\n@import \"mixins/breakpoints\";\n@import \"mixins/color-mode\";\n@import \"mixins/color-scheme\";\n@import \"mixins/image\";\n@import \"mixins/resize\";\n@import \"mixins/visually-hidden\";\n@import \"mixins/reset-text\";\n@import \"mixins/text-truncate\";\n\n// Utilities\n@import \"mixins/utilities\";\n\n// Components\n@import \"mixins/backdrop\";\n@import \"mixins/buttons\";\n@import \"mixins/caret\";\n@import \"mixins/pagination\";\n@import \"mixins/lists\";\n@import \"mixins/forms\";\n@import \"mixins/table-variants\";\n\n// Skins\n@import \"mixins/border-radius\";\n@import \"mixins/box-shadow\";\n@import \"mixins/gradients\";\n@import \"mixins/transition\";\n\n// Layout\n@import \"mixins/clearfix\";\n@import \"mixins/container\";\n@import \"mixins/grid\";\n", + "// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}", + "// Deprecate mixin\n//\n// This mixin can be used to deprecate mixins or functions.\n// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to\n// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)\n@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {\n @if ($enable-deprecation-messages != false and $ignore-warning != true) {\n @warn \"#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.\";\n }\n}\n", + "// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n", + "// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n", + "// scss-docs-start mixin-color-scheme\n@mixin color-scheme($name) {\n @media (prefers-color-scheme: #{$name}) {\n @content;\n }\n}\n// scss-docs-end mixin-color-scheme\n", + "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n", + "// Resize anything\n\n@mixin resizable($direction) {\n overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n resize: $direction; // Options: horizontal, vertical, both\n}\n", + "// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n\n // Fix for positioned table caption that could become anonymous cells\n &:not(caption) {\n position: absolute !important;\n }\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n", + "@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n}\n", + "// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n", + "// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n", + "// Shared between modals and offcanvases\n@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex;\n width: 100vw;\n height: 100vh;\n background-color: $backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $backdrop-opacity; }\n}\n", + "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-bg: #{$background};\n --#{$prefix}btn-border-color: #{$border};\n --#{$prefix}btn-hover-color: #{$hover-color};\n --#{$prefix}btn-hover-bg: #{$hover-background};\n --#{$prefix}btn-hover-border-color: #{$hover-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$disabled-color};\n --#{$prefix}btn-disabled-bg: #{$disabled-background};\n --#{$prefix}btn-disabled-border-color: #{$disabled-border};\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-border-color: #{$color};\n --#{$prefix}btn-hover-color: #{$color-hover};\n --#{$prefix}btn-hover-bg: #{$active-background};\n --#{$prefix}btn-hover-border-color: #{$active-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$color};\n --#{$prefix}btn-disabled-bg: transparent;\n --#{$prefix}btn-disabled-border-color: #{$color};\n --#{$prefix}gradient: none;\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}btn-padding-y: #{$padding-y};\n --#{$prefix}btn-padding-x: #{$padding-x};\n @include rfs($font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-border-radius: #{$border-radius};\n}\n// scss-docs-end btn-size-mixin\n", + "// scss-docs-start caret-mixins\n@mixin caret-down($width: $caret-width) {\n border-top: $width solid;\n border-right: $width solid transparent;\n border-bottom: 0;\n border-left: $width solid transparent;\n}\n\n@mixin caret-up($width: $caret-width) {\n border-top: 0;\n border-right: $width solid transparent;\n border-bottom: $width solid;\n border-left: $width solid transparent;\n}\n\n@mixin caret-end($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: 0;\n border-bottom: $width solid transparent;\n border-left: $width solid;\n}\n\n@mixin caret-start($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: $width solid;\n border-bottom: $width solid transparent;\n}\n\n@mixin caret(\n $direction: down,\n $width: $caret-width,\n $spacing: $caret-spacing,\n $vertical-align: $caret-vertical-align\n) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down($width);\n } @else if $direction == up {\n @include caret-up($width);\n } @else if $direction == end {\n @include caret-end($width);\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @include caret-start($width);\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n", + "// Pagination\n\n// scss-docs-start pagination-mixin\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}pagination-padding-x: #{$padding-x};\n --#{$prefix}pagination-padding-y: #{$padding-y};\n @include rfs($font-size, --#{$prefix}pagination-font-size);\n --#{$prefix}pagination-border-radius: #{$border-radius};\n}\n// scss-docs-end pagination-mixin\n", + "// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n", + "// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n\n// scss-docs-start form-validation-mixins\n@mixin form-validation-state-selector($state) {\n @if ($state == \"valid\" or $state == \"invalid\") {\n .was-validated #{if(&, \"&\", \"\")}:#{$state},\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n } @else {\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n }\n}\n\n@mixin form-validation-state(\n $state,\n $color,\n $icon,\n $tooltip-color: color-contrast($color),\n $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\n $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity),\n $border-color: $color\n) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-style: $form-feedback-font-style;\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: $tooltip-color;\n background-color: $tooltip-bg-color;\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n @include form-validation-state-selector($state) {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n\n .form-control {\n @include form-validation-state-selector($state) {\n border-color: $border-color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: escape-svg($icon);\n background-repeat: no-repeat;\n background-position: right $input-height-inner-quarter center;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $border-color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .form-select {\n @include form-validation-state-selector($state) {\n border-color: $border-color;\n\n @if $enable-validation-icons {\n &:not([multiple]):not([size]),\n &:not([multiple])[size=\"1\"] {\n --#{$prefix}form-select-bg-icon: #{escape-svg($icon)};\n padding-right: $form-select-feedback-icon-padding-end;\n background-position: $form-select-bg-position, $form-select-feedback-icon-position;\n background-size: $form-select-bg-size, $form-select-feedback-icon-size;\n }\n }\n\n &:focus {\n border-color: $border-color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n .form-control-color {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n width: add($form-color-width, $input-height-inner);\n }\n }\n }\n\n .form-check-input {\n @include form-validation-state-selector($state) {\n border-color: $border-color;\n\n &:checked {\n background-color: $color;\n }\n\n &:focus {\n box-shadow: $focus-box-shadow;\n }\n\n ~ .form-check-label {\n color: $color;\n }\n }\n }\n .form-check-inline .form-check-input {\n ~ .#{$state}-feedback {\n margin-left: .5em;\n }\n }\n\n .input-group {\n > .form-control:not(:focus),\n > .form-select:not(:focus),\n > .form-floating:not(:focus-within) {\n @include form-validation-state-selector($state) {\n @if $state == \"valid\" {\n z-index: 3;\n } @else if $state == \"invalid\" {\n z-index: 4;\n }\n }\n }\n }\n}\n// scss-docs-end form-validation-mixins\n", + "// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n $table-border-color: mix($color, $background, percentage($table-border-factor));\n\n --#{$prefix}table-color: #{$color};\n --#{$prefix}table-bg: #{$background};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-striped-bg: #{$striped-bg};\n --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$prefix}table-active-bg: #{$active-bg};\n --#{$prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$prefix}table-hover-bg: #{$hover-bg};\n --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: var(--#{$prefix}table-color);\n border-color: var(--#{$prefix}table-border-color);\n }\n}\n// scss-docs-end table-variant\n", + "// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n", + "@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @each $value in $shadow {\n @if $value != null {\n $result: append($result, $value, \"comma\");\n }\n @if $value == none and length($shadow) > 1 {\n @warn \"The keyword 'none' must be used as a single argument.\";\n }\n }\n\n @if (length($result) > 0) {\n box-shadow: $result;\n }\n }\n}\n", + "// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n", + "// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n", + "// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n", + "// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n", + "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n", + "@import \"mixins/banner\";\n@include bsBanner(\"\");\n\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"variables-dark\";\n@import \"maps\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n", + "@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n", + "// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" or unit($prev-num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n @if length($map) > 0 {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n }\n}\n\n// Colors\n@function to-rgb($value) {\n @return red($value), green($value), blue($value);\n}\n\n// stylelint-disable scss/dollar-variable-pattern\n@function rgba-css-var($identifier, $target) {\n @if $identifier == \"body\" and $target == \"bg\" {\n @return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity));\n } @if $identifier == \"body\" and $target == \"text\" {\n @return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity));\n } @else {\n @return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity));\n }\n}\n\n@function map-loop($map, $func, $args...) {\n $_map: ();\n\n @each $key, $value in $map {\n // allow to pass the $key and $value of the map as an function argument\n $_args: ();\n @each $arg in $args {\n $_args: append($_args, if($arg == \"$key\", $key, if($arg == \"$value\", $value, $arg)));\n }\n\n $_map: map-merge($_map, ($key: call(get-function($func), $_args...)));\n }\n\n @return $_map;\n}\n// stylelint-enable scss/dollar-variable-pattern\n\n@function varify($list) {\n $result: null;\n @each $entry in $list {\n $result: append($result, var(--#{$prefix}#{$entry}), space);\n }\n @return $result;\n}\n\n// Internal Bootstrap function to turn maps into its negative variant.\n// It prefixes the keys with `n` and makes the value negative.\n@function negativify-map($map) {\n $result: ();\n @each $key, $value in $map {\n @if $key != 0 {\n $result: map-merge($result, (\"n\" + $key: (-$value)));\n }\n }\n @return $result;\n}\n\n// Get multiple keys from a sass map\n@function map-get-multiple($map, $values) {\n $result: ();\n @each $key, $value in $map {\n @if (index($values, $key) != null) {\n $result: map-merge($result, ($key: $value));\n }\n }\n @return $result;\n}\n\n// Merge multiple maps\n@function map-merge-multiple($maps...) {\n $merged-maps: ();\n\n @each $map in $maps {\n $merged-maps: map-merge($merged-maps, $map);\n }\n @return $merged-maps;\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Kitty Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// See https://codepen.io/kevinweber/pen/dXWoRw\n//\n// Requires the use of quotes around data URIs.\n\n@function escape-svg($string) {\n @if str-index($string, \"data:image/svg+xml\") {\n @each $char, $encoded in $escaped-characters {\n // Do not escape the url brackets\n @if str-index($string, \"url(\") == 1 {\n $string: url(\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\");\n } @else {\n $string: str-replace($string, $char, $encoded);\n }\n }\n }\n\n @return $string;\n}\n\n// Color contrast\n// See https://github.com/twbs/bootstrap/pull/30168\n\n// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255)\n// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern\n$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;\n\n@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {\n $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;\n $max-ratio: 0;\n $max-ratio-color: null;\n\n @each $color in $foregrounds {\n $contrast-ratio: contrast-ratio($background, $color);\n @if $contrast-ratio > $min-contrast-ratio {\n @return $color;\n } @else if $contrast-ratio > $max-ratio {\n $max-ratio: $contrast-ratio;\n $max-ratio-color: $color;\n }\n }\n\n @warn \"Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...\";\n\n @return $max-ratio-color;\n}\n\n@function contrast-ratio($background, $foreground: $color-contrast-light) {\n $l1: luminance($background);\n $l2: luminance(opaque($background, $foreground));\n\n @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05));\n}\n\n// Return WCAG2.1 relative luminance\n// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance\n// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio\n@function luminance($color) {\n $rgb: (\n \"r\": red($color),\n \"g\": green($color),\n \"b\": blue($color)\n );\n\n @each $name, $value in $rgb {\n $value: if(divide($value, 255) < .04045, divide(divide($value, 255), 12.92), nth($_luminance-list, $value + 1));\n $rgb: map-merge($rgb, ($name: $value));\n }\n\n @return (map-get($rgb, \"r\") * .2126) + (map-get($rgb, \"g\") * .7152) + (map-get($rgb, \"b\") * .0722);\n}\n\n// Return opaque color\n// opaque(#fff, rgba(0, 0, 0, .5)) => #808080\n@function opaque($background, $foreground) {\n @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%);\n}\n\n// scss-docs-start color-functions\n// Tint a color: mix a color with white\n@function tint-color($color, $weight) {\n @return mix(white, $color, $weight);\n}\n\n// Shade a color: mix a color with black\n@function shade-color($color, $weight) {\n @return mix(black, $color, $weight);\n}\n\n// Shade the color if the weight is positive, else tint it\n@function shift-color($color, $weight) {\n @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));\n}\n// scss-docs-end color-functions\n\n// Return valid calc\n@function add($value1, $value2, $return-calc: true) {\n @if $value1 == null {\n @return $value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 + $value2;\n }\n\n @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\" + \") + $value2);\n}\n\n@function subtract($value1, $value2, $return-calc: true) {\n @if $value1 == null and $value2 == null {\n @return null;\n }\n\n @if $value1 == null {\n @return -$value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 - $value2;\n }\n\n @if type-of($value2) != number {\n $value2: unquote(\"(\") + $value2 + unquote(\")\");\n }\n\n @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\" - \") + $value2);\n}\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n", + "// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: 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\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n", + "// Dark color mode variables\n//\n// Custom variables for the `[data-bs-theme=\"dark\"]` theme. Use this as a starting point for your own custom color modes by creating a new theme-specific file like `_variables-dark.scss` and adding the variables you need.\n\n//\n// Global colors\n//\n\n// scss-docs-start sass-dark-mode-vars\n// scss-docs-start theme-text-dark-variables\n$primary-text-emphasis-dark: tint-color($primary, 40%) !default;\n$secondary-text-emphasis-dark: tint-color($secondary, 40%) !default;\n$success-text-emphasis-dark: tint-color($success, 40%) !default;\n$info-text-emphasis-dark: tint-color($info, 40%) !default;\n$warning-text-emphasis-dark: tint-color($warning, 40%) !default;\n$danger-text-emphasis-dark: tint-color($danger, 40%) !default;\n$light-text-emphasis-dark: $gray-100 !default;\n$dark-text-emphasis-dark: $gray-300 !default;\n// scss-docs-end theme-text-dark-variables\n\n// scss-docs-start theme-bg-subtle-dark-variables\n$primary-bg-subtle-dark: shade-color($primary, 80%) !default;\n$secondary-bg-subtle-dark: shade-color($secondary, 80%) !default;\n$success-bg-subtle-dark: shade-color($success, 80%) !default;\n$info-bg-subtle-dark: shade-color($info, 80%) !default;\n$warning-bg-subtle-dark: shade-color($warning, 80%) !default;\n$danger-bg-subtle-dark: shade-color($danger, 80%) !default;\n$light-bg-subtle-dark: $gray-800 !default;\n$dark-bg-subtle-dark: mix($gray-800, $black) !default;\n// scss-docs-end theme-bg-subtle-dark-variables\n\n// scss-docs-start theme-border-subtle-dark-variables\n$primary-border-subtle-dark: shade-color($primary, 40%) !default;\n$secondary-border-subtle-dark: shade-color($secondary, 40%) !default;\n$success-border-subtle-dark: shade-color($success, 40%) !default;\n$info-border-subtle-dark: shade-color($info, 40%) !default;\n$warning-border-subtle-dark: shade-color($warning, 40%) !default;\n$danger-border-subtle-dark: shade-color($danger, 40%) !default;\n$light-border-subtle-dark: $gray-700 !default;\n$dark-border-subtle-dark: $gray-800 !default;\n// scss-docs-end theme-border-subtle-dark-variables\n\n$body-color-dark: $gray-300 !default;\n$body-bg-dark: $gray-900 !default;\n$body-secondary-color-dark: rgba($body-color-dark, .75) !default;\n$body-secondary-bg-dark: $gray-800 !default;\n$body-tertiary-color-dark: rgba($body-color-dark, .5) !default;\n$body-tertiary-bg-dark: mix($gray-800, $gray-900, 50%) !default;\n$body-emphasis-color-dark: $white !default;\n$border-color-dark: $gray-700 !default;\n$border-color-translucent-dark: rgba($white, .15) !default;\n$headings-color-dark: inherit !default;\n$link-color-dark: tint-color($primary, 40%) !default;\n$link-hover-color-dark: shift-color($link-color-dark, -$link-shade-percentage) !default;\n$code-color-dark: tint-color($code-color, 40%) !default;\n$mark-color-dark: $body-color-dark !default;\n$mark-bg-dark: $yellow-800 !default;\n\n\n//\n// Forms\n//\n\n$form-select-indicator-color-dark: $body-color-dark !default;\n$form-select-indicator-dark: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-color-dark: rgba($white, .25) !default;\n$form-switch-bg-image-dark: url(\"data:image/svg+xml,\") !default;\n\n// scss-docs-start form-validation-colors-dark\n$form-valid-color-dark: $green-300 !default;\n$form-valid-border-color-dark: $green-300 !default;\n$form-invalid-color-dark: $red-300 !default;\n$form-invalid-border-color-dark: $red-300 !default;\n// scss-docs-end form-validation-colors-dark\n\n\n//\n// Accordion\n//\n\n$accordion-icon-color-dark: $primary-text-emphasis-dark !default;\n$accordion-icon-active-color-dark: $primary-text-emphasis-dark !default;\n\n$accordion-button-icon-dark: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon-dark: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end sass-dark-mode-vars\n", + "// Re-assigned maps\n//\n// Placed here so that others can override the default Sass maps and see automatic updates to utilities and more.\n\n// scss-docs-start theme-colors-rgb\n$theme-colors-rgb: map-loop($theme-colors, to-rgb, \"$value\") !default;\n// scss-docs-end theme-colors-rgb\n\n// scss-docs-start theme-text-map\n$theme-colors-text: (\n \"primary\": $primary-text-emphasis,\n \"secondary\": $secondary-text-emphasis,\n \"success\": $success-text-emphasis,\n \"info\": $info-text-emphasis,\n \"warning\": $warning-text-emphasis,\n \"danger\": $danger-text-emphasis,\n \"light\": $light-text-emphasis,\n \"dark\": $dark-text-emphasis,\n) !default;\n// scss-docs-end theme-text-map\n\n// scss-docs-start theme-bg-subtle-map\n$theme-colors-bg-subtle: (\n \"primary\": $primary-bg-subtle,\n \"secondary\": $secondary-bg-subtle,\n \"success\": $success-bg-subtle,\n \"info\": $info-bg-subtle,\n \"warning\": $warning-bg-subtle,\n \"danger\": $danger-bg-subtle,\n \"light\": $light-bg-subtle,\n \"dark\": $dark-bg-subtle,\n) !default;\n// scss-docs-end theme-bg-subtle-map\n\n// scss-docs-start theme-border-subtle-map\n$theme-colors-border-subtle: (\n \"primary\": $primary-border-subtle,\n \"secondary\": $secondary-border-subtle,\n \"success\": $success-border-subtle,\n \"info\": $info-border-subtle,\n \"warning\": $warning-border-subtle,\n \"danger\": $danger-border-subtle,\n \"light\": $light-border-subtle,\n \"dark\": $dark-border-subtle,\n) !default;\n// scss-docs-end theme-border-subtle-map\n\n$theme-colors-text-dark: null !default;\n$theme-colors-bg-subtle-dark: null !default;\n$theme-colors-border-subtle-dark: null !default;\n\n@if $enable-dark-mode {\n // scss-docs-start theme-text-dark-map\n $theme-colors-text-dark: (\n \"primary\": $primary-text-emphasis-dark,\n \"secondary\": $secondary-text-emphasis-dark,\n \"success\": $success-text-emphasis-dark,\n \"info\": $info-text-emphasis-dark,\n \"warning\": $warning-text-emphasis-dark,\n \"danger\": $danger-text-emphasis-dark,\n \"light\": $light-text-emphasis-dark,\n \"dark\": $dark-text-emphasis-dark,\n ) !default;\n // scss-docs-end theme-text-dark-map\n\n // scss-docs-start theme-bg-subtle-dark-map\n $theme-colors-bg-subtle-dark: (\n \"primary\": $primary-bg-subtle-dark,\n \"secondary\": $secondary-bg-subtle-dark,\n \"success\": $success-bg-subtle-dark,\n \"info\": $info-bg-subtle-dark,\n \"warning\": $warning-bg-subtle-dark,\n \"danger\": $danger-bg-subtle-dark,\n \"light\": $light-bg-subtle-dark,\n \"dark\": $dark-bg-subtle-dark,\n ) !default;\n // scss-docs-end theme-bg-subtle-dark-map\n\n // scss-docs-start theme-border-subtle-dark-map\n $theme-colors-border-subtle-dark: (\n \"primary\": $primary-border-subtle-dark,\n \"secondary\": $secondary-border-subtle-dark,\n \"success\": $success-border-subtle-dark,\n \"info\": $info-border-subtle-dark,\n \"warning\": $warning-border-subtle-dark,\n \"danger\": $danger-border-subtle-dark,\n \"light\": $light-border-subtle-dark,\n \"dark\": $dark-border-subtle-dark,\n ) !default;\n // scss-docs-end theme-border-subtle-dark-map\n}\n\n// Utilities maps\n//\n// Extends the default `$theme-colors` maps to help create our utilities.\n\n// Come v6, we'll de-dupe these variables. Until then, for backward compatibility, we keep them to reassign.\n// scss-docs-start utilities-colors\n$utilities-colors: $theme-colors-rgb !default;\n// scss-docs-end utilities-colors\n\n// scss-docs-start utilities-text-colors\n$utilities-text: map-merge(\n $utilities-colors,\n (\n \"black\": to-rgb($black),\n \"white\": to-rgb($white),\n \"body\": to-rgb($body-color)\n )\n) !default;\n$utilities-text-colors: map-loop($utilities-text, rgba-css-var, \"$key\", \"text\") !default;\n\n$utilities-text-emphasis-colors: (\n \"primary-emphasis\": var(--#{$prefix}primary-text-emphasis),\n \"secondary-emphasis\": var(--#{$prefix}secondary-text-emphasis),\n \"success-emphasis\": var(--#{$prefix}success-text-emphasis),\n \"info-emphasis\": var(--#{$prefix}info-text-emphasis),\n \"warning-emphasis\": var(--#{$prefix}warning-text-emphasis),\n \"danger-emphasis\": var(--#{$prefix}danger-text-emphasis),\n \"light-emphasis\": var(--#{$prefix}light-text-emphasis),\n \"dark-emphasis\": var(--#{$prefix}dark-text-emphasis)\n) !default;\n// scss-docs-end utilities-text-colors\n\n// scss-docs-start utilities-bg-colors\n$utilities-bg: map-merge(\n $utilities-colors,\n (\n \"black\": to-rgb($black),\n \"white\": to-rgb($white),\n \"body\": to-rgb($body-bg)\n )\n) !default;\n$utilities-bg-colors: map-loop($utilities-bg, rgba-css-var, \"$key\", \"bg\") !default;\n\n$utilities-bg-subtle: (\n \"primary-subtle\": var(--#{$prefix}primary-bg-subtle),\n \"secondary-subtle\": var(--#{$prefix}secondary-bg-subtle),\n \"success-subtle\": var(--#{$prefix}success-bg-subtle),\n \"info-subtle\": var(--#{$prefix}info-bg-subtle),\n \"warning-subtle\": var(--#{$prefix}warning-bg-subtle),\n \"danger-subtle\": var(--#{$prefix}danger-bg-subtle),\n \"light-subtle\": var(--#{$prefix}light-bg-subtle),\n \"dark-subtle\": var(--#{$prefix}dark-bg-subtle)\n) !default;\n// scss-docs-end utilities-bg-colors\n\n// scss-docs-start utilities-border-colors\n$utilities-border: map-merge(\n $utilities-colors,\n (\n \"black\": to-rgb($black),\n \"white\": to-rgb($white)\n )\n) !default;\n$utilities-border-colors: map-loop($utilities-border, rgba-css-var, \"$key\", \"border\") !default;\n\n$utilities-border-subtle: (\n \"primary-subtle\": var(--#{$prefix}primary-border-subtle),\n \"secondary-subtle\": var(--#{$prefix}secondary-border-subtle),\n \"success-subtle\": var(--#{$prefix}success-border-subtle),\n \"info-subtle\": var(--#{$prefix}info-border-subtle),\n \"warning-subtle\": var(--#{$prefix}warning-border-subtle),\n \"danger-subtle\": var(--#{$prefix}danger-border-subtle),\n \"light-subtle\": var(--#{$prefix}light-border-subtle),\n \"dark-subtle\": var(--#{$prefix}dark-border-subtle)\n) !default;\n// scss-docs-end utilities-border-colors\n\n$utilities-links-underline: map-loop($utilities-colors, rgba-css-var, \"$key\", \"link-underline\") !default;\n\n$negative-spacers: if($enable-negative-margins, negativify-map($spacers), null) !default;\n\n$gutters: $spacers !default;\n", + "// Toggles\n//\n// Used in conjunction with global variables to enable certain theme features.\n\n// Vendor\n@import \"vendor/rfs\";\n\n// Deprecate\n@import \"mixins/deprecate\";\n\n// Helpers\n@import \"mixins/breakpoints\";\n@import \"mixins/color-mode\";\n@import \"mixins/color-scheme\";\n@import \"mixins/image\";\n@import \"mixins/resize\";\n@import \"mixins/visually-hidden\";\n@import \"mixins/reset-text\";\n@import \"mixins/text-truncate\";\n\n// Utilities\n@import \"mixins/utilities\";\n\n// Components\n@import \"mixins/backdrop\";\n@import \"mixins/buttons\";\n@import \"mixins/caret\";\n@import \"mixins/pagination\";\n@import \"mixins/lists\";\n@import \"mixins/forms\";\n@import \"mixins/table-variants\";\n\n// Skins\n@import \"mixins/border-radius\";\n@import \"mixins/box-shadow\";\n@import \"mixins/gradients\";\n@import \"mixins/transition\";\n\n// Layout\n@import \"mixins/clearfix\";\n@import \"mixins/container\";\n@import \"mixins/grid\";\n", + "// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}", + "// Deprecate mixin\n//\n// This mixin can be used to deprecate mixins or functions.\n// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to\n// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)\n@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {\n @if ($enable-deprecation-messages != false and $ignore-warning != true) {\n @warn \"#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.\";\n }\n}\n", + "// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n", + "// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n", + "// scss-docs-start mixin-color-scheme\n@mixin color-scheme($name) {\n @media (prefers-color-scheme: #{$name}) {\n @content;\n }\n}\n// scss-docs-end mixin-color-scheme\n", + "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n", + "// Resize anything\n\n@mixin resizable($direction) {\n overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n resize: $direction; // Options: horizontal, vertical, both\n}\n", + "// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n\n // Fix for positioned table caption that could become anonymous cells\n &:not(caption) {\n position: absolute !important;\n }\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n", + "@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n}\n", + "// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n", + "// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n", + "// Shared between modals and offcanvases\n@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex;\n width: 100vw;\n height: 100vh;\n background-color: $backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $backdrop-opacity; }\n}\n", + "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-bg: #{$background};\n --#{$prefix}btn-border-color: #{$border};\n --#{$prefix}btn-hover-color: #{$hover-color};\n --#{$prefix}btn-hover-bg: #{$hover-background};\n --#{$prefix}btn-hover-border-color: #{$hover-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$disabled-color};\n --#{$prefix}btn-disabled-bg: #{$disabled-background};\n --#{$prefix}btn-disabled-border-color: #{$disabled-border};\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-border-color: #{$color};\n --#{$prefix}btn-hover-color: #{$color-hover};\n --#{$prefix}btn-hover-bg: #{$active-background};\n --#{$prefix}btn-hover-border-color: #{$active-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$color};\n --#{$prefix}btn-disabled-bg: transparent;\n --#{$prefix}btn-disabled-border-color: #{$color};\n --#{$prefix}gradient: none;\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}btn-padding-y: #{$padding-y};\n --#{$prefix}btn-padding-x: #{$padding-x};\n @include rfs($font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-border-radius: #{$border-radius};\n}\n// scss-docs-end btn-size-mixin\n", + "// scss-docs-start caret-mixins\n@mixin caret-down($width: $caret-width) {\n border-top: $width solid;\n border-right: $width solid transparent;\n border-bottom: 0;\n border-left: $width solid transparent;\n}\n\n@mixin caret-up($width: $caret-width) {\n border-top: 0;\n border-right: $width solid transparent;\n border-bottom: $width solid;\n border-left: $width solid transparent;\n}\n\n@mixin caret-end($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: 0;\n border-bottom: $width solid transparent;\n border-left: $width solid;\n}\n\n@mixin caret-start($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: $width solid;\n border-bottom: $width solid transparent;\n}\n\n@mixin caret(\n $direction: down,\n $width: $caret-width,\n $spacing: $caret-spacing,\n $vertical-align: $caret-vertical-align\n) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down($width);\n } @else if $direction == up {\n @include caret-up($width);\n } @else if $direction == end {\n @include caret-end($width);\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @include caret-start($width);\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n", + "// Pagination\n\n// scss-docs-start pagination-mixin\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}pagination-padding-x: #{$padding-x};\n --#{$prefix}pagination-padding-y: #{$padding-y};\n @include rfs($font-size, --#{$prefix}pagination-font-size);\n --#{$prefix}pagination-border-radius: #{$border-radius};\n}\n// scss-docs-end pagination-mixin\n", + "// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n", + "// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n\n// scss-docs-start form-validation-mixins\n@mixin form-validation-state-selector($state) {\n @if ($state == \"valid\" or $state == \"invalid\") {\n .was-validated #{if(&, \"&\", \"\")}:#{$state},\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n } @else {\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n }\n}\n\n@mixin form-validation-state(\n $state,\n $color,\n $icon,\n $tooltip-color: color-contrast($color),\n $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\n $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity),\n $border-color: $color\n) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-style: $form-feedback-font-style;\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: $tooltip-color;\n background-color: $tooltip-bg-color;\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n @include form-validation-state-selector($state) {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n\n .form-control {\n @include form-validation-state-selector($state) {\n border-color: $border-color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: escape-svg($icon);\n background-repeat: no-repeat;\n background-position: right $input-height-inner-quarter center;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $border-color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .form-select {\n @include form-validation-state-selector($state) {\n border-color: $border-color;\n\n @if $enable-validation-icons {\n &:not([multiple]):not([size]),\n &:not([multiple])[size=\"1\"] {\n --#{$prefix}form-select-bg-icon: #{escape-svg($icon)};\n padding-right: $form-select-feedback-icon-padding-end;\n background-position: $form-select-bg-position, $form-select-feedback-icon-position;\n background-size: $form-select-bg-size, $form-select-feedback-icon-size;\n }\n }\n\n &:focus {\n border-color: $border-color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n .form-control-color {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n width: add($form-color-width, $input-height-inner);\n }\n }\n }\n\n .form-check-input {\n @include form-validation-state-selector($state) {\n border-color: $border-color;\n\n &:checked {\n background-color: $color;\n }\n\n &:focus {\n box-shadow: $focus-box-shadow;\n }\n\n ~ .form-check-label {\n color: $color;\n }\n }\n }\n .form-check-inline .form-check-input {\n ~ .#{$state}-feedback {\n margin-left: .5em;\n }\n }\n\n .input-group {\n > .form-control:not(:focus),\n > .form-select:not(:focus),\n > .form-floating:not(:focus-within) {\n @include form-validation-state-selector($state) {\n @if $state == \"valid\" {\n z-index: 3;\n } @else if $state == \"invalid\" {\n z-index: 4;\n }\n }\n }\n }\n}\n// scss-docs-end form-validation-mixins\n", + "// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n $table-border-color: mix($color, $background, percentage($table-border-factor));\n\n --#{$prefix}table-color: #{$color};\n --#{$prefix}table-bg: #{$background};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-striped-bg: #{$striped-bg};\n --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$prefix}table-active-bg: #{$active-bg};\n --#{$prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$prefix}table-hover-bg: #{$hover-bg};\n --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: var(--#{$prefix}table-color);\n border-color: var(--#{$prefix}table-border-color);\n }\n}\n// scss-docs-end table-variant\n", + "// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n", + "@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @each $value in $shadow {\n @if $value != null {\n $result: append($result, $value, \"comma\");\n }\n @if $value == none and length($shadow) > 1 {\n @warn \"The keyword 'none' must be used as a single argument.\";\n }\n }\n\n @if (length($result) > 0) {\n box-shadow: $result;\n }\n }\n}\n", + "// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n", + "// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n", + "// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n", + "// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n", + "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n", + "// Utilities\n\n$utilities: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$utilities: map-merge(\n (\n // scss-docs-start utils-vertical-align\n \"align\": (\n property: vertical-align,\n class: align,\n values: baseline top middle bottom text-bottom text-top\n ),\n // scss-docs-end utils-vertical-align\n // scss-docs-start utils-float\n \"float\": (\n responsive: true,\n property: float,\n values: (\n start: left,\n end: right,\n none: none,\n )\n ),\n // scss-docs-end utils-float\n // Object Fit utilities\n // scss-docs-start utils-object-fit\n \"object-fit\": (\n responsive: true,\n property: object-fit,\n values: (\n contain: contain,\n cover: cover,\n fill: fill,\n scale: scale-down,\n none: none,\n )\n ),\n // scss-docs-end utils-object-fit\n // Opacity utilities\n // scss-docs-start utils-opacity\n \"opacity\": (\n property: opacity,\n values: (\n 0: 0,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1,\n )\n ),\n // scss-docs-end utils-opacity\n // scss-docs-start utils-overflow\n \"overflow\": (\n property: overflow,\n values: auto hidden visible scroll,\n ),\n \"overflow-x\": (\n property: overflow-x,\n values: auto hidden visible scroll,\n ),\n \"overflow-y\": (\n property: overflow-y,\n values: auto hidden visible scroll,\n ),\n // scss-docs-end utils-overflow\n // scss-docs-start utils-display\n \"display\": (\n responsive: true,\n print: true,\n property: display,\n class: d,\n values: inline inline-block block grid inline-grid table table-row table-cell flex inline-flex none\n ),\n // scss-docs-end utils-display\n // scss-docs-start utils-shadow\n \"shadow\": (\n property: box-shadow,\n class: shadow,\n values: (\n null: var(--#{$prefix}box-shadow),\n sm: var(--#{$prefix}box-shadow-sm),\n lg: var(--#{$prefix}box-shadow-lg),\n none: none,\n )\n ),\n // scss-docs-end utils-shadow\n // scss-docs-start utils-focus-ring\n \"focus-ring\": (\n css-var: true,\n css-variable-name: focus-ring-color,\n class: focus-ring,\n values: map-loop($theme-colors-rgb, rgba-css-var, \"$key\", \"focus-ring\")\n ),\n // scss-docs-end utils-focus-ring\n // scss-docs-start utils-position\n \"position\": (\n property: position,\n values: static relative absolute fixed sticky\n ),\n \"top\": (\n property: top,\n values: $position-values\n ),\n \"bottom\": (\n property: bottom,\n values: $position-values\n ),\n \"start\": (\n property: left,\n class: start,\n values: $position-values\n ),\n \"end\": (\n property: right,\n class: end,\n values: $position-values\n ),\n \"translate-middle\": (\n property: transform,\n class: translate-middle,\n values: (\n null: translate(-50%, -50%),\n x: translateX(-50%),\n y: translateY(-50%),\n )\n ),\n // scss-docs-end utils-position\n // scss-docs-start utils-borders\n \"border\": (\n property: border,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-top\": (\n property: border-top,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-end\": (\n property: border-right,\n class: border-end,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-bottom\": (\n property: border-bottom,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-start\": (\n property: border-left,\n class: border-start,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-color\": (\n property: border-color,\n class: border,\n local-vars: (\n \"border-opacity\": 1\n ),\n values: $utilities-border-colors\n ),\n \"subtle-border-color\": (\n property: border-color,\n class: border,\n values: $utilities-border-subtle\n ),\n \"border-width\": (\n property: border-width,\n class: border,\n values: $border-widths\n ),\n \"border-opacity\": (\n css-var: true,\n class: border-opacity,\n values: (\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n // scss-docs-end utils-borders\n // Sizing utilities\n // scss-docs-start utils-sizing\n \"width\": (\n property: width,\n class: w,\n values: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n )\n ),\n \"max-width\": (\n property: max-width,\n class: mw,\n values: (100: 100%)\n ),\n \"viewport-width\": (\n property: width,\n class: vw,\n values: (100: 100vw)\n ),\n \"min-viewport-width\": (\n property: min-width,\n class: min-vw,\n values: (100: 100vw)\n ),\n \"height\": (\n property: height,\n class: h,\n values: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n )\n ),\n \"max-height\": (\n property: max-height,\n class: mh,\n values: (100: 100%)\n ),\n \"viewport-height\": (\n property: height,\n class: vh,\n values: (100: 100vh)\n ),\n \"min-viewport-height\": (\n property: min-height,\n class: min-vh,\n values: (100: 100vh)\n ),\n // scss-docs-end utils-sizing\n // Flex utilities\n // scss-docs-start utils-flex\n \"flex\": (\n responsive: true,\n property: flex,\n values: (fill: 1 1 auto)\n ),\n \"flex-direction\": (\n responsive: true,\n property: flex-direction,\n class: flex,\n values: row column row-reverse column-reverse\n ),\n \"flex-grow\": (\n responsive: true,\n property: flex-grow,\n class: flex,\n values: (\n grow-0: 0,\n grow-1: 1,\n )\n ),\n \"flex-shrink\": (\n responsive: true,\n property: flex-shrink,\n class: flex,\n values: (\n shrink-0: 0,\n shrink-1: 1,\n )\n ),\n \"flex-wrap\": (\n responsive: true,\n property: flex-wrap,\n class: flex,\n values: wrap nowrap wrap-reverse\n ),\n \"justify-content\": (\n responsive: true,\n property: justify-content,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n evenly: space-evenly,\n )\n ),\n \"align-items\": (\n responsive: true,\n property: align-items,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n baseline: baseline,\n stretch: stretch,\n )\n ),\n \"align-content\": (\n responsive: true,\n property: align-content,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n stretch: stretch,\n )\n ),\n \"align-self\": (\n responsive: true,\n property: align-self,\n values: (\n auto: auto,\n start: flex-start,\n end: flex-end,\n center: center,\n baseline: baseline,\n stretch: stretch,\n )\n ),\n \"order\": (\n responsive: true,\n property: order,\n values: (\n first: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5,\n last: 6,\n ),\n ),\n // scss-docs-end utils-flex\n // Margin utilities\n // scss-docs-start utils-spacing\n \"margin\": (\n responsive: true,\n property: margin,\n class: m,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-x\": (\n responsive: true,\n property: margin-right margin-left,\n class: mx,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-y\": (\n responsive: true,\n property: margin-top margin-bottom,\n class: my,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-top\": (\n responsive: true,\n property: margin-top,\n class: mt,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-end\": (\n responsive: true,\n property: margin-right,\n class: me,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-bottom\": (\n responsive: true,\n property: margin-bottom,\n class: mb,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-start\": (\n responsive: true,\n property: margin-left,\n class: ms,\n values: map-merge($spacers, (auto: auto))\n ),\n // Negative margin utilities\n \"negative-margin\": (\n responsive: true,\n property: margin,\n class: m,\n values: $negative-spacers\n ),\n \"negative-margin-x\": (\n responsive: true,\n property: margin-right margin-left,\n class: mx,\n values: $negative-spacers\n ),\n \"negative-margin-y\": (\n responsive: true,\n property: margin-top margin-bottom,\n class: my,\n values: $negative-spacers\n ),\n \"negative-margin-top\": (\n responsive: true,\n property: margin-top,\n class: mt,\n values: $negative-spacers\n ),\n \"negative-margin-end\": (\n responsive: true,\n property: margin-right,\n class: me,\n values: $negative-spacers\n ),\n \"negative-margin-bottom\": (\n responsive: true,\n property: margin-bottom,\n class: mb,\n values: $negative-spacers\n ),\n \"negative-margin-start\": (\n responsive: true,\n property: margin-left,\n class: ms,\n values: $negative-spacers\n ),\n // Padding utilities\n \"padding\": (\n responsive: true,\n property: padding,\n class: p,\n values: $spacers\n ),\n \"padding-x\": (\n responsive: true,\n property: padding-right padding-left,\n class: px,\n values: $spacers\n ),\n \"padding-y\": (\n responsive: true,\n property: padding-top padding-bottom,\n class: py,\n values: $spacers\n ),\n \"padding-top\": (\n responsive: true,\n property: padding-top,\n class: pt,\n values: $spacers\n ),\n \"padding-end\": (\n responsive: true,\n property: padding-right,\n class: pe,\n values: $spacers\n ),\n \"padding-bottom\": (\n responsive: true,\n property: padding-bottom,\n class: pb,\n values: $spacers\n ),\n \"padding-start\": (\n responsive: true,\n property: padding-left,\n class: ps,\n values: $spacers\n ),\n // Gap utility\n \"gap\": (\n responsive: true,\n property: gap,\n class: gap,\n values: $spacers\n ),\n \"row-gap\": (\n responsive: true,\n property: row-gap,\n class: row-gap,\n values: $spacers\n ),\n \"column-gap\": (\n responsive: true,\n property: column-gap,\n class: column-gap,\n values: $spacers\n ),\n // scss-docs-end utils-spacing\n // Text\n // scss-docs-start utils-text\n \"font-family\": (\n property: font-family,\n class: font,\n values: (monospace: var(--#{$prefix}font-monospace))\n ),\n \"font-size\": (\n rfs: true,\n property: font-size,\n class: fs,\n values: $font-sizes\n ),\n \"font-style\": (\n property: font-style,\n class: fst,\n values: italic normal\n ),\n \"font-weight\": (\n property: font-weight,\n class: fw,\n values: (\n lighter: $font-weight-lighter,\n light: $font-weight-light,\n normal: $font-weight-normal,\n medium: $font-weight-medium,\n semibold: $font-weight-semibold,\n bold: $font-weight-bold,\n bolder: $font-weight-bolder\n )\n ),\n \"line-height\": (\n property: line-height,\n class: lh,\n values: (\n 1: 1,\n sm: $line-height-sm,\n base: $line-height-base,\n lg: $line-height-lg,\n )\n ),\n \"text-align\": (\n responsive: true,\n property: text-align,\n class: text,\n values: (\n start: left,\n end: right,\n center: center,\n )\n ),\n \"text-decoration\": (\n property: text-decoration,\n values: none underline line-through\n ),\n \"text-transform\": (\n property: text-transform,\n class: text,\n values: lowercase uppercase capitalize\n ),\n \"white-space\": (\n property: white-space,\n class: text,\n values: (\n wrap: normal,\n nowrap: nowrap,\n )\n ),\n \"word-wrap\": (\n property: word-wrap word-break,\n class: text,\n values: (break: break-word),\n rtl: false\n ),\n // scss-docs-end utils-text\n // scss-docs-start utils-color\n \"color\": (\n property: color,\n class: text,\n local-vars: (\n \"text-opacity\": 1\n ),\n values: map-merge(\n $utilities-text-colors,\n (\n \"muted\": var(--#{$prefix}secondary-color), // deprecated\n \"black-50\": rgba($black, .5), // deprecated\n \"white-50\": rgba($white, .5), // deprecated\n \"body-secondary\": var(--#{$prefix}secondary-color),\n \"body-tertiary\": var(--#{$prefix}tertiary-color),\n \"body-emphasis\": var(--#{$prefix}emphasis-color),\n \"reset\": inherit,\n )\n )\n ),\n \"text-opacity\": (\n css-var: true,\n class: text-opacity,\n values: (\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n \"text-color\": (\n property: color,\n class: text,\n values: $utilities-text-emphasis-colors\n ),\n // scss-docs-end utils-color\n // scss-docs-start utils-links\n \"link-opacity\": (\n css-var: true,\n class: link-opacity,\n state: hover,\n values: (\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n \"link-offset\": (\n property: text-underline-offset,\n class: link-offset,\n state: hover,\n values: (\n 1: .125em,\n 2: .25em,\n 3: .375em,\n )\n ),\n \"link-underline\": (\n property: text-decoration-color,\n class: link-underline,\n local-vars: (\n \"link-underline-opacity\": 1\n ),\n values: map-merge(\n $utilities-links-underline,\n (\n null: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-underline-opacity, 1)),\n )\n )\n ),\n \"link-underline-opacity\": (\n css-var: true,\n class: link-underline-opacity,\n state: hover,\n values: (\n 0: 0,\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n ),\n ),\n // scss-docs-end utils-links\n // scss-docs-start utils-bg-color\n \"background-color\": (\n property: background-color,\n class: bg,\n local-vars: (\n \"bg-opacity\": 1\n ),\n values: map-merge(\n $utilities-bg-colors,\n (\n \"transparent\": transparent,\n \"body-secondary\": rgba(var(--#{$prefix}secondary-bg-rgb), var(--#{$prefix}bg-opacity)),\n \"body-tertiary\": rgba(var(--#{$prefix}tertiary-bg-rgb), var(--#{$prefix}bg-opacity)),\n )\n )\n ),\n \"bg-opacity\": (\n css-var: true,\n class: bg-opacity,\n values: (\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n \"subtle-background-color\": (\n property: background-color,\n class: bg,\n values: $utilities-bg-subtle\n ),\n // scss-docs-end utils-bg-color\n \"gradient\": (\n property: background-image,\n class: bg,\n values: (gradient: var(--#{$prefix}gradient))\n ),\n // scss-docs-start utils-interaction\n \"user-select\": (\n property: user-select,\n values: all auto none\n ),\n \"pointer-events\": (\n property: pointer-events,\n class: pe,\n values: none auto,\n ),\n // scss-docs-end utils-interaction\n // scss-docs-start utils-border-radius\n \"rounded\": (\n property: border-radius,\n class: rounded,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n \"rounded-top\": (\n property: border-top-left-radius border-top-right-radius,\n class: rounded-top,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n \"rounded-end\": (\n property: border-top-right-radius border-bottom-right-radius,\n class: rounded-end,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n \"rounded-bottom\": (\n property: border-bottom-right-radius border-bottom-left-radius,\n class: rounded-bottom,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n \"rounded-start\": (\n property: border-bottom-left-radius border-top-left-radius,\n class: rounded-start,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n // scss-docs-end utils-border-radius\n // scss-docs-start utils-visibility\n \"visibility\": (\n property: visibility,\n class: null,\n values: (\n visible: visible,\n invisible: hidden,\n )\n ),\n // scss-docs-end utils-visibility\n // scss-docs-start utils-zindex\n \"z-index\": (\n property: z-index,\n class: z,\n values: $zindex-levels,\n )\n // scss-docs-end utils-zindex\n ),\n $utilities\n);\n", + ":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n", + "// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`

  • forum +加入社区
  • +
    收费说明
    + + + + \ No newline at end of file diff --git a/docs/shopping_cart/index.xml b/docs/shopping_cart/index.xml new file mode 100644 index 000000000000..5ec00e270d33 --- /dev/null +++ b/docs/shopping_cart/index.xml @@ -0,0 +1,2 @@ +收费说明 on FastGPThttps://doc.tryfastgpt.ai/docs/shopping_cart/Recent content in 收费说明 on FastGPTHugo -- gohugo.iozh-cn线上版定价https://doc.tryfastgpt.ai/docs/shopping_cart/saas/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/shopping_cart/saas/线上版价格请查看:https://cloud.tryfastgpt.ai/price商业版https://doc.tryfastgpt.ai/docs/shopping_cart/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/shopping_cart/intro/简介 linkFastGPT 商业版是基于 FastGPT 开源版的增强版本,增加了一些独有的功能。只需安装一个商业版镜像,并在开源版基础上填写对应的内网地址,即可快速使用商业版。 +功能差异 link 开源版 商业版 线上版 应用管理与高级编排 ✅ ✅ ✅ 文档知识库 ✅ ✅ ✅ 外部使用 ✅ ✅ ✅ API 知识库 ✅ ✅ ✅ 最大应用数量 500 无限制 由付费套餐决定 最大知识库数量(单个知识库内容无限制) 30 无限制 由付费套餐决定 自定义版权信息 ❌ ✅ 设计中 多租户与支付 ❌ ✅ ✅ 团队空间 &amp; 权限 ❌ ✅ ✅ 应用发布安全配置 ❌ ✅ ✅ 内容审核 ❌ ✅ ✅ web站点同步 ❌ ✅ ✅ 主流文档库接入(目前支持:语雀、飞书) ❌ ✅ ✅ 增强训练模式 ❌ ✅ ✅ 第三方应用快速接入(飞书、公众号) ❌ ✅ ✅ 管理后台 ❌ ✅ 不需要 SSO 登录(可自定义,也可使用内置:Github、公众号、钉钉、谷歌等) ❌ ✅ 不需要 图片知识库 ❌ 设计中 设计中 对话日志运营分析 ❌ 设计中 设计中 完整商业授权 ❌ ✅ ✅ 商业版软件价格 linkFastGPT 商业版软件根据不同的部署方式,分为 3 类收费模式。下面列举各种部署方式一些常规内容,如仍有问题,可联系咨询 \ No newline at end of file diff --git a/docs/shopping_cart/intro/index.html b/docs/shopping_cart/intro/index.html new file mode 100644 index 000000000000..7a9533b62880 --- /dev/null +++ b/docs/shopping_cart/intro/index.html @@ -0,0 +1,44 @@ +商业版 | FastGPT
    +
    shopping_cart

    商业版

    FastGPT 商业版相关说明

    简介

    FastGPT 商业版是基于 FastGPT 开源版的增强版本,增加了一些独有的功能。只需安装一个商业版镜像,并在开源版基础上填写对应的内网地址,即可快速使用商业版。

    功能差异

    开源版商业版线上版
    应用管理与高级编排
    文档知识库
    外部使用
    API 知识库
    最大应用数量500无限制由付费套餐决定
    最大知识库数量(单个知识库内容无限制)30无限制由付费套餐决定
    自定义版权信息设计中
    多租户与支付
    团队空间 & 权限
    应用发布安全配置
    内容审核
    web站点同步
    主流文档库接入(目前支持:语雀、飞书)
    增强训练模式
    第三方应用快速接入(飞书、公众号)
    管理后台不需要
    SSO 登录(可自定义,也可使用内置:Github、公众号、钉钉、谷歌等)不需要
    图片知识库设计中设计中
    对话日志运营分析设计中设计中
    完整商业授权

    商业版软件价格

    FastGPT 商业版软件根据不同的部署方式,分为 3 类收费模式。下面列举各种部署方式一些常规内容,如仍有问题,可联系咨询

    共有服务

    1. Saas 商业授权许可 - 在商业版有效期内,可提供任意形式的商业服务。
    2. 首次免费帮助部署。
    3. 优先问题工单处理。

    特有服务

    部署方式特有服务上线时长标品价格
    Sealos全托管1. 有效期内免费升级。
    2. 免运维服务&数据库。
    半天6000元起/月(3个月起)

    60000元起/年
    自有服务器部署1. 6个版本免费升级支持。14天内具体价格可联系咨询

    联系方式

    请填写咨询问卷,我们会尽快与您联系。

    技术支持

    应用定制

    根据需求,定制实现某个需求的编排功能,最终会交付一个应用编排。可根据实际情况商讨。

    技术服务费(定开、维护、迁移、三方接入等)

    2000 ~ 3000元/人/天

    更新升级费用

    大部分更新升级,重新拉镜像,然后执行一下初始化脚本就可以了,不需要执行额外操作。

    跨版本更新或复杂更新可参考文档自行更新;或付费支持,标准与技术服务费一致。

    QA

    如何交付?

    完整版应用 = 开源版镜像 + 商业版镜像

    我们会提供一个商业版镜像给你使用,该镜像需要一个 License 启动。

    二次开发如何操作?

    可以修改开源版部分代码,不支持修改商业版镜像。完整版本=开源版+商业版镜像,所以是可以修改部分内容的。但是如果二开了,后续则需要自己进行代码合并升级。

    Sealos 运行费用

    Sealos 云服务属于按量计费,下面是它的价格表:

    alt text

    管理后台部分截图

    alt textalt textalt text
    + + + + \ No newline at end of file diff --git a/docs/shopping_cart/saas/index.html b/docs/shopping_cart/saas/index.html new file mode 100644 index 000000000000..7b9d5441c535 --- /dev/null +++ b/docs/shopping_cart/saas/index.html @@ -0,0 +1 @@ +https://cloud.tryfastgpt.ai/price \ No newline at end of file diff --git a/docs/use-cases/app-cases/dalle3/index.html b/docs/use-cases/app-cases/dalle3/index.html new file mode 100644 index 000000000000..592162f40ae3 --- /dev/null +++ b/docs/use-cases/app-cases/dalle3/index.html @@ -0,0 +1,449 @@ +Dalle3 绘图 | FastGPT
    +
    image

    Dalle3 绘图

    使用 HTTP 模块绘制图片

    OpenAI Dalle3 接口

    先来看下官方接口的参数和响应值:

    Body

    +  {
    +    "model": "dall-e-3",
    +    "prompt": "A cute baby sea otter",
    +    "n": 1,
    +    "size": "1024x1024"
    +}
    +  

    Response

    +  {
    +  "created": 1589478378,
    +  "data": [
    +    {
    +      "url": "https://..."
    +    },
    +    {
    +      "url": "https://..."
    +    }
    +  ]
    +}
    +  

    编排思路

    1. 通过 AI 来优化图片绘制的提示词(这步省略了,自己找提示词即可)
    2. 通过 【HTTP 请求】模块 调用 Dalle3 接口,获取图片的 URL。
    3. 通过 【文本加工】模块 来构建 Markdown 的图片格式。
    4. 通过 【指定回复】模块 来直接输出图片链接。

    1. 构建 HTTP 模块

    请求参数直接复制 Dalle3 接口的即可,并求改 prompt 为变量。需要增加一个 Headers.Authorization

    Body:

    +  {
    +    "model": "dall-e-3",
    +    "prompt": "{{prompt}}",
    +    "n": 1,
    +    "size": "1024x1024"
    +}
    +  

    Headers:

    Authorization: Bearer sk-xxx

    Response:

    响应值需要根据 Dalle3 接口的返回值进行获取,我们只绘制了1张图片,所以只需要取第一张图片的 URL 即可。给 HTTP 模块增加一个自定义输出 data[0].url

    2. 文本加工 - 构建图片链接

    Markdown 语法中 ![图片描述](图片链接) 表示插入图片,图片链接由【HTTP 请求】模块输出。

    因此可以增加一个输入来接收 【HTTP 请求】模块 的图片链接输出,并在 【文本加工】模块 - 文本 中通过变量来引用图片链接,从而得到一个完整的 Markdown 图片格式。

    3. 指定回复

    指定回复可以直接输出传入的内容到客户端,因此可以直接输出加工好的 Markdown 图片格式即可。

    编排代码

    编排配置
    {
    +  "nodes": [
    +    {
    +      "nodeId": "userGuide",
    +      "name": "系统配置",
    +      "intro": "可以配置应用的系统参数",
    +      "avatar": "/imgs/workflow/userGuide.png",
    +      "flowNodeType": "userGuide",
    +      "position": {
    +        "x": 531.2422736065552,
    +        "y": -486.7611729549753
    +      },
    +      "inputs": [
    +        {
    +          "key": "welcomeText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "core.app.Welcome Text",
    +          "value": ""
    +        },
    +        {
    +          "key": "variables",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "core.app.Chat Variable",
    +          "value": []
    +        },
    +        {
    +          "key": "questionGuide",
    +          "valueType": "boolean",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "core.app.Question Guide",
    +          "value": false
    +        },
    +        {
    +          "key": "tts",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": {
    +            "type": "web"
    +          }
    +        },
    +        {
    +          "key": "whisper",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": {
    +            "open": false,
    +            "autoSend": false,
    +            "autoTTSResponse": false
    +          }
    +        },
    +        {
    +          "key": "scheduleTrigger",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": null
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "448745",
    +      "name": "流程开始",
    +      "intro": "",
    +      "avatar": "/imgs/workflow/userChatInput.svg",
    +      "flowNodeType": "workflowStart",
    +      "position": {
    +        "x": 532.1275542407774,
    +        "y": 46.03775600322817
    +      },
    +      "inputs": [
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "toolDescription": "用户问题"
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "userChatInput",
    +          "key": "userChatInput",
    +          "label": "core.module.input.label.user question",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "tMyUnRL5jIrC",
    +      "name": "HTTP 请求",
    +      "intro": "可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)",
    +      "avatar": "/imgs/workflow/http.png",
    +      "flowNodeType": "httpRequest468",
    +      "showStatus": true,
    +      "position": {
    +        "x": 921.2377506442713,
    +        "y": -483.94114977914256
    +      },
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "core.module.input.description.HTTP Dynamic Input",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        },
    +        {
    +          "key": "prompt",
    +          "valueType": "string",
    +          "label": "prompt",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "description": "",
    +          "canEdit": true,
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          },
    +          "value": [
    +            "448745",
    +            "userChatInput"
    +          ]
    +        },
    +        {
    +          "key": "system_httpMethod",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "value": "POST",
    +          "required": true
    +        },
    +        {
    +          "key": "system_httpReqUrl",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Url",
    +          "placeholder": "https://api.ai.com/getInventory",
    +          "required": false,
    +          "value": "https://api.openai.com/v1/images/generations"
    +        },
    +        {
    +          "key": "system_httpHeader",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "any",
    +          "value": [
    +            {
    +              "key": "Authorization",
    +              "type": "string",
    +              "value": "Bearer "
    +            }
    +          ],
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Header",
    +          "placeholder": "core.module.input.description.Http Request Header",
    +          "required": false
    +        },
    +        {
    +          "key": "system_httpParams",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": [],
    +          "label": "",
    +          "required": false
    +        },
    +        {
    +          "key": "system_httpJsonBody",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": "{\n  \"model\": \"dall-e-3\",\n  \"prompt\": \"{{prompt}}\",\n  \"n\": 1,\n  \"size\": \"1024x1024\"\n}",
    +          "label": "",
    +          "required": false
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        },
    +        {
    +          "id": "httpRawResponse",
    +          "key": "httpRawResponse",
    +          "label": "原始响应",
    +          "description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
    +          "valueType": "any",
    +          "type": "static"
    +        },
    +        {
    +          "id": "DeKGGioBwaMf",
    +          "type": "dynamic",
    +          "key": "data[0].url",
    +          "valueType": "string",
    +          "label": "data[0].url"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "CO3POL8svbbi",
    +      "name": "文本加工",
    +      "intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。",
    +      "avatar": "/imgs/workflow/textEditor.svg",
    +      "flowNodeType": "pluginModule",
    +      "showStatus": false,
    +      "position": {
    +        "x": 1417.5940290051137,
    +        "y": -478.81889618104356
    +      },
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "valueType": "dynamic",
    +          "label": "动态外部数据",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "required": false,
    +          "description": "",
    +          "canEdit": false,
    +          "value": "",
    +          "editField": {
    +            "key": true
    +          },
    +          "dynamicParamDefaultValue": {
    +            "inputType": "reference",
    +            "valueType": "string",
    +            "required": true
    +          }
    +        },
    +        {
    +          "key": "url",
    +          "valueType": "string",
    +          "label": "url",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "required": true,
    +          "description": "",
    +          "canEdit": true,
    +          "editField": {
    +            "key": true
    +          },
    +          "value": [
    +            "tMyUnRL5jIrC",
    +            "DeKGGioBwaMf"
    +          ]
    +        },
    +        {
    +          "key": "文本",
    +          "valueType": "string",
    +          "label": "文本",
    +          "renderTypeList": [
    +            "textarea"
    +          ],
    +          "required": true,
    +          "description": "",
    +          "canEdit": false,
    +          "value": "![]({{url}})",
    +          "editField": {
    +            "key": true
    +          },
    +          "maxLength": "",
    +          "dynamicParamDefaultValue": {
    +            "inputType": "reference",
    +            "valueType": "string",
    +            "required": true
    +          }
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "text",
    +          "type": "static",
    +          "key": "text",
    +          "valueType": "string",
    +          "label": "text",
    +          "description": ""
    +        }
    +      ],
    +      "pluginId": "community-textEditor"
    +    },
    +    {
    +      "nodeId": "7mapnCgHfKW6",
    +      "name": "指定回复",
    +      "intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
    +      "avatar": "/imgs/workflow/reply.png",
    +      "flowNodeType": "answerNode",
    +      "position": {
    +        "x": 1922.5628399315042,
    +        "y": -471.67391598231796
    +      },
    +      "inputs": [
    +        {
    +          "key": "text",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "label": "core.module.input.label.Response content",
    +          "description": "core.module.input.description.Response content",
    +          "placeholder": "core.module.input.description.Response content",
    +          "selectedTypeIndex": 1,
    +          "value": [
    +            "CO3POL8svbbi",
    +            "text"
    +          ]
    +        }
    +      ],
    +      "outputs": []
    +    }
    +  ],
    +  "edges": [
    +    {
    +      "source": "448745",
    +      "target": "tMyUnRL5jIrC",
    +      "sourceHandle": "448745-source-right",
    +      "targetHandle": "tMyUnRL5jIrC-target-left"
    +    },
    +    {
    +      "source": "tMyUnRL5jIrC",
    +      "target": "CO3POL8svbbi",
    +      "sourceHandle": "tMyUnRL5jIrC-source-right",
    +      "targetHandle": "CO3POL8svbbi-target-left"
    +    },
    +    {
    +      "source": "CO3POL8svbbi",
    +      "target": "7mapnCgHfKW6",
    +      "sourceHandle": "CO3POL8svbbi-source-right",
    +      "targetHandle": "7mapnCgHfKW6-target-left"
    +    }
    +  ]
    +}
    +
    + + + + \ No newline at end of file diff --git a/docs/use-cases/app-cases/english_essay_correction_bot/index.html b/docs/use-cases/app-cases/english_essay_correction_bot/index.html new file mode 100644 index 000000000000..cf9b7fed0e5d --- /dev/null +++ b/docs/use-cases/app-cases/english_essay_correction_bot/index.html @@ -0,0 +1,81 @@ +英语作文纠错机器人 | FastGPT
    +
    spellcheck

    英语作文纠错机器人

    使用 FastGPT 创建一个用于英语作文纠错的机器人,帮助用户检测并纠正语言错误

    FastGPT 提供了一种基于 LLM Model 搭建应用的简便方式。

    本文通过搭建一个英语作文纠错机器人,介绍一下如何使用 工作流

    搭建过程

    1. 创建工作流

    可以从 多轮翻译机器人 开始创建。

    多轮翻译机器人是 @米开朗基杨 同学创建的,同样也是一个值得学习的工作流。

    2. 获取输入,使用大模型进行分析

    我们期望让大模型处理文字,返回一个结构化的数据,由我们自己处理。

    提示词 是最重要的一个参数,这里提供的提示词仅供参考:

    +  ## 角色
    +资深英语写作专家
    +
    +## 任务
    +对输入的原文进行分析。 找出其中的各种错误, 包括但不限于单词拼写错误、 语法错误等。 
    +注意: 忽略标点符号前后空格的问题。
    +注意: 对于存在错误的句子, 提出修改建议是指指出这个句子中的具体部分, 然后提出将这一个部分修改替换为什么。
    +
    +## 输出格式
    +不要使用 Markdown 语法, 输入 JSON 格式的内容。
    +输出的"reason"的内容使用中文。
    +直接输出一个列表, 其成员为一个相同类型的对象, 定义如下
    +您正在找回 FastGPT 账号
    +```
    +{
    +“raw”: string; // 表示原文
    +“reason”: string; // 表示原因
    +“suggestion”: string; // 修改建议
    +}
    +```
    +  

    可以在模型选择的窗口中设置禁用 AI 回复。

    这样就看不到输出的 json 格式的内容了。

    3. 数据处理

    上面的大模型输出了一个 json,这里要进行数据处理。数据处理可以使用代码执行组件。

    +  function main({data}){
    +    const array = JSON.parse(data)
    +    return {
    +        content: array.map(
    +            (item, index) => {
    +                return `
    +## 分析${index+1}
    +- **错误**: ${item.raw}
    +- **分析**: ${item.reason}
    +- **修改建议**: ${item.suggestion}
    +`
    +            }
    +        ).join('')
    +    }
    +}
    +  

    上面的代码将 JSON 解析为 Object, 然后拼接成一串 Markdown 语法的字符串。

    FastGPT 的指定回复组件可以将 Markdown 解析为 Html 返回。

    发布

    可以使用发布渠道进行发布。

    可以选择通过 URL 访问,或者是直接嵌入你的网页中。

    点我使用

    + + + + \ No newline at end of file diff --git a/docs/use-cases/app-cases/feishu_webhook/index.html b/docs/use-cases/app-cases/feishu_webhook/index.html new file mode 100644 index 000000000000..3baa4c4715bd --- /dev/null +++ b/docs/use-cases/app-cases/feishu_webhook/index.html @@ -0,0 +1,416 @@ +发送飞书webhook通知 | FastGPT
    +
    image

    发送飞书webhook通知

    利用工具调用模块,发送一个飞书webhook通知

    该文章展示如何发送一个简单的飞书webhook通知,以此类推,发送其他类型的通知也可以这么操作。

    1. 准备飞书机器人

    2. 导入编排代码

    复制下面配置,点击「高级编排」右上角的导入按键,导入该配置,导入后将飞书提供的接口地址复制到「HTTP 模块」。

    编排配置
    {
    +  "nodes": [
    +    {
    +      "nodeId": "userGuide",
    +      "name": "系统配置",
    +      "intro": "可以配置应用的系统参数",
    +      "avatar": "/imgs/workflow/userGuide.png",
    +      "flowNodeType": "userGuide",
    +      "position": {
    +        "x": 303.41163758039283,
    +        "y": -552.297639861266
    +      },
    +      "version": "481",
    +      "inputs": [],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "workflowStartNodeId",
    +      "name": "流程开始",
    +      "intro": "",
    +      "avatar": "/imgs/workflow/userChatInput.svg",
    +      "flowNodeType": "workflowStart",
    +      "position": {
    +        "x": 529.3935295017156,
    +        "y": 197.114018410347
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "toolDescription": "用户问题"
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "userChatInput",
    +          "key": "userChatInput",
    +          "label": "core.module.input.label.user question",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "u6IAOEssxoZT",
    +      "name": "工具调用",
    +      "intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
    +      "avatar": "/imgs/workflow/tool.svg",
    +      "flowNodeType": "tools",
    +      "showStatus": true,
    +      "position": {
    +        "x": 1003.146243538873,
    +        "y": 48.52327869406625
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "model",
    +          "renderTypeList": [
    +            "settingLLMModel",
    +            "reference"
    +          ],
    +          "label": "core.module.input.label.aiModel",
    +          "valueType": "string",
    +          "llmModelType": "all",
    +          "value": "gpt-3.5-turbo"
    +        },
    +        {
    +          "key": "temperature",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 0,
    +          "valueType": "number",
    +          "min": 0,
    +          "max": 10,
    +          "step": 1
    +        },
    +        {
    +          "key": "maxToken",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 2000,
    +          "valueType": "number",
    +          "min": 100,
    +          "max": 4000,
    +          "step": 50
    +        },
    +        {
    +          "key": "systemPrompt",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "max": 3000,
    +          "valueType": "string",
    +          "label": "core.ai.Prompt",
    +          "description": "core.app.tip.chatNodeSystemPromptTip",
    +          "placeholder": "core.app.tip.chatNodeSystemPromptTip"
    +        },
    +        {
    +          "key": "history",
    +          "renderTypeList": [
    +            "numberInput",
    +            "reference"
    +          ],
    +          "valueType": "chatHistory",
    +          "label": "core.module.input.label.chat history",
    +          "description": "最多携带多少轮对话记录",
    +          "required": true,
    +          "min": 0,
    +          "max": 50,
    +          "value": 6
    +        },
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "value": [
    +            "workflowStartNodeId",
    +            "userChatInput"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "answerText",
    +          "key": "answerText",
    +          "label": "core.module.output.label.Ai response content",
    +          "description": "core.module.output.description.Ai response content",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "fvY5hb0K646V",
    +      "name": "工具调用终止",
    +      "intro": "该模块需配置工具调用使用。当该模块被执行时,本次工具调用将会强制结束,并且不再调用AI针对工具调用结果回答问题。",
    +      "avatar": "/imgs/workflow/toolStop.svg",
    +      "flowNodeType": "stopTool",
    +      "position": {
    +        "x": 2367.838362362707,
    +        "y": 732.355988936165
    +      },
    +      "version": "481",
    +      "inputs": [],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "x9rN2a4WnZmt",
    +      "name": "HTTP 请求",
    +      "intro": "向飞书发送一个webhooks通知信息。",
    +      "avatar": "/imgs/workflow/http.png",
    +      "flowNodeType": "httpRequest468",
    +      "showStatus": true,
    +      "position": {
    +        "x": 1623.9214305901633,
    +        "y": 22.777089001645862
    +      },
    +      "version": "486",
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "core.module.input.description.HTTP Dynamic Input",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        },
    +        {
    +          "valueType": "string",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "key": "text",
    +          "label": "text",
    +          "toolDescription": "发送的消息",
    +          "required": true,
    +          "canEdit": true,
    +          "editField": {
    +            "key": true,
    +            "description": true
    +          }
    +        },
    +        {
    +          "key": "system_httpMethod",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "value": "POST",
    +          "required": true
    +        },
    +        {
    +          "key": "system_httpReqUrl",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Url",
    +          "placeholder": "https://api.ai.com/getInventory",
    +          "required": false,
    +          "value": ""
    +        },
    +        {
    +          "key": "system_httpHeader",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "any",
    +          "value": [],
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Header",
    +          "placeholder": "core.module.input.description.Http Request Header",
    +          "required": false
    +        },
    +        {
    +          "key": "system_httpParams",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": [],
    +          "label": "",
    +          "required": false
    +        },
    +        {
    +          "key": "system_httpJsonBody",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": "{\r\n    \"msg_type\": \"text\",\r\n    \"content\": {\r\n        \"text\": \"{{text}}\"\r\n    }\r\n}",
    +          "label": "",
    +          "required": false
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        },
    +        {
    +          "id": "error",
    +          "key": "error",
    +          "label": "请求错误",
    +          "description": "HTTP请求错误信息,成功时返回空",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "httpRawResponse",
    +          "key": "httpRawResponse",
    +          "label": "原始响应",
    +          "required": true,
    +          "description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
    +          "valueType": "any",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "aGHGqH2oUupj",
    +      "name": "指定回复",
    +      "intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
    +      "avatar": "/imgs/workflow/reply.png",
    +      "flowNodeType": "answerNode",
    +      "position": {
    +        "x": 2350.7077940158674,
    +        "y": 107.32448732713493
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "text",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "valueType": "any",
    +          "required": true,
    +          "label": "core.module.input.label.Response content",
    +          "description": "core.module.input.description.Response content",
    +          "placeholder": "core.module.input.description.Response content",
    +          "value": "嘻嘻,发送成功"
    +        }
    +      ],
    +      "outputs": []
    +    }
    +  ],
    +  "edges": [
    +    {
    +      "source": "workflowStartNodeId",
    +      "target": "u6IAOEssxoZT",
    +      "sourceHandle": "workflowStartNodeId-source-right",
    +      "targetHandle": "u6IAOEssxoZT-target-left"
    +    },
    +    {
    +      "source": "u6IAOEssxoZT",
    +      "target": "x9rN2a4WnZmt",
    +      "sourceHandle": "selectedTools",
    +      "targetHandle": "selectedTools"
    +    },
    +    {
    +      "source": "x9rN2a4WnZmt",
    +      "target": "fvY5hb0K646V",
    +      "sourceHandle": "x9rN2a4WnZmt-source-right",
    +      "targetHandle": "fvY5hb0K646V-target-left"
    +    },
    +    {
    +      "source": "x9rN2a4WnZmt",
    +      "target": "aGHGqH2oUupj",
    +      "sourceHandle": "x9rN2a4WnZmt-source-right",
    +      "targetHandle": "aGHGqH2oUupj-target-left"
    +    }
    +  ],
    +  "chatConfig": {
    +    "variables": [
    +      {
    +        "id": "txq1ca",
    +        "key": "test",
    +        "label": "测试",
    +        "type": "custom",
    +        "required": true,
    +        "maxLen": 50,
    +        "enums": [
    +          {
    +            "value": ""
    +          }
    +        ]
    +      }
    +    ],
    +    "questionGuide": false,
    +    "scheduledTriggerConfig": {
    +      "cronString": "",
    +      "timezone": "Asia/Shanghai",
    +      "defaultPrompt": ""
    +    },
    +    "_id": "66715d4bf577287d39e35ecf"
    +  }
    +}
    +

    3. 流程说明

    1. 为工具调用挂载一个HTTP模块,功能描述写上:调用飞书webhook,发送一个通知。
    2. HTTP模块的输入参数中,填写飞书机器人的地址,填写发送的通知内容。
    3. HTTP模块输出连接上一个工具终止模块,用于强制结束工具调用。不终止的话,会把调用结果返回给模型,模型会继续回答一次问题,浪费 Tokens
    4. HTTP模块输出再连上一个指定回复,直接回复一个发送成功,用于替代AI的回答。
    + + + + \ No newline at end of file diff --git a/docs/use-cases/app-cases/fixingevidence/index.html b/docs/use-cases/app-cases/fixingevidence/index.html new file mode 100644 index 000000000000..d4891625161f --- /dev/null +++ b/docs/use-cases/app-cases/fixingevidence/index.html @@ -0,0 +1,449 @@ +固定开头和结尾内容 | FastGPT
    +
    固定开头和结尾内容
    healing

    固定开头和结尾内容

    利用指定回复,创建固定的开头和结尾

    如上图,可以通过指定回复编排一个固定的开头和结尾内容。

    模块编排

    复制下面配置,点击「高级编排」右上角的导入按键,导入该配置。

    编排配置
    {
    +  "nodes": [
    +    {
    +      "nodeId": "7z5g5h",
    +      "name": "流程开始",
    +      "intro": "",
    +      "avatar": "/imgs/workflow/userChatInput.svg",
    +      "flowNodeType": "workflowStart",
    +      "position": {
    +        "x": -269.50851681351924,
    +        "y": 1657.6123698022448
    +      },
    +      "inputs": [
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "问题输入",
    +          "required": true,
    +          "toolDescription": "用户问题",
    +          "type": "systemInput",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0,
    +          "value": [
    +            "7z5g5h",
    +            "userChatInput"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "userChatInput",
    +          "type": "static",
    +          "key": "userChatInput",
    +          "valueType": "string",
    +          "label": "core.module.input.label.user question"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "nlfwkc",
    +      "name": "AI 对话",
    +      "intro": "AI 大模型对话",
    +      "avatar": "/imgs/workflow/AI.png",
    +      "flowNodeType": "chatNode",
    +      "showStatus": true,
    +      "position": {
    +        "x": 907.2058332478431,
    +        "y": 1348.9992737142143
    +      },
    +      "inputs": [
    +        {
    +          "key": "model",
    +          "renderTypeList": [
    +            "settingLLMModel",
    +            "reference"
    +          ],
    +          "label": "core.module.input.label.aiModel",
    +          "valueType": "string",
    +          "type": "selectLLMModel",
    +          "required": true,
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "value": "gpt-3.5-turbo",
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "temperature",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 0,
    +          "valueType": "number",
    +          "min": 0,
    +          "max": 10,
    +          "step": 1,
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "maxToken",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 2000,
    +          "valueType": "number",
    +          "min": 100,
    +          "max": 4000,
    +          "step": 50,
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "isResponseAnswerText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": true,
    +          "valueType": "boolean",
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "quoteTemplate",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string",
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "quotePrompt",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string",
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "systemPrompt",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "max": 300,
    +          "valueType": "string",
    +          "label": "core.ai.Prompt",
    +          "description": "core.app.tip.chatNodeSystemPromptTip",
    +          "placeholder": "core.app.tip.chatNodeSystemPromptTip",
    +          "type": "textarea",
    +          "showTargetInApp": true,
    +          "showTargetInPlugin": true,
    +          "value": "",
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "history",
    +          "renderTypeList": [
    +            "numberInput",
    +            "reference"
    +          ],
    +          "valueType": "chatHistory",
    +          "label": "core.module.input.label.chat history",
    +          "required": true,
    +          "min": 0,
    +          "max": 30,
    +          "value": 6,
    +          "type": "numberInput",
    +          "showTargetInApp": true,
    +          "showTargetInPlugin": true,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "问题输入",
    +          "required": true,
    +          "toolDescription": "用户问题",
    +          "type": "custom",
    +          "showTargetInApp": true,
    +          "showTargetInPlugin": true,
    +          "connected": true,
    +          "selectedTypeIndex": 0,
    +          "value": [
    +            "7z5g5h",
    +            "userChatInput"
    +          ]
    +        },
    +        {
    +          "key": "quoteQA",
    +          "renderTypeList": [
    +            "settingDatasetQuotePrompt"
    +          ],
    +          "label": "",
    +          "debugLabel": "知识库引用",
    +          "description": "core.module.Dataset quote.Input description",
    +          "valueType": "datasetQuote",
    +          "type": "target",
    +          "showTargetInApp": true,
    +          "showTargetInPlugin": true,
    +          "connected": true,
    +          "selectedTypeIndex": 0,
    +          "value": [
    +            "fljhzy",
    +            "quoteQA"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "answerText",
    +          "type": "static",
    +          "key": "answerText",
    +          "valueType": "string",
    +          "label": "core.module.output.label.Ai response content",
    +          "description": "core.module.output.description.Ai response content"
    +        },
    +        {
    +          "id": "history",
    +          "type": "static",
    +          "key": "history",
    +          "valueType": "chatHistory",
    +          "label": "core.module.output.label.New context",
    +          "description": "core.module.output.description.New context"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "q9equb",
    +      "name": "core.module.template.App system setting",
    +      "intro": "可以配置应用的系统参数。",
    +      "avatar": "/imgs/workflow/userGuide.png",
    +      "flowNodeType": "userGuide",
    +      "position": {
    +        "x": -275.92529567956024,
    +        "y": 1094.1001488133452
    +      },
    +      "inputs": [
    +        {
    +          "key": "welcomeText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "core.app.Welcome Text",
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "value": "你好,我是电影《星际穿越》 AI 助手,有什么可以帮助你的?\n[导演是谁]\n[剧情介绍]\n[票房分析]",
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "variables",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "core.module.Variable",
    +          "value": [],
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "questionGuide",
    +          "valueType": "boolean",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "type": "switch",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "tts",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "whisper",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": ""
    +        },
    +        {
    +          "key": "scheduleTrigger",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": null
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "tc90wz",
    +      "name": "指定回复",
    +      "intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
    +      "avatar": "/imgs/workflow/reply.png",
    +      "flowNodeType": "answerNode",
    +      "position": {
    +        "x": 159.49274056478237,
    +        "y": 1621.4635230667668
    +      },
    +      "inputs": [
    +        {
    +          "key": "text",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "valueType": "any",
    +          "label": "core.module.input.label.Response content",
    +          "description": "core.module.input.description.Response content",
    +          "placeholder": "core.module.input.description.Response content",
    +          "type": "textarea",
    +          "showTargetInApp": true,
    +          "showTargetInPlugin": true,
    +          "value": "这是开头\\n",
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "U5T3dMVY4wj7",
    +      "name": "指定回复",
    +      "intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
    +      "avatar": "/imgs/workflow/reply.png",
    +      "flowNodeType": "answerNode",
    +      "position": {
    +        "x": 1467.0625486167608,
    +        "y": 1597.346243737531
    +      },
    +      "inputs": [
    +        {
    +          "key": "text",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "label": "core.module.input.label.Response content",
    +          "description": "core.module.input.description.Response content",
    +          "placeholder": "core.module.input.description.Response content",
    +          "value": "这是结尾"
    +        }
    +      ],
    +      "outputs": []
    +    }
    +  ],
    +  "edges": [
    +    {
    +      "source": "7z5g5h",
    +      "target": "tc90wz",
    +      "sourceHandle": "7z5g5h-source-right",
    +      "targetHandle": "tc90wz-target-left"
    +    },
    +    {
    +      "source": "tc90wz",
    +      "target": "nlfwkc",
    +      "sourceHandle": "tc90wz-source-right",
    +      "targetHandle": "nlfwkc-target-left"
    +    },
    +    {
    +      "source": "nlfwkc",
    +      "target": "U5T3dMVY4wj7",
    +      "sourceHandle": "nlfwkc-source-right",
    +      "targetHandle": "U5T3dMVY4wj7-target-left"
    +    }
    +  ]
    +}
    +
    + + + + \ No newline at end of file diff --git a/docs/use-cases/app-cases/google_search/index.html b/docs/use-cases/app-cases/google_search/index.html new file mode 100644 index 000000000000..d09621af6be7 --- /dev/null +++ b/docs/use-cases/app-cases/google_search/index.html @@ -0,0 +1,1269 @@ +接入谷歌搜索 | FastGPT
    +
    search

    接入谷歌搜索

    将 FastGPT 接入谷歌搜索

    工具调用模式 +工具调用模式 +
    非工具调用模式 +非工具调用模式 +

    如上图,利用「HTTP请求」模块,你可以外接一个搜索引擎作为 AI 回复的参考资料。这里以调用 Google Search API 为例。注意:本文主要是为了介绍 「HTTP请求」模块,具体的搜索效果需要依赖提示词和搜索引擎,尤其是【搜索引擎】,简单的搜索引擎无法获取更详细的内容,这部分可能需要更多的调试。

    注册 Google Search API

    参考这篇文章,每天可以免费使用 100 次。

    写一个 Google Search 接口

    这里用 Laf 快速实现一个接口,即写即发布,无需部署。务必打开 POST 请求方式。

    Laf 谷歌搜索Demo
    import cloud from '@lafjs/cloud'
    +
    +const googleSearchKey = "xxx"
    +const googleCxId = "3740cxxx"
    +const baseurl = "https://www.googleapis.com/customsearch/v1"
    +
    +type RequestType = {
    +  searchKey: string
    +}
    +
    +export default async function (ctx: FunctionContext) {
    +  const { searchKey } = ctx.body as RequestType
    +  console.log(ctx.body)
    +  if (!searchKey) {
    +    return {
    +      prompt: ""
    +    }
    +  }
    +
    +  try {
    +    const { data } = await cloud.fetch.get(baseurl, {
    +      params: {
    +        q: searchKey,
    +        cx: googleCxId,
    +        key: googleSearchKey,
    +        c2coff: 1,
    +        start: 1,
    +        end: 20,
    +        dateRestrict: 'm[1]',
    +      }
    +    })
    +    const result = data.items.map((item) => item.snippet).join('\n');
    +
    +    return { prompt: result }
    +  } catch (err) {
    +    console.log(err)
    +    ctx.response.status(500)
    +    return {
    +      message: "异常"
    +    }
    +  }
    +}
    +

    模块编排 - 工具调用模式

    利用工具模块,则无需多余的操作,直接由模型决定是否调用谷歌搜索,并生成检索词即可。

    复制下面配置,进入「高级编排」,在右上角的 “…” 中选择「导入配置」,导入后修改「HTTP 请求」模块 - 请求地址 的值。

    编排配置
    {
    +  "nodes": [
    +    {
    +      "nodeId": "userGuide",
    +      "name": "系统配置",
    +      "intro": "可以配置应用的系统参数",
    +      "avatar": "/imgs/workflow/userGuide.png",
    +      "flowNodeType": "userGuide",
    +      "position": {
    +        "x": 262.2732338817093,
    +        "y": -476.00241136598146
    +      },
    +      "inputs": [
    +        {
    +          "key": "welcomeText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "core.app.Welcome Text",
    +          "value": ""
    +        },
    +        {
    +          "key": "variables",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "core.app.Chat Variable",
    +          "value": []
    +        },
    +        {
    +          "key": "questionGuide",
    +          "valueType": "boolean",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "core.app.Question Guide",
    +          "value": false
    +        },
    +        {
    +          "key": "tts",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": {
    +            "type": "web"
    +          }
    +        },
    +        {
    +          "key": "whisper",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": {
    +            "open": false,
    +            "autoSend": false,
    +            "autoTTSResponse": false
    +          }
    +        },
    +        {
    +          "key": "scheduleTrigger",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": null
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "448745",
    +      "name": "流程开始",
    +      "intro": "",
    +      "avatar": "/imgs/workflow/userChatInput.svg",
    +      "flowNodeType": "workflowStart",
    +      "position": {
    +        "x": 295.8944548701009,
    +        "y": 110.81336038514848
    +      },
    +      "inputs": [
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "toolDescription": "用户问题"
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "userChatInput",
    +          "key": "userChatInput",
    +          "label": "core.module.input.label.user question",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "NOgbnBzUwDgT",
    +      "name": "工具调用",
    +      "intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
    +      "avatar": "/imgs/workflow/tool.svg",
    +      "flowNodeType": "tools",
    +      "showStatus": true,
    +      "position": {
    +        "x": 1028.8358722416106,
    +        "y": -500.8755882990822
    +      },
    +      "inputs": [
    +        {
    +          "key": "model",
    +          "renderTypeList": [
    +            "settingLLMModel",
    +            "reference"
    +          ],
    +          "label": "core.module.input.label.aiModel",
    +          "valueType": "string",
    +          "llmModelType": "all",
    +          "value": "FastAI-plus"
    +        },
    +        {
    +          "key": "temperature",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 0,
    +          "valueType": "number",
    +          "min": 0,
    +          "max": 10,
    +          "step": 1
    +        },
    +        {
    +          "key": "maxToken",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 2000,
    +          "valueType": "number",
    +          "min": 100,
    +          "max": 4000,
    +          "step": 50
    +        },
    +        {
    +          "key": "systemPrompt",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "max": 3000,
    +          "valueType": "string",
    +          "label": "core.ai.Prompt",
    +          "description": "core.app.tip.chatNodeSystemPromptTip",
    +          "placeholder": "core.app.tip.chatNodeSystemPromptTip",
    +          "value": "你是谷歌搜索机器人,根据当前问题和对话记录生成搜索词。你需要自行判断是否需要进行网络实时查询:\n- 如果需查询则生成搜索词。\n- 如果不需要查询则不返回字段。"
    +        },
    +        {
    +          "key": "history",
    +          "renderTypeList": [
    +            "numberInput",
    +            "reference"
    +          ],
    +          "valueType": "chatHistory",
    +          "label": "core.module.input.label.chat history",
    +          "required": true,
    +          "min": 0,
    +          "max": 30,
    +          "value": 6
    +        },
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "value": [
    +            "448745",
    +            "userChatInput"
    +          ]
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "GMELVPxHfpg5",
    +      "name": "HTTP 请求",
    +      "intro": "调用谷歌搜索,查询相关内容",
    +      "avatar": "/imgs/workflow/http.png",
    +      "flowNodeType": "httpRequest468",
    +      "showStatus": true,
    +      "position": {
    +        "x": 1013.2159795348916,
    +        "y": 210.8685573380423
    +      },
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "core.module.input.description.HTTP Dynamic Input",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        },
    +        {
    +          "valueType": "string",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "key": "query",
    +          "label": "query",
    +          "toolDescription": "谷歌搜索检索词",
    +          "required": true,
    +          "canEdit": true,
    +          "editField": {
    +            "key": true,
    +            "description": true
    +          }
    +        },
    +        {
    +          "key": "system_httpMethod",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "value": "POST",
    +          "required": true
    +        },
    +        {
    +          "key": "system_httpReqUrl",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Url",
    +          "placeholder": "https://api.ai.com/getInventory",
    +          "required": false,
    +          "value": "https://xxxxxx.laf.dev/google_search"
    +        },
    +        {
    +          "key": "system_httpHeader",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "any",
    +          "value": [],
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Header",
    +          "placeholder": "core.module.input.description.Http Request Header",
    +          "required": false
    +        },
    +        {
    +          "key": "system_httpParams",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": [],
    +          "label": "",
    +          "required": false
    +        },
    +        {
    +          "key": "system_httpJsonBody",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": "{\n  \"searchKey\": \"{{query}}\"\n}",
    +          "label": "",
    +          "required": false
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        },
    +        {
    +          "id": "httpRawResponse",
    +          "key": "httpRawResponse",
    +          "label": "原始响应",
    +          "description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
    +          "valueType": "any",
    +          "type": "static"
    +        },
    +        {
    +          "id": "M5YmxaYe8em1",
    +          "type": "dynamic",
    +          "key": "prompt",
    +          "valueType": "string",
    +          "label": "prompt"
    +        }
    +      ]
    +    }
    +  ],
    +  "edges": [
    +    {
    +      "source": "448745",
    +      "target": "NOgbnBzUwDgT",
    +      "sourceHandle": "448745-source-right",
    +      "targetHandle": "NOgbnBzUwDgT-target-left"
    +    },
    +    {
    +      "source": "NOgbnBzUwDgT",
    +      "target": "GMELVPxHfpg5",
    +      "sourceHandle": "selectedTools",
    +      "targetHandle": "selectedTools"
    +    }
    +  ]
    +}
    +

    模块编排 - 非工具调用方式

    复制下面配置,进入「高级编排」,在右上角的 “…” 中选择「导入配置」,导入后修改「HTTP 请求」模块 - 请求地址 的值。

    编排配置
    {
    +  "nodes": [
    +    {
    +      "nodeId": "userGuide",
    +      "name": "系统配置",
    +      "intro": "可以配置应用的系统参数",
    +      "avatar": "/imgs/workflow/userGuide.png",
    +      "flowNodeType": "userGuide",
    +      "position": {
    +        "x": 126.6166221945532,
    +        "y": -456.00079128406236
    +      },
    +      "inputs": [
    +        {
    +          "key": "welcomeText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "core.app.Welcome Text",
    +          "value": ""
    +        },
    +        {
    +          "key": "variables",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "core.app.Chat Variable",
    +          "value": []
    +        },
    +        {
    +          "key": "questionGuide",
    +          "valueType": "boolean",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "core.app.Question Guide",
    +          "value": false
    +        },
    +        {
    +          "key": "tts",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": {
    +            "type": "web"
    +          }
    +        },
    +        {
    +          "key": "whisper",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": {
    +            "open": false,
    +            "autoSend": false,
    +            "autoTTSResponse": false
    +          }
    +        },
    +        {
    +          "key": "scheduleTrigger",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": null
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "448745",
    +      "name": "流程开始",
    +      "intro": "",
    +      "avatar": "/imgs/workflow/userChatInput.svg",
    +      "flowNodeType": "workflowStart",
    +      "position": {
    +        "x": 189.99351048246606,
    +        "y": 50.36949968375285
    +      },
    +      "inputs": [
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "toolDescription": "用户问题"
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "userChatInput",
    +          "key": "userChatInput",
    +          "label": "core.module.input.label.user question",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "TWD5BAqIIFaj",
    +      "name": "判断器",
    +      "intro": "根据一定的条件,执行不同的分支。",
    +      "avatar": "/imgs/workflow/ifElse.svg",
    +      "flowNodeType": "ifElseNode",
    +      "showStatus": true,
    +      "position": {
    +        "x": 1187.4821088468154,
    +        "y": -143.83989103517257
    +      },
    +      "inputs": [
    +        {
    +          "key": "condition",
    +          "valueType": "string",
    +          "label": "",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "required": false,
    +          "value": "And"
    +        },
    +        {
    +          "key": "ifElseList",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": [
    +            {
    +              "variable": [
    +                "lG52GzzMm65z",
    +                "6yF19MRD3nuB"
    +              ],
    +              "condition": "isEmpty",
    +              "value": ""
    +            }
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "IF",
    +          "key": "IF",
    +          "label": "IF",
    +          "valueType": "any",
    +          "type": "source"
    +        },
    +        {
    +          "id": "ELSE",
    +          "key": "ELSE",
    +          "label": "ELSE",
    +          "valueType": "any",
    +          "type": "source"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "1ljV0oTq4zeC",
    +      "name": "HTTP 请求",
    +      "intro": "可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)",
    +      "avatar": "/imgs/workflow/http.png",
    +      "flowNodeType": "httpRequest468",
    +      "showStatus": true,
    +      "position": {
    +        "x": 1992.0328696814468,
    +        "y": 127.08080019458595
    +      },
    +      "inputs": [
    +        {
    +          "key": "DYNAMIC_INPUT_KEY",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "core.module.input.description.HTTP Dynamic Input",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        },
    +        {
    +          "key": "searchKey",
    +          "valueType": "string",
    +          "label": "searchKey",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "description": "",
    +          "canEdit": true,
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          },
    +          "value": [
    +            "lG52GzzMm65z",
    +            "6yF19MRD3nuB"
    +          ]
    +        },
    +        {
    +          "key": "system_httpMethod",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "value": "POST",
    +          "required": true
    +        },
    +        {
    +          "key": "system_httpReqUrl",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Url",
    +          "placeholder": "https://api.ai.com/getInventory",
    +          "required": false,
    +          "value": "https://xxxxxx.laf.dev/google_search"
    +        },
    +        {
    +          "key": "system_httpHeader",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "any",
    +          "value": [],
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Header",
    +          "placeholder": "core.module.input.description.Http Request Header",
    +          "required": false
    +        },
    +        {
    +          "key": "system_httpParams",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": [],
    +          "label": "",
    +          "required": false
    +        },
    +        {
    +          "key": "system_httpJsonBody",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": "{\n  \"searchKey\": \"{{searchKey}}\"\n}",
    +          "label": "",
    +          "required": false
    +        },
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "core.module.input.description.HTTP Dynamic Input",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        },
    +        {
    +          "id": "httpRawResponse",
    +          "key": "httpRawResponse",
    +          "label": "原始响应",
    +          "description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
    +          "valueType": "any",
    +          "type": "static"
    +        },
    +        {
    +          "id": "yw0oz9XWFXYf",
    +          "type": "dynamic",
    +          "key": "prompt",
    +          "valueType": "string",
    +          "label": "prompt"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "Nc6hBdb3l9Pe",
    +      "name": "AI 对话",
    +      "intro": "AI 大模型对话",
    +      "avatar": "/imgs/workflow/AI.png",
    +      "flowNodeType": "chatNode",
    +      "showStatus": true,
    +      "position": {
    +        "x": 1982.442841318768,
    +        "y": -664.9716343803625
    +      },
    +      "inputs": [
    +        {
    +          "key": "model",
    +          "renderTypeList": [
    +            "settingLLMModel",
    +            "reference"
    +          ],
    +          "label": "core.module.input.label.aiModel",
    +          "valueType": "string",
    +          "value": "gpt-3.5-turbo"
    +        },
    +        {
    +          "key": "temperature",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 0,
    +          "valueType": "number",
    +          "min": 0,
    +          "max": 10,
    +          "step": 1
    +        },
    +        {
    +          "key": "maxToken",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 2000,
    +          "valueType": "number",
    +          "min": 100,
    +          "max": 4000,
    +          "step": 50
    +        },
    +        {
    +          "key": "isResponseAnswerText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": true,
    +          "valueType": "boolean"
    +        },
    +        {
    +          "key": "quoteTemplate",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string"
    +        },
    +        {
    +          "key": "quotePrompt",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string"
    +        },
    +        {
    +          "key": "systemPrompt",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "max": 3000,
    +          "valueType": "string",
    +          "label": "core.ai.Prompt",
    +          "description": "core.app.tip.chatNodeSystemPromptTip",
    +          "placeholder": "core.app.tip.chatNodeSystemPromptTip",
    +          "selectedTypeIndex": 1,
    +          "value": [
    +            "1ljV0oTq4zeC",
    +            "httpRawResponse"
    +          ]
    +        },
    +        {
    +          "key": "history",
    +          "renderTypeList": [
    +            "numberInput",
    +            "reference"
    +          ],
    +          "valueType": "chatHistory",
    +          "label": "core.module.input.label.chat history",
    +          "required": true,
    +          "min": 0,
    +          "max": 30,
    +          "value": 6
    +        },
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "toolDescription": "用户问题",
    +          "value": [
    +            "448745",
    +            "userChatInput"
    +          ]
    +        },
    +        {
    +          "key": "quoteQA",
    +          "renderTypeList": [
    +            "settingDatasetQuotePrompt"
    +          ],
    +          "label": "",
    +          "debugLabel": "知识库引用",
    +          "description": "",
    +          "valueType": "datasetQuote"
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "history",
    +          "key": "history",
    +          "label": "core.module.output.label.New context",
    +          "description": "core.module.output.description.New context",
    +          "valueType": "chatHistory",
    +          "type": "static"
    +        },
    +        {
    +          "id": "answerText",
    +          "key": "answerText",
    +          "label": "core.module.output.label.Ai response content",
    +          "description": "core.module.output.description.Ai response content",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "FYLw1BokYUad",
    +      "name": "文本加工",
    +      "intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。",
    +      "avatar": "/imgs/workflow/textEditor.svg",
    +      "flowNodeType": "pluginModule",
    +      "showStatus": false,
    +      "position": {
    +        "x": 2479.5913201989906,
    +        "y": 288.52613614690904
    +      },
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "valueType": "dynamic",
    +          "label": "动态外部数据",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "required": false,
    +          "description": "",
    +          "canEdit": false,
    +          "value": "",
    +          "editField": {
    +            "key": true
    +          },
    +          "dynamicParamDefaultValue": {
    +            "inputType": "reference",
    +            "valueType": "string",
    +            "required": true
    +          }
    +        },
    +        {
    +          "key": "q",
    +          "valueType": "string",
    +          "label": "q",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "required": true,
    +          "description": "",
    +          "canEdit": true,
    +          "editField": {
    +            "key": true
    +          },
    +          "value": [
    +            "448745",
    +            "userChatInput"
    +          ]
    +        },
    +        {
    +          "key": "response",
    +          "valueType": "string",
    +          "label": "response",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "required": true,
    +          "description": "",
    +          "canEdit": true,
    +          "editField": {
    +            "key": true
    +          },
    +          "value": [
    +            "1ljV0oTq4zeC",
    +            "yw0oz9XWFXYf"
    +          ]
    +        },
    +        {
    +          "key": "文本",
    +          "valueType": "string",
    +          "label": "文本",
    +          "renderTypeList": [
    +            "textarea"
    +          ],
    +          "required": true,
    +          "description": "",
    +          "canEdit": false,
    +          "value": "请使用下面<data> </data>中的数据作为本次对话的参考。请直接输出答案,不要提及你是从<data> </data>中获取的知识。\n\n当前时间:{{cTime}}\n\n<data>\n{{response}}\n</data>\n\n我的问题:\"{{q}}\"",
    +          "editField": {
    +            "key": true
    +          },
    +          "maxLength": "",
    +          "dynamicParamDefaultValue": {
    +            "inputType": "reference",
    +            "valueType": "string",
    +            "required": true
    +          }
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "text",
    +          "type": "static",
    +          "key": "text",
    +          "valueType": "string",
    +          "label": "text",
    +          "description": ""
    +        }
    +      ],
    +      "pluginId": "community-textEditor"
    +    },
    +    {
    +      "nodeId": "EX0g9oK3sCOC",
    +      "name": "AI 对话",
    +      "intro": "AI 大模型对话",
    +      "avatar": "/imgs/workflow/AI.png",
    +      "flowNodeType": "chatNode",
    +      "showStatus": true,
    +      "position": {
    +        "x": 3199.17223136331,
    +        "y": -100.06379812849427
    +      },
    +      "inputs": [
    +        {
    +          "key": "model",
    +          "renderTypeList": [
    +            "settingLLMModel",
    +            "reference"
    +          ],
    +          "label": "core.module.input.label.aiModel",
    +          "valueType": "string",
    +          "value": "gpt-3.5-turbo"
    +        },
    +        {
    +          "key": "temperature",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 0,
    +          "valueType": "number",
    +          "min": 0,
    +          "max": 10,
    +          "step": 1
    +        },
    +        {
    +          "key": "maxToken",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 2000,
    +          "valueType": "number",
    +          "min": 100,
    +          "max": 4000,
    +          "step": 50
    +        },
    +        {
    +          "key": "isResponseAnswerText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": true,
    +          "valueType": "boolean"
    +        },
    +        {
    +          "key": "quoteTemplate",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string"
    +        },
    +        {
    +          "key": "quotePrompt",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string"
    +        },
    +        {
    +          "key": "systemPrompt",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "max": 3000,
    +          "valueType": "string",
    +          "label": "core.ai.Prompt",
    +          "description": "core.app.tip.chatNodeSystemPromptTip",
    +          "placeholder": "core.app.tip.chatNodeSystemPromptTip"
    +        },
    +        {
    +          "key": "history",
    +          "renderTypeList": [
    +            "numberInput",
    +            "reference"
    +          ],
    +          "valueType": "chatHistory",
    +          "label": "core.module.input.label.chat history",
    +          "required": true,
    +          "min": 0,
    +          "max": 30,
    +          "value": 6
    +        },
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "toolDescription": "用户问题",
    +          "value": [
    +            "FYLw1BokYUad",
    +            "text"
    +          ]
    +        },
    +        {
    +          "key": "quoteQA",
    +          "renderTypeList": [
    +            "settingDatasetQuotePrompt"
    +          ],
    +          "label": "",
    +          "debugLabel": "知识库引用",
    +          "description": "",
    +          "valueType": "datasetQuote"
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "history",
    +          "key": "history",
    +          "label": "core.module.output.label.New context",
    +          "description": "core.module.output.description.New context",
    +          "valueType": "chatHistory",
    +          "type": "static"
    +        },
    +        {
    +          "id": "answerText",
    +          "key": "answerText",
    +          "label": "core.module.output.label.Ai response content",
    +          "description": "core.module.output.description.Ai response content",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "lG52GzzMm65z",
    +      "name": "文本内容提取",
    +      "intro": "可从文本中提取指定的数据,例如:sql语句、搜索关键词、代码等",
    +      "avatar": "/imgs/workflow/extract.png",
    +      "flowNodeType": "contentExtract",
    +      "showStatus": true,
    +      "position": {
    +        "x": 535.331344778598,
    +        "y": -437.1382636373696
    +      },
    +      "inputs": [
    +        {
    +          "key": "model",
    +          "renderTypeList": [
    +            "selectLLMModel",
    +            "reference"
    +          ],
    +          "label": "core.module.input.label.aiModel",
    +          "required": true,
    +          "valueType": "string",
    +          "llmModelType": "extractFields",
    +          "value": "gpt-3.5-turbo"
    +        },
    +        {
    +          "key": "description",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "label": "提取要求描述",
    +          "description": "给AI一些对应的背景知识或要求描述,引导AI更好的完成任务。\n该输入框可使用全局变量。",
    +          "placeholder": "例如: \n1. 当前时间为: {{cTime}}。你是一个实验室预约助手,你的任务是帮助用户预约实验室,从文本中获取对应的预约信息。\n2. 你是谷歌搜索助手,需要从文本中提取出合适的搜索词。",
    +          "value": "你是谷歌搜索机器人,根据当前问题和对话记录生成搜索词。你需要自行判断是否需要进行网络实时查询:\n- 如果需查询则生成搜索词。\n- 如果不需要查询则不返回字段。"
    +        },
    +        {
    +          "key": "history",
    +          "renderTypeList": [
    +            "numberInput",
    +            "reference"
    +          ],
    +          "valueType": "chatHistory",
    +          "label": "core.module.input.label.chat history",
    +          "required": true,
    +          "min": 0,
    +          "max": 30,
    +          "value": 6
    +        },
    +        {
    +          "key": "content",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "label": "需要提取的文本",
    +          "required": true,
    +          "valueType": "string",
    +          "toolDescription": "需要检索的内容",
    +          "value": [
    +            "448745",
    +            "userChatInput"
    +          ]
    +        },
    +        {
    +          "key": "extractKeys",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "label": "",
    +          "valueType": "any",
    +          "description": "由 '描述' 和 'key' 组成一个目标字段,可提取多个目标字段",
    +          "value": [
    +            {
    +              "required": false,
    +              "defaultValue": "",
    +              "desc": "搜索词",
    +              "key": "searchKey",
    +              "enum": ""
    +            }
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "fields",
    +          "key": "fields",
    +          "label": "完整提取结果",
    +          "description": "一个 JSON 字符串,例如:{\"name:\":\"YY\",\"Time\":\"2023/7/2 18:00\"}",
    +          "valueType": "string",
    +          "type": "static"
    +        },
    +        {
    +          "id": "6yF19MRD3nuB",
    +          "key": "searchKey",
    +          "label": "提取结果-搜索词",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    }
    +  ],
    +  "edges": [
    +    {
    +      "source": "TWD5BAqIIFaj",
    +      "target": "Nc6hBdb3l9Pe",
    +      "sourceHandle": "TWD5BAqIIFaj-source-IF",
    +      "targetHandle": "Nc6hBdb3l9Pe-target-left"
    +    },
    +    {
    +      "source": "1ljV0oTq4zeC",
    +      "target": "FYLw1BokYUad",
    +      "sourceHandle": "1ljV0oTq4zeC-source-right",
    +      "targetHandle": "FYLw1BokYUad-target-left"
    +    },
    +    {
    +      "source": "FYLw1BokYUad",
    +      "target": "EX0g9oK3sCOC",
    +      "sourceHandle": "FYLw1BokYUad-source-right",
    +      "targetHandle": "EX0g9oK3sCOC-target-left"
    +    },
    +    {
    +      "source": "448745",
    +      "target": "lG52GzzMm65z",
    +      "sourceHandle": "448745-source-right",
    +      "targetHandle": "lG52GzzMm65z-target-left"
    +    },
    +    {
    +      "source": "lG52GzzMm65z",
    +      "target": "TWD5BAqIIFaj",
    +      "sourceHandle": "lG52GzzMm65z-source-right",
    +      "targetHandle": "TWD5BAqIIFaj-target-left"
    +    },
    +    {
    +      "source": "TWD5BAqIIFaj",
    +      "target": "1ljV0oTq4zeC",
    +      "sourceHandle": "TWD5BAqIIFaj-source-ELSE",
    +      "targetHandle": "1ljV0oTq4zeC-target-left"
    +    }
    +  ]
    +}
    +

    流程说明

    1. 利用【文本内容提取】模块,将用户的问题提取成搜索关键词。
    2. 将搜索关键词传入【HTTP请求】模块,执行谷歌搜索。
    3. 利用【文本加工】模块组合搜索结果和问题,生成一个适合模型回答的问题。
    4. 将新的问题发给【AI对话】模块,回答搜索结果。
    + + + + \ No newline at end of file diff --git a/docs/use-cases/app-cases/index.html b/docs/use-cases/app-cases/index.html new file mode 100644 index 000000000000..05b866589acf --- /dev/null +++ b/docs/use-cases/app-cases/index.html @@ -0,0 +1,44 @@ +应用搭建案例 | FastGPT
    +
    + + + + \ No newline at end of file diff --git a/docs/use-cases/app-cases/index.xml b/docs/use-cases/app-cases/index.xml new file mode 100644 index 000000000000..771fb70c9c1b --- /dev/null +++ b/docs/use-cases/app-cases/index.xml @@ -0,0 +1,63 @@ +应用搭建案例 on FastGPThttps://doc.tryfastgpt.ai/docs/use-cases/app-cases/Recent content in 应用搭建案例 on FastGPTHugo -- gohugo.iozh-cn如何提交应用模板https://doc.tryfastgpt.ai/docs/use-cases/app-cases/submit_application_template/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/submit_application_template/什么模板可以合并 link目前合并进仓库的应用模板,会在「模板市场」中全部展示给用户。 +为了控制模板的质量以及避免数量过多带来的繁琐,并不是所有的模板都会被合并到开源仓库中,你可以提前 PR 与我们沟通模板的内容。 +预估最后总体的数量不会很多,控制在 50 个左右,一半来自 FastGPT Team,一半来自社区用户。 +如何写一个应用模板 link 跑通 FastGPT dev 环境 link 需要在 dev 环境下执行下面的操作。 +可参照 FastGPT|快速开始本地开发 +在 FastGPT 工作台中,创建一个应用 link 创建空白工作流即可。 +创建应用模板 link 应用模板配置以及相关资源,都会在 packages/templates/src 目录下。 +在packages/templates/src 目录下,创建一个文件夹,名称为模板对应的 id。 在刚刚创建的文件夹中,再创建一个 template.json 文件,复制粘贴并填写如下配置: { &#34;name&#34;: &#34;模板名&#34;, &#34;intro&#34;: &#34;模板描述,会展示在模板市场的展示页&#34;, &#34;author&#34;: &#34;填写你的名字&#34;, &#34;avatar&#34;: &#34;模板头像,可以将图片文件放在同一个文件夹中,然后填写相应路径&#34;, &#34;tags&#34;: [&#34;模板标签&#34;], // writing(文本创作),image-generation(图片生成),web-search(联网搜索), // roleplay(角色扮演), office-services(办公服务) 暂时分为 5 类,从中选择相应的标签 &#34;type&#34;: &#34;模板类别&#34;, // simple(简易应用), advanced(工作流), plugin(插件) &#34;workflow&#34;: { // 这个对象先不管,待会直接粘贴导出的工作流即可 &#34;nodes&#34;: [], &#34;edges&#34;: [], &#34;chatConfig&#34;: {} } } 完成应用编排并测试 link 完成应用编排后,可以点击右上角的发布。长字幕翻译https://doc.tryfastgpt.ai/docs/use-cases/app-cases/translate-subtitle-using-gpt/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/translate-subtitle-using-gpt/直接使用 LLM 来翻译长字幕会遇到很多难点,这些难点也正是直接使用 AI 无法有效处理的问题: +Tokens 限制:这是最明显的障碍。大语言模型 (LLM) 通常有输出 tokens 的限制,这意味着对于长文本,如果不使用特殊的工作流,可能需要手动将文本分段,逐段输入 AI 进行翻译,然后再手动拼接结果。这个过程不仅繁琐,还容易出错。 +字幕格式的保持:对于字幕来说,时间轴信息至关重要。然而,AI 模型有时会产生 “幻觉”,即无中生有地修改或生成不存在的信息。在字幕翻译中,这可能导致 AI 错误地修改时间轴,使字幕与音频不同步。 +翻译质量:简单的机器翻译往往无法满足观众的需求。即使是大语言模型,单轮翻译的质量也常常不尽如人意。对于字幕来说,翻译质量直接影响观看体验,糟糕的翻译会严重影响观众的沉浸感。 +本案例将展示如何利用 FastGPT 工作流代码结合 LLM 来有效解决这些问题。我们的方法不仅能克服技术限制,还能显著提升翻译质量。 +提取字幕信息 link工作流的一大优势在于可以结合额外的操作,使 AI 能更精准地处理信息。在字幕翻译中,我们可以先分离 SRT 字幕文件的各个组成部分,然后只让 LLM 翻译文本部分。这种方法既节约了 token 使用,又确保了时间轴信息不被误改。 +具体实现如下: +使用代码执行模块,对输入的原始字幕文本进行解析。 将字幕信息分类为三部分:时间信息、序号信息和文本信息。 只保留文本信息用于后续的 AI 翻译。 这种预处理步骤大大提高了整个翻译过程的效率和准确性。 +切分文本 link为了进一步优化翻译过程,我们需要将提取出的文本信息重新组织。这一步的目的是将文本分割成适合 LLM 处理的大小,同时保持上下文的连贯性。 +在本例中,我们采用以下策略: +将文本按照每 40 句为一组进行切分。这个数字是经过多次测试后得出的平衡点,既能保证翻译质量,又不会超出 LLM 的处理能力。 使用 标签分割每句文本。这种标记方法便于后续的重新组装,同时也为 AI 模型提供了清晰的句子边界。 这种切分方法既考虑了 AI 模型的能力限制,又保证了翻译的连贯性。通过保持适当的上下文,我们可以得到更加准确和自然的翻译结果。 +格式化原文本 link在这一步,我们构建了最终输入给 LLM 的原文本。这个步骤的关键在于如何在控制 tokens 数量的同时,为 AI 提供足够的上下文信息。我们采用了以下策略: +传入所有文本作为背景上下文。这确保 AI 能理解整段对话的语境。 使用&lt;TRANSLATE_THIS&gt;标签明确指出当前需要翻译的片段。这种方法既能控制 AI 的输出范围,又不会丢失整体语境。 这种格式化方法使得 AI 能在理解全局的基础上,专注于翻译特定部分,从而提高翻译的准确性和连贯性。多轮翻译机器人https://doc.tryfastgpt.ai/docs/use-cases/app-cases/multi_turn_translation_bot/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/multi_turn_translation_bot/吴恩达老师提出了一种反思翻译的大语言模型(LLM)翻译工作流程——GitHub - andrewyng/translation-agent,具体工作流程如下: +提示一个 LLM 将文本从 source_language 翻译到 target_language; 让 LLM 反思翻译结果并提出建设性的改进建议; 使用这些建议来改进翻译。 这个翻译流程应该是目前比较新的一种翻译方式,利用 LLM 对自己的翻译结果进行改进来获得较好的翻译效果 +项目中展示了可以利用对长文本进行分片,然后分别进行反思翻译处理,以突破 LLM 对 tokens 数量的限制,真正实现长文本一键高效率高质量翻译。 +项目还通过给大模型限定国家地区,已实现更精确的翻译,如美式英语、英式英语之分;同时提出一些可能能带来更好效果的优化,如对于一些 LLM 未曾训练到的术语(或有多种翻译方式的术语)建立术语表,进一步提升翻译的精确度等等 +而这一切都能通过 Fastgpt 工作流轻松实现,本文将手把手教你如何复刻吴恩达老师的 translation-agent +单文本块反思翻译 link先从简单的开始,即不超出 LLM tokens 数量限制的单文本块翻译 +初始翻译 link第一步先让 LLM 对源文本块进行初始翻译(翻译的提示词在源项目中都有) +通过文本拼接模块引用 源语言、目标语言、源文本这三个参数,生成提示词,传给 LLM,让它给出第一版的翻译 +反思 link然后让 LLM 对第一步生成的初始翻译给出修改建议,称之为 反思 +这时的提示词接收 5 个参数,源文本、初始翻译、源语言、目标语言 以及限定词地区国家,这样 LLM 会对前面生成的翻译提出相当多的修改建议,为后续的提升翻译作准备 +提升翻译 link 在前文生成了初始翻译以及相应的反思后,将这二者输入给第三次 LLM 翻译,这样我们就能获得一个比较高质量的翻译结果 +完整的工作流如下 +运行效果 link由于考虑之后对这个反思翻译的复用,所以创建了一个插件,那么在下面我直接调用这个插件就能使用反思翻译,效果如下 +随机挑选了一段哈利波特的文段 +可以看到反思翻译后的效果还是好上不少的,其中反思的输出如下 +长文反思翻译 link在掌握了对短文本块的反思翻译后,我们能轻松的通过分片和循环,实现对长文本也即多文本块的反思翻译 +整体的逻辑是,首先对传入文本的 tokens数量做判断,如果不超过设置的 tokens 限制,那么直接调用单文本块反思翻译,如果超过设置的 tokens限制,那么切割为合理的大小,再分别进行对应的反思翻译处理 +计算 tokens link 首先,我使用了 Laf函数 模块来实现对输入文本的 tokens 的计算英语作文纠错机器人https://doc.tryfastgpt.ai/docs/use-cases/app-cases/english_essay_correction_bot/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/english_essay_correction_bot/FastGPT 提供了一种基于 LLM Model 搭建应用的简便方式。 +本文通过搭建一个英语作文纠错机器人,介绍一下如何使用 工作流 +搭建过程 link1. 创建工作流 link 可以从 多轮翻译机器人 开始创建。 +多轮翻译机器人是 @米开朗基杨 同学创建的,同样也是一个值得学习的工作流。 +2. 获取输入,使用大模型进行分析 link我们期望让大模型处理文字,返回一个结构化的数据,由我们自己处理。 +提示词 是最重要的一个参数,这里提供的提示词仅供参考: +## 角色 资深英语写作专家 ## 任务 对输入的原文进行分析。 找出其中的各种错误, 包括但不限于单词拼写错误、 语法错误等。 注意: 忽略标点符号前后空格的问题。 注意: 对于存在错误的句子, 提出修改建议是指指出这个句子中的具体部分, 然后提出将这一个部分修改替换为什么。 ## 输出格式 不要使用 Markdown 语法, 输入 JSON 格式的内容。 输出的&#34;reason&#34;的内容使用中文。 直接输出一个列表, 其成员为一个相同类型的对象, 定义如下 您正在找回 FastGPT 账号 ``` { “raw”: string; // 表示原文 “reason”: string; // 表示原因 “suggestion”: string; // 修改建议 } ``` 可以在模型选择的窗口中设置禁用 AI 回复。固定开头和结尾内容https://doc.tryfastgpt.ai/docs/use-cases/app-cases/fixingevidence/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/fixingevidence/如上图,可以通过指定回复编排一个固定的开头和结尾内容。 +模块编排 link复制下面配置,点击「高级编排」右上角的导入按键,导入该配置。 +编排配置 { &#34;nodes&#34;: [ { &#34;nodeId&#34;: &#34;7z5g5h&#34;, &#34;name&#34;: &#34;流程开始&#34;, &#34;intro&#34;: &#34;&#34;, &#34;avatar&#34;: &#34;/imgs/workflow/userChatInput.svg&#34;, &#34;flowNodeType&#34;: &#34;workflowStart&#34;, &#34;position&#34;: { &#34;x&#34;: -269.50851681351924, &#34;y&#34;: 1657.6123698022448 }, &#34;inputs&#34;: [ { &#34;key&#34;: &#34;userChatInput&#34;, &#34;renderTypeList&#34;: [ &#34;reference&#34;, &#34;textarea&#34; ], &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;问题输入&#34;, &#34;required&#34;: true, &#34;toolDescription&#34;: &#34;用户问题&#34;, &#34;type&#34;: &#34;systemInput&#34;, &#34;showTargetInApp&#34;: false, &#34;showTargetInPlugin&#34;: false, &#34;connected&#34;: false, &#34;selectedTypeIndex&#34;: 0, &#34;value&#34;: [ &#34;7z5g5h&#34;, &#34;userChatInput&#34; ] } ], &#34;outputs&#34;: [ { &#34;id&#34;: &#34;userChatInput&#34;, &#34;type&#34;: &#34;static&#34;, &#34;key&#34;: &#34;userChatInput&#34;, &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;core.实验室预约https://doc.tryfastgpt.ai/docs/use-cases/app-cases/lab_appointment/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/lab_appointment/本示例演示了利用工具调用,自动选择调用知识库搜索实验室相关内容,或调用 HTTP 模块实现数据库的 CRUD 操作。 +以一个实验室预约为例,用户可以通过对话系统预约、取消、修改预约和查询预约记录。 +1. 全局变量使用 link通过设计一个全局变量,让用户输入姓名,模拟用户身份信息。实际使用过程中,通常是直接通过嵌入 Token 来标记用户身份。 +2. 工具调用 link 背景知识中,引导模型调用工具去执行不通的操作。 +🤗 +Tips: 这里需要增加适当的上下文,方便模型结合历史纪录进行判断和决策~ +3. HTTP 模块 link HTTP模块中,需要设置 3 个工具参数: +预约行为:可取 get, put, post, delete 四个值,分别对应查询、修改、新增、删除操作。当然,你也可以写4个HTTP模块,来分别处理。 labname: 实验室名。非必填,因为查询和删除时候,不需要。 time: 预约时间。 总结 link 工具调用模块是非常强大的功能,可以在一定程度上替代问题分类和内容提取。 通过工具模块,动态的调用不同的工具,可以将复杂业务解耦。 附件 link编排配置 link可直接复制,导入到 FastGPT 中。 +编排配置 { &#34;nodes&#34;: [ { &#34;nodeId&#34;: &#34;userChatInput&#34;, &#34;name&#34;: &#34;流程开始&#34;, &#34;intro&#34;: &#34;当用户发送一个内容后,流程将会从这个模块开始执行。&#34;, &#34;avatar&#34;: &#34;/imgs/workflow/userChatInput.svg&#34;, &#34;flowNodeType&#34;: &#34;workflowStart&#34;, &#34;position&#34;: { &#34;x&#34;: 309.7143912167367, &#34;y&#34;: 1501.2761754220846 }, &#34;inputs&#34;: [ { &#34;key&#34;: &#34;userChatInput&#34;, &#34;renderTypeList&#34;: [ &#34;reference&#34;, &#34;textarea&#34; ], &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;问题输入&#34;, &#34;required&#34;: true, &#34;toolDescription&#34;: &#34;用户问题&#34;, &#34;type&#34;: &#34;systemInput&#34;, &#34;showTargetInApp&#34;: false, &#34;showTargetInPlugin&#34;: false, &#34;connected&#34;: false, &#34;selectedTypeIndex&#34;: 0, &#34;value&#34;: [ &#34;userChatInput&#34;, &#34;userChatInput&#34; ] } ], &#34;outputs&#34;: [ { &#34;id&#34;: &#34;userChatInput&#34;, &#34;type&#34;: &#34;static&#34;, &#34;key&#34;: &#34;userChatInput&#34;, &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;core.Dalle3 绘图https://doc.tryfastgpt.ai/docs/use-cases/app-cases/dalle3/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/dalle3/OpenAI Dalle3 接口 link先来看下官方接口的参数和响应值: +Body +{ &#34;model&#34;: &#34;dall-e-3&#34;, &#34;prompt&#34;: &#34;A cute baby sea otter&#34;, &#34;n&#34;: 1, &#34;size&#34;: &#34;1024x1024&#34; } Response +{ &#34;created&#34;: 1589478378, &#34;data&#34;: [ { &#34;url&#34;: &#34;https://...&#34; }, { &#34;url&#34;: &#34;https://...&#34; } ] } 编排思路 link 通过 AI 来优化图片绘制的提示词(这步省略了,自己找提示词即可) 通过 【HTTP 请求】模块 调用 Dalle3 接口,获取图片的 URL。 通过 【文本加工】模块 来构建 Markdown 的图片格式。 通过 【指定回复】模块 来直接输出图片链接。 1. 构建 HTTP 模块 link请求参数直接复制 Dalle3 接口的即可,并求改 prompt 为变量。需要增加一个 Headers.Authorization 。 +Body: +{ &#34;model&#34;: &#34;dall-e-3&#34;, &#34;prompt&#34;: &#34;{{prompt}}&#34;, &#34;n&#34;: 1, &#34;size&#34;: &#34;1024x1024&#34; } Headers:接入谷歌搜索https://doc.tryfastgpt.ai/docs/use-cases/app-cases/google_search/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/google_search/工具调用模式 工具调用模式 非工具调用模式 非工具调用模式 如上图,利用「HTTP请求」模块,你可以外接一个搜索引擎作为 AI 回复的参考资料。这里以调用 Google Search API 为例。注意:本文主要是为了介绍 「HTTP请求」模块,具体的搜索效果需要依赖提示词和搜索引擎,尤其是【搜索引擎】,简单的搜索引擎无法获取更详细的内容,这部分可能需要更多的调试。 +注册 Google Search API link参考这篇文章,每天可以免费使用 100 次。 +写一个 Google Search 接口 link这里用 Laf 快速实现一个接口,即写即发布,无需部署。务必打开 POST 请求方式。 +Laf 谷歌搜索Demo import cloud from &#39;@lafjs/cloud&#39; const googleSearchKey = &#34;xxx&#34; const googleCxId = &#34;3740cxxx&#34; const baseurl = &#34;https://www.googleapis.com/customsearch/v1&#34; type RequestType = { searchKey: string } export default async function (ctx: FunctionContext) { const { searchKey } = ctx.body as RequestType console.log(ctx.body) if (!发送飞书webhook通知https://doc.tryfastgpt.ai/docs/use-cases/app-cases/feishu_webhook/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/feishu_webhook/该文章展示如何发送一个简单的飞书webhook通知,以此类推,发送其他类型的通知也可以这么操作。 +1. 准备飞书机器人 link 2. 导入编排代码 link复制下面配置,点击「高级编排」右上角的导入按键,导入该配置,导入后将飞书提供的接口地址复制到「HTTP 模块」。 +编排配置 { &#34;nodes&#34;: [ { &#34;nodeId&#34;: &#34;userGuide&#34;, &#34;name&#34;: &#34;系统配置&#34;, &#34;intro&#34;: &#34;可以配置应用的系统参数&#34;, &#34;avatar&#34;: &#34;/imgs/workflow/userGuide.png&#34;, &#34;flowNodeType&#34;: &#34;userGuide&#34;, &#34;position&#34;: { &#34;x&#34;: 303.41163758039283, &#34;y&#34;: -552.297639861266 }, &#34;version&#34;: &#34;481&#34;, &#34;inputs&#34;: [], &#34;outputs&#34;: [] }, { &#34;nodeId&#34;: &#34;workflowStartNodeId&#34;, &#34;name&#34;: &#34;流程开始&#34;, &#34;intro&#34;: &#34;&#34;, &#34;avatar&#34;: &#34;/imgs/workflow/userChatInput.svg&#34;, &#34;flowNodeType&#34;: &#34;workflowStart&#34;, &#34;position&#34;: { &#34;x&#34;: 529.3935295017156, &#34;y&#34;: 197.114018410347 }, &#34;version&#34;: &#34;481&#34;, &#34;inputs&#34;: [ { &#34;key&#34;: &#34;userChatInput&#34;, &#34;renderTypeList&#34;: [ &#34;reference&#34;, &#34;textarea&#34; ], &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;用户问题&#34;, &#34;required&#34;: true, &#34;toolDescription&#34;: &#34;用户问题&#34; } ], &#34;outputs&#34;: [ { &#34;id&#34;: &#34;userChatInput&#34;, &#34;key&#34;: &#34;userChatInput&#34;, &#34;label&#34;: &#34;core. \ No newline at end of file diff --git a/docs/use-cases/app-cases/lab_appointment/index.html b/docs/use-cases/app-cases/lab_appointment/index.html new file mode 100644 index 000000000000..9e0a807caeb0 --- /dev/null +++ b/docs/use-cases/app-cases/lab_appointment/index.html @@ -0,0 +1,823 @@ +实验室预约 | FastGPT
    +
    database

    实验室预约

    展示高级编排操作数据库的能力

    本示例演示了利用工具调用,自动选择调用知识库搜索实验室相关内容,或调用 HTTP 模块实现数据库的 CRUD 操作。

    以一个实验室预约为例,用户可以通过对话系统预约、取消、修改预约和查询预约记录。

    1. 全局变量使用

    通过设计一个全局变量,让用户输入姓名,模拟用户身份信息。实际使用过程中,通常是直接通过嵌入 Token 来标记用户身份。

    2. 工具调用

    背景知识中,引导模型调用工具去执行不通的操作。

    3. HTTP 模块

    HTTP模块中,需要设置 3 个工具参数:

    • 预约行为:可取 get, put, post, delete 四个值,分别对应查询、修改、新增、删除操作。当然,你也可以写4个HTTP模块,来分别处理。
    • labname: 实验室名。非必填,因为查询和删除时候,不需要。
    • time: 预约时间。

    总结

    1. 工具调用模块是非常强大的功能,可以在一定程度上替代问题分类和内容提取。
    2. 通过工具模块,动态的调用不同的工具,可以将复杂业务解耦。

    附件

    编排配置

    可直接复制,导入到 FastGPT 中。

    编排配置
    {
    +  "nodes": [
    +    {
    +      "nodeId": "userChatInput",
    +      "name": "流程开始",
    +      "intro": "当用户发送一个内容后,流程将会从这个模块开始执行。",
    +      "avatar": "/imgs/workflow/userChatInput.svg",
    +      "flowNodeType": "workflowStart",
    +      "position": {
    +        "x": 309.7143912167367,
    +        "y": 1501.2761754220846
    +      },
    +      "inputs": [
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "问题输入",
    +          "required": true,
    +          "toolDescription": "用户问题",
    +          "type": "systemInput",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0,
    +          "value": [
    +            "userChatInput",
    +            "userChatInput"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "userChatInput",
    +          "type": "static",
    +          "key": "userChatInput",
    +          "valueType": "string",
    +          "label": "core.module.input.label.user question"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "eg5upi",
    +      "name": "指定回复",
    +      "intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
    +      "avatar": "/imgs/workflow/reply.png",
    +      "flowNodeType": "answerNode",
    +      "position": {
    +        "x": 1962.729630445213,
    +        "y": 2295.9791334948304
    +      },
    +      "inputs": [
    +        {
    +          "key": "text",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "valueType": "any",
    +          "label": "core.module.input.label.Response content",
    +          "description": "core.module.input.description.Response content",
    +          "placeholder": "core.module.input.description.Response content",
    +          "type": "textarea",
    +          "showTargetInApp": true,
    +          "showTargetInPlugin": true,
    +          "connected": true,
    +          "selectedTypeIndex": 1,
    +          "value": [
    +            "40clf3",
    +            "result"
    +          ]
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "kge59i",
    +      "name": "用户引导",
    +      "intro": "可以配置应用的系统参数。",
    +      "avatar": "/imgs/workflow/userGuide.png",
    +      "flowNodeType": "userGuide",
    +      "position": {
    +        "x": -327.218389965887,
    +        "y": 1504.8056414948464
    +      },
    +      "inputs": [
    +        {
    +          "key": "welcomeText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "core.app.Welcome Text",
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "value": "你好,我是实验室助手,请问有什么可以帮助你的么?如需预约或修改预约实验室,请提供姓名、时间和实验室名称。\n[实验室介绍]\n[开放时间]\n[预约]",
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "variables",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "core.module.Variable",
    +          "value": [
    +            {
    +              "id": "gt9b23",
    +              "key": "name",
    +              "label": "name",
    +              "type": "input",
    +              "required": true,
    +              "maxLen": 50,
    +              "enums": [
    +                {
    +                  "value": ""
    +                }
    +              ]
    +            }
    +          ],
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "questionGuide",
    +          "valueType": "boolean",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "type": "switch",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "value": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "tts",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "value": {
    +            "type": "model",
    +            "model": "tts-1",
    +            "voice": "alloy"
    +          },
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "whisper",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "scheduleTrigger",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": null
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "40clf3",
    +      "name": "HTTP请求",
    +      "intro": "可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)",
    +      "avatar": "/imgs/workflow/http.png",
    +      "flowNodeType": "httpRequest468",
    +      "showStatus": true,
    +      "position": {
    +        "x": 1118.6532653446993,
    +        "y": 1955.886106913907
    +      },
    +      "inputs": [
    +        {
    +          "key": "system_httpMethod",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "value": "POST",
    +          "required": true,
    +          "type": "custom",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "valueType": "string",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "key": "action",
    +          "label": "action",
    +          "toolDescription": "预约行为,一共四种:\nget - 查询预约情况\nput - 更新预约\npost - 新增预约\ndelete - 删除预约",
    +          "required": true,
    +          "canEdit": true,
    +          "editField": {
    +            "key": true,
    +            "description": true
    +          }
    +        },
    +        {
    +          "valueType": "string",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "key": "labname",
    +          "label": "labname",
    +          "toolDescription": "实验室名称",
    +          "required": false,
    +          "canEdit": true,
    +          "editField": {
    +            "key": true,
    +            "description": true
    +          }
    +        },
    +        {
    +          "valueType": "string",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "key": "time",
    +          "label": "time",
    +          "toolDescription": "预约时间,按 YYYY/MM/DD HH:mm 格式返回",
    +          "required": false,
    +          "canEdit": true,
    +          "editField": {
    +            "key": true,
    +            "description": true
    +          }
    +        },
    +        {
    +          "key": "system_httpReqUrl",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Url",
    +          "placeholder": "https://api.ai.com/getInventory",
    +          "required": false,
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "value": "https://d8dns0.laf.dev/appointment-lab",
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "system_httpHeader",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "valueType": "any",
    +          "value": [],
    +          "label": "",
    +          "description": "core.module.input.description.Http Request Header",
    +          "placeholder": "core.module.input.description.Http Request Header",
    +          "required": false,
    +          "type": "custom",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "system_httpParams",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": [],
    +          "label": "",
    +          "required": false,
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "system_httpJsonBody",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "value": "{\r\n  \"name\": \"{{name}}\",\r\n  \"time\": \"{{time}}\",\r\n  \"labname\": \"{{labname}}\",\r\n  \"action\": \"{{action}}\"\r\n}",
    +          "label": "",
    +          "required": false,
    +          "type": "hidden",
    +          "showTargetInApp": false,
    +          "showTargetInPlugin": false,
    +          "connected": false,
    +          "selectedTypeIndex": 0
    +        },
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "core.module.input.description.HTTP Dynamic Input",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_addOutputParam",
    +          "type": "dynamic",
    +          "key": "system_addOutputParam",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          }
    +        },
    +        {
    +          "id": "result",
    +          "type": "static",
    +          "key": "result",
    +          "valueType": "string",
    +          "label": "result",
    +          "description": "result",
    +          "canEdit": true,
    +          "editField": {
    +            "key": true,
    +            "name": true,
    +            "description": true,
    +            "dataType": true
    +          }
    +        },
    +        {
    +          "id": "httpRawResponse",
    +          "type": "static",
    +          "key": "httpRawResponse",
    +          "valueType": "any",
    +          "label": "原始响应",
    +          "description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "fYxwWym8flYL",
    +      "name": "工具调用",
    +      "intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
    +      "avatar": "/imgs/workflow/tool.svg",
    +      "flowNodeType": "tools",
    +      "showStatus": true,
    +      "position": {
    +        "x": 933.9342354248961,
    +        "y": 1229.3563445150553
    +      },
    +      "inputs": [
    +        {
    +          "key": "model",
    +          "renderTypeList": [
    +            "settingLLMModel",
    +            "reference"
    +          ],
    +          "label": "core.module.input.label.aiModel",
    +          "valueType": "string",
    +          "llmModelType": "all",
    +          "value": "gpt-3.5-turbo"
    +        },
    +        {
    +          "key": "temperature",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 0,
    +          "valueType": "number",
    +          "min": 0,
    +          "max": 10,
    +          "step": 1
    +        },
    +        {
    +          "key": "maxToken",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 2000,
    +          "valueType": "number",
    +          "min": 100,
    +          "max": 4000,
    +          "step": 50
    +        },
    +        {
    +          "key": "systemPrompt",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "max": 3000,
    +          "valueType": "string",
    +          "label": "core.ai.Prompt",
    +          "description": "core.app.tip.chatNodeSystemPromptTip",
    +          "placeholder": "core.app.tip.chatNodeSystemPromptTip",
    +          "value": "当前时间为: {{cTime}}\n你是实验室助手,用户可能会询问实验室相关介绍或预约实验室。\n请选择合适的工具去帮助他们。"
    +        },
    +        {
    +          "key": "history",
    +          "renderTypeList": [
    +            "numberInput",
    +            "reference"
    +          ],
    +          "valueType": "chatHistory",
    +          "label": "core.module.input.label.chat history",
    +          "required": true,
    +          "min": 0,
    +          "max": 30,
    +          "value": 6
    +        },
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "value": [
    +            "userChatInput",
    +            "userChatInput"
    +          ]
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "JSSQtDgwmmbE",
    +      "name": "知识库搜索",
    +      "intro": "调用“语义检索”和“全文检索”能力,从“知识库”中查找实验室介绍和使用规则等信息。",
    +      "avatar": "/imgs/workflow/db.png",
    +      "flowNodeType": "datasetSearchNode",
    +      "showStatus": true,
    +      "position": {
    +        "x": 447.0795498711184,
    +        "y": 1971.5311041711186
    +      },
    +      "inputs": [
    +        {
    +          "key": "datasets",
    +          "renderTypeList": [
    +            "selectDataset",
    +            "reference"
    +          ],
    +          "label": "core.module.input.label.Select dataset",
    +          "value": [],
    +          "valueType": "selectDataset",
    +          "list": [],
    +          "required": true
    +        },
    +        {
    +          "key": "similarity",
    +          "renderTypeList": [
    +            "selectDatasetParamsModal"
    +          ],
    +          "label": "",
    +          "value": 0.4,
    +          "valueType": "number"
    +        },
    +        {
    +          "key": "limit",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 1500,
    +          "valueType": "number"
    +        },
    +        {
    +          "key": "searchMode",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string",
    +          "value": "embedding"
    +        },
    +        {
    +          "key": "usingReRank",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "boolean",
    +          "value": false
    +        },
    +        {
    +          "key": "datasetSearchUsingExtensionQuery",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "boolean",
    +          "value": false
    +        },
    +        {
    +          "key": "datasetSearchExtensionModel",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string",
    +          "value": "gpt-3.5-turbo"
    +        },
    +        {
    +          "key": "datasetSearchExtensionBg",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string",
    +          "value": ""
    +        },
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "toolDescription": "需要检索的内容"
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "quoteQA",
    +          "key": "quoteQA",
    +          "label": "core.module.Dataset quote.label",
    +          "description": "特殊数组格式,搜索结果为空时,返回空数组。",
    +          "type": "static",
    +          "valueType": "datasetQuote"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "IdntVQiTopHT",
    +      "name": "工具调用终止",
    +      "intro": "该模块需配置工具调用使用。当该模块被执行时,本次工具调用将会强制结束,并且不再调用AI针对工具调用结果回答问题。",
    +      "avatar": "/imgs/workflow/toolStop.svg",
    +      "flowNodeType": "stopTool",
    +      "position": {
    +        "x": 1969.73331750207,
    +        "y": 2650.0258908119413
    +      },
    +      "inputs": [],
    +      "outputs": []
    +    }
    +  ],
    +  "edges": [
    +    {
    +      "source": "40clf3",
    +      "target": "eg5upi",
    +      "sourceHandle": "40clf3-source-right",
    +      "targetHandle": "eg5upi-target-left"
    +    },
    +    {
    +      "source": "userChatInput",
    +      "target": "fYxwWym8flYL",
    +      "sourceHandle": "userChatInput-source-right",
    +      "targetHandle": "fYxwWym8flYL-target-left"
    +    },
    +    {
    +      "source": "fYxwWym8flYL",
    +      "target": "40clf3",
    +      "sourceHandle": "selectedTools",
    +      "targetHandle": "selectedTools"
    +    },
    +    {
    +      "source": "fYxwWym8flYL",
    +      "target": "JSSQtDgwmmbE",
    +      "sourceHandle": "selectedTools",
    +      "targetHandle": "selectedTools"
    +    },
    +    {
    +      "source": "40clf3",
    +      "target": "IdntVQiTopHT",
    +      "sourceHandle": "40clf3-source-right",
    +      "targetHandle": "IdntVQiTopHT-target-left"
    +    }
    +  ]
    +}
    +

    Laf 云函数代码

    可以在 Laf 中快速构建 HTTP 接口。

    函数代码
    import cloud from '@lafjs/cloud'
    +const db = cloud.database()
    +
    +type RequestType = {
    +    name: string;
    +    time?: string;
    +    labname?: string;
    +    action: 'post' | 'delete' | 'put' | 'get'
    +}
    +
    +export default async function (ctx: FunctionContext) {
    +  try {
    +    const {   action,...body  } = ctx.body as RequestType
    +
    +    if (action === 'get') {
    +      return await getRecord(ctx.body)
    +    }
    +    if (action === 'post') {
    +      return await createRecord(ctx.body)
    +    }
    +    if (action === 'put') {
    +      return await putRecord(ctx.body)
    +    }
    +    if (action === 'delete') {
    +      return await removeRecord(ctx.body)
    +    }
    +
    +
    +    return {
    +      result: "异常"
    +    }
    +  } catch (err) {
    +    return {
    +      result: "异常"
    +    }
    +  }
    +}
    +
    +async function putRecord({ name, time, labname }: RequestType) {
    +  const missData = []
    +  if (!name) missData.push("你的姓名")
    +
    +  if (missData.length > 0) {
    +    return {
    +      result: `请提供: ${missData.join("、")}`
    +    }
    +  }
    +
    +  const { data: record } = await db.collection("LabAppointment").where({
    +    name, status: "unStart"
    +  }).getOne()
    +
    +  if (!record) {
    +    return {
    +      result: `${name} 还没有预约记录`
    +    }
    +  }
    +
    +  const updateWhere = {
    +    name,
    +    time: time || record.time,
    +    labname: labname || record.labname
    +  }
    +
    +  await db.collection("LabAppointment").where({
    +    name, status: "unStart"
    +  }).update(updateWhere)
    +
    +  return {
    +    result: `修改预约成功。
    +  姓名:${name}·
    +  时间: ${updateWhere.time}
    +  实验室名: ${updateWhere.labname}
    +  ` }
    +}
    +
    +
    +async function getRecord({ name }: RequestType) {
    +  if (!name) {
    +    return {
    +      result: "请提供你的姓名"
    +    }
    +  }
    +  const { data } = await db.collection('LabAppointment').where({ name, status: "unStart" }).getOne()
    +
    +  if (!data) {
    +    return {
    +      result: `${name} 没有预约中的记录`
    +    }
    +  }
    +  return {
    +    result: `${name} 有一条预约记录:
    +姓名:${data.name}
    +时间: ${data.time}
    +实验室名: ${data.labname}
    +    `
    +  }
    +}
    +
    +async function removeRecord({ name }: RequestType) {
    +  if (!name) {
    +    return {
    +      result: "请提供你的姓名"
    +    }
    +  }
    +  const { deleted } = await db.collection('LabAppointment').where({ name, status: "unStart" }).remove()
    +
    +  if (deleted > 0) {
    +    return {
    +      result: `取消预约记录成功: ${name}`
    +    }
    +  }
    +  return {
    +    result: ` ${name} 没有预约中的记录`
    +  }
    +}
    +
    +async function createRecord({ name, time, labname }: RequestType) {
    +  const missData = []
    +  if (!name) missData.push("你的姓名")
    +  if (!time) missData.push("需要预约的时间")
    +  if (!labname) missData.push("实验室名名称")
    +
    +  if (missData.length > 0) {
    +    return {
    +      result: `请提供: ${missData.join("、")}`
    +    }
    +  }
    +
    +  const { data: record } = await db.collection("LabAppointment").where({
    +    name, status: "unStart"
    +  }).getOne()
    +
    +  if (record) {
    +    return {
    +      result: `您已经有一个预约记录了:
    +姓名:${record.name}
    +时间: ${record.time}
    +实验室名: ${record.labname}
    +
    +每人仅能同时预约一个实验室名。
    +      `
    +    }
    +  }
    +
    +  await db.collection("LabAppointment").add({
    +    name, time, labname, status: "unStart"
    +  })
    +
    +  return {
    +    result: `预约成功。
    +  姓名:${name}
    +  时间: ${time}
    +  实验室名: ${labname}
    +  ` }
    +}
    +
    + + + + \ No newline at end of file diff --git a/docs/use-cases/app-cases/multi_turn_translation_bot/index.html b/docs/use-cases/app-cases/multi_turn_translation_bot/index.html new file mode 100644 index 000000000000..b169fca4ef18 --- /dev/null +++ b/docs/use-cases/app-cases/multi_turn_translation_bot/index.html @@ -0,0 +1,175 @@ +多轮翻译机器人 | FastGPT
    +
    translate

    多轮翻译机器人

    如何使用 FastGPT 构建一个多轮翻译机器人,实现连续的对话翻译功能

    吴恩达老师提出了一种反思翻译的大语言模型(LLM)翻译工作流程——GitHub - andrewyng/translation-agent,具体工作流程如下:

    1. 提示一个 LLM 将文本从 source_language 翻译到 target_language
    2. 让 LLM 反思翻译结果并提出建设性的改进建议;
    3. 使用这些建议来改进翻译。

    这个翻译流程应该是目前比较新的一种翻译方式,利用 LLM 对自己的翻译结果进行改进来获得较好的翻译效果

    项目中展示了可以利用对长文本进行分片,然后分别进行反思翻译处理,以突破 LLM 对 tokens 数量的限制,真正实现长文本一键高效率高质量翻译。

    项目还通过给大模型限定国家地区,已实现更精确的翻译,如美式英语、英式英语之分;同时提出一些可能能带来更好效果的优化,如对于一些 LLM 未曾训练到的术语(或有多种翻译方式的术语)建立术语表,进一步提升翻译的精确度等等

    而这一切都能通过 Fastgpt 工作流轻松实现,本文将手把手教你如何复刻吴恩达老师的 translation-agent

    单文本块反思翻译

    先从简单的开始,即不超出 LLM tokens 数量限制的单文本块翻译

    初始翻译

    第一步先让 LLM 对源文本块进行初始翻译(翻译的提示词在源项目中都有)

    通过文本拼接模块引用 源语言、目标语言、源文本这三个参数,生成提示词,传给 LLM,让它给出第一版的翻译

    反思

    然后让 LLM 对第一步生成的初始翻译给出修改建议,称之为 反思

    这时的提示词接收 5 个参数,源文本、初始翻译、源语言、目标语言 以及限定词地区国家,这样 LLM 会对前面生成的翻译提出相当多的修改建议,为后续的提升翻译作准备

    提升翻译

    在前文生成了初始翻译以及相应的反思后,将这二者输入给第三次 LLM 翻译,这样我们就能获得一个比较高质量的翻译结果

    完整的工作流如下

    运行效果

    由于考虑之后对这个反思翻译的复用,所以创建了一个插件,那么在下面我直接调用这个插件就能使用反思翻译,效果如下

    随机挑选了一段哈利波特的文段

    可以看到反思翻译后的效果还是好上不少的,其中反思的输出如下

    长文反思翻译

    在掌握了对短文本块的反思翻译后,我们能轻松的通过分片和循环,实现对长文本也即多文本块的反思翻译

    整体的逻辑是,首先对传入文本的 tokens数量做判断,如果不超过设置的 tokens 限制,那么直接调用单文本块反思翻译,如果超过设置的 tokens限制,那么切割为合理的大小,再分别进行对应的反思翻译处理

    计算 tokens

    首先,我使用了 Laf函数 模块来实现对输入文本的 tokens 的计算

    laf函数的使用相当简单,即开即用,只需要在 laf 创建个应用,然后安装 tiktoken 依赖,导入如下代码即可

    +  const { Tiktoken } = require("tiktoken/lite");
    +const cl100k_base = require("tiktoken/encoders/cl100k_base.json");
    +
    +interface IRequestBody {
    +  str: string
    +}
    +
    +interface RequestProps extends IRequestBody {
    +  systemParams: {
    +    appId: string,
    +    variables: string,
    +    histories: string,
    +    cTime: string,
    +    chatId: string,
    +    responseChatItemId: string
    +  }
    +}
    +
    +interface IResponse {
    +  message: string;
    +  tokens: number;
    +}
    +
    +export default async function (ctx: FunctionContext): Promise<IResponse> {
    +  const { str = "" }: RequestProps = ctx.body
    +  
    +  const encoding = new Tiktoken(
    +    cl100k_base.bpe_ranks,
    +    cl100k_base.special_tokens,
    +    cl100k_base.pat_str
    +  );
    +  const tokens = encoding.encode(str);
    +  encoding.free();
    +  
    +  return {
    +    message: 'ok',
    +    tokens: tokens.length
    +  };
    +}
    +  

    再回到 Fastgpt,点击“同步参数”,再连线将源文本传入,即可计算 tokens 数量

    计算单文本块大小

    由于不涉及第三方包,只是一些数据处理,所以直接使用 代码运行 模块处理即可

    +  function main({tokenCount, tokenLimit}){
    +  const numChunks = Math.ceil(tokenCount / tokenLimit);
    +  let chunkSize = Math.floor(tokenCount / numChunks);
    +
    +  const remainingTokens = tokenCount % tokenLimit;
    +  if (remainingTokens > 0) {
    +    chunkSize += Math.floor(remainingTokens / numChunks);
    +  }
    +
    +  return {chunkSize};
    +}
    +  

    通过上面的代码,我们就能算出不超过 token限制的合理单文本块大小是多少了

    获得切分后源文本块

    通过单文本块大小和源文本,我们再编写一个函数调用 langchain 的 textsplitters 包来实现文本分片,具体代码如下

    +  import cloud from '@lafjs/cloud'
    +import { TokenTextSplitter } from "@langchain/textsplitters";
    +
    +interface IRequestBody { 
    +  text: string 
    +  chunkSize: number
    +}
    +
    +interface RequestProps extends IRequestBody {
    +  systemParams: {
    +    appId: string,
    +    variables: string,
    +    histories: string,
    +    cTime: string,
    +    chatId: string,
    +    responseChatItemId: string
    +  }
    +}
    +
    +interface IResponse {
    +  output: string[];
    +}
    +
    +export default async function (ctx: FunctionContext): Promise<IResponse>{
    +  const { text = '', chunkSize=1000 }: RequestProps = ctx.body;
    +
    +  const splitter = new TokenTextSplitter({
    +    encodingName:"gpt2",
    +    chunkSize: Number(chunkSize),
    +    chunkOverlap: 0,
    +  });
    +
    +  const output = await splitter.splitText(text);
    +
    +  return { 
    +    output
    +   }
    +}
    +  

    这样我们就获得了切分好的文本,接下去的操作就类似单文本块反思翻译

    多文本块翻译

    这里应该还是不能直接调用前面的单文本块反思翻译,因为提示词中会涉及一些上下文的处理(或者可以修改下前面写好的插件,多传点参数进去)

    详细的和前面类似,就是提示词进行一些替换,以及需要做一些很简单的数据处理,整体效果如下

    多文本块初始翻译

    多文本块反思

    多文本块提升翻译

    循环执行

    长文反思翻译比较关键的一个部分,就是对多个文本块进行循环反思翻译

    Fastgpt 提供了工作流线路可以返回去执行的功能,所以我们可以写一个很简单的判断函数,来判断结束或是接着执行

    也就是通过判断当前处理的这个文本块,是否是最后一个文本块,从而判断是否需要继续执行,就这样,我们实现了长文反思翻译的效果

    完整工作流如下

    运行效果

    首先输入全局设置

    然后输入需要翻译的文本,这里我选择了一章哈利波特的英文原文来做翻译,其文本长度通过 openai 对 tokens 数量的判断如下

    实际运行效果如下

    可以看到还是能满足阅读需求的

    进一步调优

    提示词调优

    在源项目中,给 AI 的系统提示词还是比较的简略的,我们可以通过比较完善的提示词,来督促 LLM 返回更合适的翻译,进一步提升翻译的质量

    比如初始翻译中,

    +  # Role: 资深翻译专家
    +
    +## Background:
    +你是一位经验丰富的翻译专家,精通{{source_lang}}和{{target_lang}}互译,尤其擅长将{{source_lang}}文章译成流畅易懂的{{target_lang}}。你曾多次带领团队完成大型翻译项目,译文广受好评。
    +
    +## Attention:
    +- 翻译过程中要始终坚持"信、达、雅"的原则,但"达"尤为重要
    +- 译文要符合{{target_lang}}的表达习惯,通俗易懂,连贯流畅 
    +- 避免使用过于文绉绉的表达和晦涩难懂的典故引用
    +
    +## Constraints:
    +- 必须严格遵循四轮翻译流程:直译、意译、校审、定稿  
    +- 译文要忠实原文,准确无误,不能遗漏或曲解原意
    +
    +## Goals:
    +- 通过四轮翻译流程,将{{source_lang}}原文译成高质量的{{target_lang}}译文  
    +- 译文要准确传达原文意思,语言表达力求浅显易懂,朗朗上口
    +- 适度使用一些熟语俗语、流行网络用语等,增强译文的亲和力
    +- 在直译的基础上,提供至少2个不同风格的意译版本供选择
    +
    +## Skills:
    +- 精通{{source_lang}} {{target_lang}}两种语言,具有扎实的语言功底和丰富的翻译经验
    +- 擅长将{{source_lang}}表达习惯转换为地道自然的{{target_lang}}
    +- 对当代{{target_lang}}语言的发展变化有敏锐洞察,善于把握语言流行趋势
    +
    +## Workflow:
    +1. 第一轮直译:逐字逐句忠实原文,不遗漏任何信息
    +2. 第二轮意译:在直译的基础上用通俗流畅的{{target_lang}}意译原文,至少提供2个不同风格的版本
    +3. 第三轮校审:仔细审视译文,消除偏差和欠缺,使译文更加地道易懂 
    +4. 第四轮定稿:择优选取,反复修改润色,最终定稿出一个简洁畅达、符合大众阅读习惯的译文
    +
    +## OutputFormat: 
    +- 只需要输出第四轮定稿的回答
    +
    +## Suggestions:
    +- 直译时力求忠实原文,但不要过于拘泥逐字逐句
    +- 意译时在准确表达原意的基础上,用最朴实无华的{{target_lang}}来表达 
    +- 校审环节重点关注译文是否符合{{target_lang}}表达习惯,是否通俗易懂
    +- 定稿时适度采用一些熟语谚语、网络流行语等,使译文更接地气- 善于利用{{target_lang}}的灵活性,用不同的表述方式展现同一内容,提高译文的可读性
    +  

    从而返回更准确更高质量的初始翻译,后续的反思和提升翻译也可以修改更准确的提示词,如下

    然后再让我们来看看运行效果

    给了和之前相同的一段文本进行测试,测试效果还是比较显著的,就比如红框部分,之前的翻译如下

    从“让你的猫头鹰给我写信”这样有失偏颇的翻译,变成“给我写信,你的猫头鹰会知道怎么找到我”这样较为准确的翻译

    其他调优

    比如限定词调优,源项目中已经做了示范,就是加上国家地区这个限定词,实测确实会有不少提升

    出于 LLM 的卓越能力,我们能够通过设置不同的prompt来获取不同的翻译结果,也就是可以很轻松地通过设置特殊的限定词,来实现特定的,更精确的翻译

    而对于一些超出 LLM 理解的术语等,也可以利用 Fastgpt 的知识库功能进行相应扩展,进一步完善翻译机器人的功能

    + + + + \ No newline at end of file diff --git a/docs/use-cases/app-cases/submit_application_template/index.html b/docs/use-cases/app-cases/submit_application_template/index.html new file mode 100644 index 000000000000..7c09212fc508 --- /dev/null +++ b/docs/use-cases/app-cases/submit_application_template/index.html @@ -0,0 +1,62 @@ +如何提交应用模板 | FastGPT
    +
    template_submission

    如何提交应用模板

    指南:如何向 FastGPT 提交应用模板

    什么模板可以合并

    目前合并进仓库的应用模板,会在「模板市场」中全部展示给用户。

    为了控制模板的质量以及避免数量过多带来的繁琐,并不是所有的模板都会被合并到开源仓库中,你可以提前 PR 与我们沟通模板的内容。

    预估最后总体的数量不会很多,控制在 50 个左右,一半来自 FastGPT Team,一半来自社区用户。

    如何写一个应用模板

    1. 跑通 FastGPT dev 环境

    需要在 dev 环境下执行下面的操作。

    可参照 FastGPT|快速开始本地开发

    1. 在 FastGPT 工作台中,创建一个应用

    创建空白工作流即可。

    1. 创建应用模板

    应用模板配置以及相关资源,都会在 packages/templates/src 目录下。

    1. packages/templates/src 目录下,创建一个文件夹,名称为模板对应的 id。
    2. 在刚刚创建的文件夹中,再创建一个 template.json 文件,复制粘贴并填写如下配置:
    +  {
    +  "name": "模板名",
    +  "intro": "模板描述,会展示在模板市场的展示页",
    +  "author": "填写你的名字",
    +  "avatar": "模板头像,可以将图片文件放在同一个文件夹中,然后填写相应路径",
    +  
    +  "tags": ["模板标签"], // writing(文本创作),image-generation(图片生成),web-search(联网搜索),
    +              // roleplay(角色扮演), office-services(办公服务) 暂时分为 5 类,从中选择相应的标签
    +  
    +  "type": "模板类别",  // simple(简易应用), advanced(工作流), plugin(插件)
    +
    +  "workflow": {  // 这个对象先不管,待会直接粘贴导出的工作流即可
    +    "nodes": [],
    +    "edges": [],
    +    "chatConfig": {}
    +  }
    +}
    +  
    1. 完成应用编排并测试

    完成应用编排后,可以点击右上角的发布。

    1. 复制配置到 template.json

    鼠标放置在左上角应用的头像和名称上,会出现对于下拉框操作,可以导出工作流配置。

    导出的配置,会自动复制到剪切板,可以直接到 template.json 文件中粘贴使用,替换步骤 2 中,workflow 的值。

    1. 验证模板是否加载成功

    刷新页面,打开模板市场,看其是否成功加载,并点击「使用」测试其功能。

    1. 提交 PR

    如果你觉得你的模板需要提交到开源仓库,可以通过 PR 形式向我们提交。

    • 写清楚模板的介绍和功能
    • 配上模板运行的效果图
    • 模板参数填写说明,需要在 PR 中写清楚。例如,有些模板需要去某个提供商申请 key,需要附上对应的地址和教程,后续我们会加入到文档中。
    + + + + \ No newline at end of file diff --git a/docs/use-cases/app-cases/translate-subtitle-using-gpt/index.html b/docs/use-cases/app-cases/translate-subtitle-using-gpt/index.html new file mode 100644 index 000000000000..0c3c99314d1e --- /dev/null +++ b/docs/use-cases/app-cases/translate-subtitle-using-gpt/index.html @@ -0,0 +1,2139 @@ +长字幕翻译 | FastGPT
    +
    translate

    长字幕翻译

    利用 AI 自我反思提升翻译质量,同时循环迭代执行 AI 工作流来突破 LLM tokens 限制,实现一个高效的长字幕翻译机器人。

    直接使用 LLM 来翻译长字幕会遇到很多难点,这些难点也正是直接使用 AI 无法有效处理的问题:

    1. Tokens 限制:这是最明显的障碍。大语言模型 (LLM) 通常有输出 tokens 的限制,这意味着对于长文本,如果不使用特殊的工作流,可能需要手动将文本分段,逐段输入 AI 进行翻译,然后再手动拼接结果。这个过程不仅繁琐,还容易出错。

    2. 字幕格式的保持:对于字幕来说,时间轴信息至关重要。然而,AI 模型有时会产生 “幻觉”,即无中生有地修改或生成不存在的信息。在字幕翻译中,这可能导致 AI 错误地修改时间轴,使字幕与音频不同步。

    3. 翻译质量:简单的机器翻译往往无法满足观众的需求。即使是大语言模型,单轮翻译的质量也常常不尽如人意。对于字幕来说,翻译质量直接影响观看体验,糟糕的翻译会严重影响观众的沉浸感。

    本案例将展示如何利用 FastGPT 工作流代码结合 LLM 来有效解决这些问题。我们的方法不仅能克服技术限制,还能显著提升翻译质量。

    提取字幕信息

    工作流的一大优势在于可以结合额外的操作,使 AI 能更精准地处理信息。在字幕翻译中,我们可以先分离 SRT 字幕文件的各个组成部分,然后只让 LLM 翻译文本部分。这种方法既节约了 token 使用,又确保了时间轴信息不被误改。

    具体实现如下:

    1. 使用代码执行模块,对输入的原始字幕文本进行解析。
    2. 将字幕信息分类为三部分:时间信息、序号信息和文本信息。
    3. 只保留文本信息用于后续的 AI 翻译。

    这种预处理步骤大大提高了整个翻译过程的效率和准确性。

    切分文本

    为了进一步优化翻译过程,我们需要将提取出的文本信息重新组织。这一步的目的是将文本分割成适合 LLM 处理的大小,同时保持上下文的连贯性

    在本例中,我们采用以下策略:

    1. 将文本按照每 40 句为一组进行切分。这个数字是经过多次测试后得出的平衡点,既能保证翻译质量,又不会超出 LLM 的处理能力。
    2. 使用 标签分割每句文本。这种标记方法便于后续的重新组装,同时也为 AI 模型提供了清晰的句子边界。

    这种切分方法既考虑了 AI 模型的能力限制,又保证了翻译的连贯性。通过保持适当的上下文,我们可以得到更加准确和自然的翻译结果。

    格式化原文本

    在这一步,我们构建了最终输入给 LLM 的原文本。这个步骤的关键在于如何在控制 tokens 数量的同时,为 AI 提供足够的上下文信息。我们采用了以下策略:

    1. 传入所有文本作为背景上下文。这确保 AI 能理解整段对话的语境
    2. 使用<TRANSLATE_THIS>标签明确指出当前需要翻译的片段。这种方法既能控制 AI 的输出范围,又不会丢失整体语境。

    这种格式化方法使得 AI 能在理解全局的基础上,专注于翻译特定部分,从而提高翻译的准确性和连贯性。

    LLM 翻译

    这是整个过程中最关键的一步。我们利用 LLM 的强大能力来实现高质量翻译。在这一步中,我们将之前提到的 “初始翻译 -> 反思 -> 提升翻译” 的过程整合到了同一个提示词中。

    这个过程包括以下几个阶段:

    1. 第一轮直译:要求 AI 严格按照 标签逐句翻译,保证准确性。

    2. 第二轮意译:允许 AI 自主发挥,对第一轮的结果进行修改和优化。

    3. 第三轮反思:AI 对自己的翻译进行评价,从多个角度提出改进建议。

    4. 最后一轮修改:根据反思阶段的建议,AI 对翻译进行最后的调整和优化。

    这种多轮翻译和反思的方法显著提高了翻译质量。它不仅能捕捉原文的准确含义,还能使翻译更加流畅自然。

    值得注意的是,这种方法的效果与直接分步执行相当,但工作流更加简洁高效。

    整合字幕

    完成翻译后,我们需要将所有信息重新组合成完整的字幕文件。这一步骤包括:

    1. 整合之前分离的序号信息和时间信息。
    2. 将翻译好的文本与原文本对应。
    3. 使用代码执行模块自动完成组装过程。

    这个过程不仅提高了效率,还最大限度地减少了人为错误的可能性。

    循环执行

    为了处理整个长字幕文件,我们需要一个循环执行机制。这是通过一个简单但有效的判断模块实现的:

    1. 检查当前翻译的文本块是否为最后一个。
    2. 如果不是,则将工作流重定向到格式化原文本块节点。
    3. 取出下一段需要翻译的文本,重新开始翻译和拼接过程。

    这种循环机制确保了整个长字幕文件能被完整处理,无论字幕有多长。

    实际应用示例

    为了验证这个方法的有效性,我们选取了一段《权力的游戏》的英文字幕,将其翻译成简体中文。可以看出我们的方法不仅能准确翻译内容,还能保持字幕的格式和时间轴信息。

    附件

    本工作流完整配置如下,可直接复制,导入到 FastGPT 中。

    工作流编排配置
    {
    +  "nodes": [
    +    {
    +      "nodeId": "userGuide",
    +      "name": "系统配置",
    +      "intro": "可以配置应用的系统参数",
    +      "avatar": "core/workflow/template/systemConfig",
    +      "flowNodeType": "userGuide",
    +      "position": {
    +        "x": -1453.0815298642474,
    +        "y": 269.10239463914263
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "welcomeText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "string",
    +          "label": "core.app.Welcome Text",
    +          "value": ""
    +        },
    +        {
    +          "key": "variables",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "core.app.Chat Variable",
    +          "value": []
    +        },
    +        {
    +          "key": "questionGuide",
    +          "valueType": "boolean",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "core.app.Question Guide",
    +          "value": false
    +        },
    +        {
    +          "key": "tts",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": {
    +            "type": "web"
    +          }
    +        },
    +        {
    +          "key": "whisper",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": {
    +            "open": false,
    +            "autoSend": false,
    +            "autoTTSResponse": false
    +          }
    +        },
    +        {
    +          "key": "scheduleTrigger",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": null
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "448745",
    +      "name": "流程开始",
    +      "intro": "",
    +      "avatar": "core/workflow/template/workflowStart",
    +      "flowNodeType": "workflowStart",
    +      "position": {
    +        "x": -1458.2511936623089,
    +        "y": 1218.2790943636066
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "toolDescription": "用户问题"
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "userChatInput",
    +          "key": "userChatInput",
    +          "label": "core.module.input.label.user question",
    +          "type": "static",
    +          "valueType": "string"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "yjFO3YcM7KG2",
    +      "name": "LLM 翻译",
    +      "intro": "AI 大模型对话",
    +      "avatar": "core/workflow/template/aiChat",
    +      "flowNodeType": "chatNode",
    +      "showStatus": true,
    +      "position": {
    +        "x": 2569.420973631976,
    +        "y": 909.4127366971411
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "model",
    +          "renderTypeList": [
    +            "settingLLMModel",
    +            "reference"
    +          ],
    +          "label": "core.module.input.label.aiModel",
    +          "valueType": "string",
    +          "selectedTypeIndex": 0,
    +          "value": "claude-3-5-sonnet-20240620"
    +        },
    +        {
    +          "key": "temperature",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 3,
    +          "valueType": "number",
    +          "min": 0,
    +          "max": 10,
    +          "step": 1
    +        },
    +        {
    +          "key": "maxToken",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": 4000,
    +          "valueType": "number",
    +          "min": 100,
    +          "max": 4000,
    +          "step": 50
    +        },
    +        {
    +          "key": "isResponseAnswerText",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": false,
    +          "valueType": "boolean"
    +        },
    +        {
    +          "key": "quoteTemplate",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string"
    +        },
    +        {
    +          "key": "quotePrompt",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "valueType": "string"
    +        },
    +        {
    +          "key": "systemPrompt",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "max": 3000,
    +          "valueType": "string",
    +          "label": "core.ai.Prompt",
    +          "description": "core.app.tip.chatNodeSystemPromptTip",
    +          "placeholder": "core.app.tip.chatNodeSystemPromptTip",
    +          "value": "# Role: 资深字幕翻译专家\n\n## Background:\n你是一位经验丰富的{{source_lang}}和{{target_lang}}字幕翻译专家,精通{{source_lang}}和{{target_lang}}互译,尤其擅长将{{source_lang}}字幕译成流畅易懂的{{target_lang}}字幕。你曾多次带领团队完成大型商业电影的字幕翻译项目,所翻译的字幕广受好评。\n\n## Attention:\n- 翻译过程中要始终坚持\"信、达、雅\"的原则,但\"达\"尤为重要\n- 翻译的字幕要符合{{target_lang}}的表达习惯,通俗易懂,连贯流畅\n- 避免使用过于文绉绉的表达和晦涩难懂的典故引用 \n- 诗词歌词等内容需按原文换行和节奏分行,不破坏原排列格式  \n- 翻译对象是字幕,请进入整段文本的语境中对需要翻译的文本段进行翻译\n- <T>是标识每一帧字幕的标签,请严格按照<T>对文本的分割逐帧翻译,每一帧字幕末尾不要加 \\n 回车标识,且第一帧字幕开头不需要加<T>标识\n\n## Constraints:\n- 必须严格遵循四轮翻译流程:直译、意译、反思、提升\n- 译文要忠实原文,准确无误,不能遗漏或曲解原意\n- 最终译文使用Markdown的代码块呈现,但是不用输出markdown这个单词\n- <T>是标识每一帧字幕的标签,请严格按照<T>对文本的分割逐帧翻译,每一帧字幕末尾不要加 \\n 回车标识,且第一帧字幕开头不需要加<T>标识\n\n## Goals:\n- 通过四轮翻译流程,将{{source_lang}}字幕译成高质量的{{target_lang}}字幕\n- 翻译的字幕要准确传达原字幕意思,语言表达力求浅显易懂,朗朗上口  \n\n## Workflow:\n1. 第一轮直译:严格按照<T>逐句翻译,不遗漏任何信息\n2. 第二轮意译:在直译的基础上用通俗流畅的{{target_lang}}意译原文,逐句翻译,保留<T>标识标签\n3. 第三轮反思:仔细审视译文,分点列出一份建设性的批评和有用的建议清单以改进翻译,对每一句话提出建议,从以下四个角度展开\n    (i) 准确性(纠正添加、误译、遗漏或未翻译的文本错误),\n    (ii) 流畅性(应用{{target_lang}}的语法、拼写和标点规则,并确保没有不必要的重复),\n    (iii) 风格(确保翻译反映源文本的风格并考虑其文化背景),\n    (iv) 术语(确保术语使用一致且反映源文本所在领域,注意确保使用{{target_lang}}中的等效习语)\n4. 第四轮提升:严格遵循第三轮提出的建议对翻译修改,定稿出一个简洁畅达、符合大众观影习惯的字幕译文,保留<T>标识标签\n\n## OutputFormat:\n- 每一轮前用【思考】说明该轮要点\n- 第一轮和第二轮翻译后用【翻译】呈现译文\n- 第三轮输出建议清单,分点列出,在每一点前用*xxx*标识这条建议对应的要点,如*风格*;建议前用【思考】说明该轮要点,建议后用【建议】呈现建议\n- 第四轮在\\`\\`\\`代码块中展示最终{{target_lang}}字幕文件内容,如\\`\\`\\`xxx\\`\\`\\`\n\n## Suggestions:\n- 直译时力求忠实原文,但注意控制每帧字幕的字数,必要时进行精简压缩\n- 意译时在准确表达原意的基础上,用最朴实无华的{{target_lang}}来表达\n- 反思环节重点关注译文是否符合{{target_lang}}表达习惯,是否通俗易懂,是否准确流畅,是否术语一致\n- 提升环节采用反思环节的建议对意译环节的翻译进行修改,适度采用一些口语化的表达、网络流行语等,增强字幕的亲和力\n- 注意<T>是很重要的标识标签,请确保标签能在正确位置输出"
    +        },
    +        {
    +          "key": "history",
    +          "renderTypeList": [
    +            "numberInput",
    +            "reference"
    +          ],
    +          "valueType": "chatHistory",
    +          "label": "core.module.input.label.chat history",
    +          "description": "最多携带多少轮对话记录",
    +          "required": true,
    +          "min": 0,
    +          "max": 50,
    +          "value": 6
    +        },
    +        {
    +          "key": "userChatInput",
    +          "renderTypeList": [
    +            "reference",
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "label": "用户问题",
    +          "required": true,
    +          "toolDescription": "用户问题",
    +          "value": [
    +            "bxz97Vg4Omux",
    +            "system_text"
    +          ]
    +        },
    +        {
    +          "key": "quoteQA",
    +          "renderTypeList": [
    +            "settingDatasetQuotePrompt"
    +          ],
    +          "label": "",
    +          "debugLabel": "知识库引用",
    +          "description": "",
    +          "valueType": "datasetQuote"
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "history",
    +          "key": "history",
    +          "required": true,
    +          "label": "core.module.output.label.New context",
    +          "description": "core.module.output.description.New context",
    +          "valueType": "chatHistory",
    +          "type": "static"
    +        },
    +        {
    +          "id": "answerText",
    +          "key": "answerText",
    +          "required": true,
    +          "label": "core.module.output.label.Ai response content",
    +          "description": "core.module.output.description.Ai response content",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "bxz97Vg4Omux",
    +      "name": "LLM 翻译提示词",
    +      "intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。",
    +      "avatar": "core/workflow/template/textConcat",
    +      "flowNodeType": "textEditor",
    +      "position": {
    +        "x": 1893.11421220213,
    +        "y": 1065.1299598362698
    +      },
    +      "version": "486",
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "可以引用其他节点的输出,作为文本拼接的变量,通过 {{字段名}} 来引用变量",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          }
    +        },
    +        {
    +          "key": "system_textareaInput",
    +          "renderTypeList": [
    +            "textarea"
    +          ],
    +          "valueType": "string",
    +          "required": true,
    +          "label": "拼接文本",
    +          "placeholder": "可通过 {{字段名}} 来引用变量",
    +          "value": "你的任务是将文本从{{source_lang}}翻译成{{target_lang}}\n\n源文本如下,由XML标签<SOURCE_TEXT>和</SOURCE_TEXT>分隔:\n\n<SOURCE_TEXT>\n\n{{tagged_text}}\n\n</SOURCE_TEXT>\n\n仅翻译源文本中由<TRANSLATE_THIS>和</TRANSLATE_THIS>分隔的部分,将其余的源文本作为上下文\n\n重申一下,你应该只翻译文本的这一部分,这里再次显示在<TRANSLATE_THIS>和</TRANSLATE_THIS>之间:\n\n<TRANSLATE_THIS>\n\n{{chunk_to_translate}}\n\n</TRANSLATE_THIS>"
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "canEdit": true,
    +          "key": "tagged_text",
    +          "label": "tagged_text",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          },
    +          "required": true,
    +          "value": [
    +            "quYZgsW32ApA",
    +            "xhXu6sdEWBnF"
    +          ]
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "canEdit": true,
    +          "key": "chunk_to_translate",
    +          "label": "chunk_to_translate",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          },
    +          "required": true,
    +          "value": [
    +            "quYZgsW32ApA",
    +            "eCp73lztAEGK"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_text",
    +          "key": "system_text",
    +          "label": "拼接结果",
    +          "type": "static",
    +          "valueType": "string"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "w4heEpNflz59",
    +      "name": "判断是否执行结束",
    +      "intro": "根据一定的条件,执行不同的分支。",
    +      "avatar": "core/workflow/template/ifelse",
    +      "flowNodeType": "ifElseNode",
    +      "showStatus": true,
    +      "position": {
    +        "x": 5625.495682697096,
    +        "y": 1199.9313115831496
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "ifElseList",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": [
    +            {
    +              "condition": "AND",
    +              "list": [
    +                {
    +                  "variable": [
    +                    "a2lqxASWi1vb",
    +                    "nmBmGaARbKkl"
    +                  ],
    +                  "condition": "equalTo",
    +                  "value": "true"
    +                }
    +              ]
    +            }
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "ifElseResult",
    +          "key": "ifElseResult",
    +          "label": "判断结果",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "a2lqxASWi1vb",
    +      "name": "判断是否执行结束",
    +      "intro": "执行一段简单的脚本代码,通常用于进行复杂的数据处理。",
    +      "avatar": "core/workflow/template/codeRun",
    +      "flowNodeType": "code",
    +      "showStatus": true,
    +      "position": {
    +        "x": 5099.256084679105,
    +        "y": 1102.1518590433243
    +      },
    +      "version": "482",
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "这些变量会作为代码的运行的输入参数",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          }
    +        },
    +        {
    +          "key": "codeType",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": "js"
    +        },
    +        {
    +          "key": "code",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "label": "",
    +          "value": "function main({chunks, currentChunk}){\n    const findIndex = chunks.findIndex((item) => item === currentChunk)\n\n    return {\n        isEnd: chunks.length-1 === findIndex,\n        i: findIndex + 1,\n    }\n}"
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "arrayString",
    +          "canEdit": true,
    +          "key": "chunks",
    +          "label": "chunks",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "y3WEYOQ09CGC",
    +            "qLUQfhG0ILRX"
    +          ]
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "canEdit": true,
    +          "key": "currentChunk",
    +          "label": "currentChunk",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "quYZgsW32ApA",
    +            "eCp73lztAEGK"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_rawResponse",
    +          "key": "system_rawResponse",
    +          "label": "完整响应数据",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "error",
    +          "key": "error",
    +          "label": "运行错误",
    +          "description": "代码运行错误信息,成功时返回空",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "customFieldConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          },
    +          "description": "将代码中 return 的对象作为输出,传递给后续的节点。变量名需要对应 return 的 key"
    +        },
    +        {
    +          "id": "nmBmGaARbKkl",
    +          "valueType": "boolean",
    +          "type": "dynamic",
    +          "key": "isEnd",
    +          "label": "isEnd"
    +        },
    +        {
    +          "id": "nqB98uKpq6Ig",
    +          "valueType": "number",
    +          "type": "dynamic",
    +          "key": "i",
    +          "label": "i"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "quYZgsW32ApA",
    +      "name": "格式化源文本块",
    +      "intro": "执行一段简单的脚本代码,通常用于进行复杂的数据处理。",
    +      "avatar": "core/workflow/template/codeRun",
    +      "flowNodeType": "code",
    +      "showStatus": true,
    +      "position": {
    +        "x": 1251.2839737092052,
    +        "y": 991.619268503857
    +      },
    +      "version": "482",
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "这些变量会作为代码的运行的输入参数",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          }
    +        },
    +        {
    +          "key": "codeType",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": "js"
    +        },
    +        {
    +          "key": "code",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "label": "",
    +          "value": "function main({source_text_chunks, i=0}){\n    let before = source_text_chunks.slice(0, i).join(\"\");\n    let current = \" <TRANSLATE_THIS>\" + source_text_chunks[i] + \"</TRANSLATE_THIS>\";\n    let after = source_text_chunks.slice(i + 1).join(\"\");\n    let tagged_text = before + current + after;\n\n    return {\n        tagged_text,\n        chunk_to_translate: source_text_chunks[i],\n    }\n}"
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "number",
    +          "canEdit": true,
    +          "key": "i",
    +          "label": "i",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "a2lqxASWi1vb",
    +            "nqB98uKpq6Ig"
    +          ]
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "arrayString",
    +          "canEdit": true,
    +          "key": "source_text_chunks",
    +          "label": "source_text_chunks",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "y3WEYOQ09CGC",
    +            "qLUQfhG0ILRX"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_rawResponse",
    +          "key": "system_rawResponse",
    +          "label": "完整响应数据",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "error",
    +          "key": "error",
    +          "label": "运行错误",
    +          "description": "代码运行错误信息,成功时返回空",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "customFieldConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          },
    +          "description": "将代码中 return 的对象作为输出,传递给后续的节点。变量名需要对应 return 的 key"
    +        },
    +        {
    +          "id": "xhXu6sdEWBnF",
    +          "valueType": "string",
    +          "type": "dynamic",
    +          "key": "tagged_text",
    +          "label": "tagged_text"
    +        },
    +        {
    +          "id": "eCp73lztAEGK",
    +          "valueType": "string",
    +          "type": "dynamic",
    +          "key": "chunk_to_translate",
    +          "label": "chunk_to_translate"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "izsNX8FXGD1t",
    +      "name": "指定回复",
    +      "intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
    +      "avatar": "core/workflow/template/reply",
    +      "flowNodeType": "answerNode",
    +      "position": {
    +        "x": 6399.439691374053,
    +        "y": 1204.4024103331792
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "text",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "valueType": "any",
    +          "required": true,
    +          "label": "core.module.input.label.Response content",
    +          "description": "core.module.input.description.Response content",
    +          "placeholder": "core.module.input.description.Response content",
    +          "value": "\n\n*** 字幕反思翻译完成!***"
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "vlNHndpNuFXB",
    +      "name": "取出 LLM 翻译第四轮文本",
    +      "intro": "执行一段简单的脚本代码,通常用于进行复杂的数据处理。",
    +      "avatar": "core/workflow/template/codeRun",
    +      "flowNodeType": "code",
    +      "showStatus": true,
    +      "position": {
    +        "x": 3284.6375352131763,
    +        "y": 950.1100995985583
    +      },
    +      "version": "482",
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "这些变量会作为代码的运行的输入参数",
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          },
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          }
    +        },
    +        {
    +          "key": "codeType",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": "js"
    +        },
    +        {
    +          "key": "code",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "label": "",
    +          "value": "function main({data1}){\n    const result = data1.split(\"```\").filter(item => !!item.trim())\n\n    if(result[result.length-1]) {\n        return {\n            result: result[result.length-1].trim() \n        }\n    }\n\n    return {\n        result: '未截取到翻译内容'\n    }\n}"
    +        },
    +        {
    +          "key": "data1",
    +          "valueType": "string",
    +          "label": "data1",
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "description": "",
    +          "canEdit": true,
    +          "editField": {
    +            "key": true,
    +            "valueType": true
    +          },
    +          "value": [
    +            "yjFO3YcM7KG2",
    +            "answerText"
    +          ],
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          }
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_rawResponse",
    +          "key": "system_rawResponse",
    +          "label": "完整响应数据",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "error",
    +          "key": "error",
    +          "label": "运行错误",
    +          "description": "代码运行错误信息,成功时返回空",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "customFieldConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          },
    +          "description": "将代码中 return 的对象作为输出,传递给后续的节点。变量名需要对应 return 的 key"
    +        },
    +        {
    +          "id": "qLUQfhG0ILRX",
    +          "type": "dynamic",
    +          "key": "result",
    +          "valueType": "string",
    +          "label": "result"
    +        },
    +        {
    +          "id": "gR0mkQpJ4Og8",
    +          "type": "dynamic",
    +          "key": "data2",
    +          "valueType": "string",
    +          "label": "data2"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "qlt9KJbbS9yJ",
    +      "name": "判断源语言和目标语言是否相同",
    +      "intro": "根据一定的条件,执行不同的分支。",
    +      "avatar": "core/workflow/template/ifelse",
    +      "flowNodeType": "ifElseNode",
    +      "showStatus": true,
    +      "position": {
    +        "x": -648.2730659546055,
    +        "y": 1295.3336516652123
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "ifElseList",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "valueType": "any",
    +          "label": "",
    +          "value": [
    +            {
    +              "condition": "AND",
    +              "list": [
    +                {
    +                  "variable": [
    +                    "frjbsrlnJJsR",
    +                    "qLUQfhG0ILRX"
    +                  ],
    +                  "condition": "equalTo",
    +                  "value": "false"
    +                }
    +              ]
    +            }
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "ifElseResult",
    +          "key": "ifElseResult",
    +          "label": "判断结果",
    +          "valueType": "string",
    +          "type": "static"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "frjbsrlnJJsR",
    +      "name": "判断源语言和目标语言是否相同",
    +      "intro": "执行一段简单的脚本代码,通常用于进行复杂的数据处理。",
    +      "avatar": "core/workflow/template/codeRun",
    +      "flowNodeType": "code",
    +      "showStatus": true,
    +      "position": {
    +        "x": -1142.9562352499165,
    +        "y": 1031.4486788585432
    +      },
    +      "version": "482",
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "这些变量会作为代码的运行的输入参数",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          }
    +        },
    +        {
    +          "key": "codeType",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": "js"
    +        },
    +        {
    +          "key": "code",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "label": "",
    +          "value": "function main({source_lang, target_lang}){\n    \n    return {\n        result: source_lang === target_lang\n    }\n}"
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "canEdit": true,
    +          "key": "source_lang",
    +          "label": "source_lang",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "VARIABLE_NODE_ID",
    +            "source_lang"
    +          ]
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "canEdit": true,
    +          "key": "target_lang",
    +          "label": "target_lang",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "VARIABLE_NODE_ID",
    +            "target_lang"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_rawResponse",
    +          "key": "system_rawResponse",
    +          "label": "完整响应数据",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "error",
    +          "key": "error",
    +          "label": "运行错误",
    +          "description": "代码运行错误信息,成功时返回空",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "customFieldConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          },
    +          "description": "将代码中 return 的对象作为输出,传递给后续的节点。变量名需要对应 return 的 key"
    +        },
    +        {
    +          "id": "qLUQfhG0ILRX",
    +          "type": "dynamic",
    +          "key": "result",
    +          "valueType": "boolean",
    +          "label": "result"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "dFxrGZS3Wmnz",
    +      "name": "提示源语言与目标语言相同",
    +      "intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
    +      "avatar": "core/workflow/template/reply",
    +      "flowNodeType": "answerNode",
    +      "position": {
    +        "x": -554.7555863373991,
    +        "y": 1727.175384457058
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "text",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "valueType": "any",
    +          "required": true,
    +          "label": "core.module.input.label.Response content",
    +          "description": "core.module.input.description.Response content",
    +          "placeholder": "core.module.input.description.Response content",
    +          "selectedTypeIndex": 0,
    +          "value": "{{source_lang}} 无需再次翻译为 {{target_lang}} ~"
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "tqzmK5oPR9BA",
    +      "name": "输出翻译",
    +      "intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
    +      "avatar": "core/workflow/template/reply",
    +      "flowNodeType": "answerNode",
    +      "position": {
    +        "x": 4378.294585712487,
    +        "y": 1268.975092230105
    +      },
    +      "version": "481",
    +      "inputs": [
    +        {
    +          "key": "text",
    +          "renderTypeList": [
    +            "textarea",
    +            "reference"
    +          ],
    +          "valueType": "any",
    +          "required": true,
    +          "label": "core.module.input.label.Response content",
    +          "description": "core.module.input.description.Response content",
    +          "placeholder": "core.module.input.description.Response content",
    +          "selectedTypeIndex": 1,
    +          "value": [
    +            "ppPP6o7YYSTJ",
    +            "dYalXmYJ60bj"
    +          ]
    +        }
    +      ],
    +      "outputs": []
    +    },
    +    {
    +      "nodeId": "kbr342XlxSZR",
    +      "name": "提取字幕信息",
    +      "intro": "执行一段简单的脚本代码,通常用于进行复杂的数据处理。",
    +      "avatar": "core/workflow/template/codeRun",
    +      "flowNodeType": "code",
    +      "showStatus": true,
    +      "position": {
    +        "x": 185.35869756392378,
    +        "y": 1004.6884026918935
    +      },
    +      "version": "482",
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "这些变量会作为代码的运行的输入参数",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          }
    +        },
    +        {
    +          "key": "codeType",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": "js"
    +        },
    +        {
    +          "key": "code",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "label": "",
    +          "value": "function main({text}){\n  const lines = text.split('\\n');\n  const timePattern = /\\d{2}:\\d{2}:\\d{2},\\d{3} --> \\d{2}:\\d{2}:\\d{2},\\d{3}/;\n  const numberInfo = [];\n  const timeInfo = [];\n  const textInfo = [];\n  let currentText = [];\n\n  // 提取序号、时间戳和文本信息\n  lines.forEach(line => {\n    if (/^\\d+$/.test(line.trim())) {\n      numberInfo.push(line.trim());\n    } else if (timePattern.test(line)) {\n      timeInfo.push(line);\n      if (currentText.length > 0) {\n        textInfo.push(currentText.join(' '));\n        currentText = [];\n      }\n    } else if (line.trim() === '') {\n      // Skip empty lines\n    } else {\n      currentText.push(line.trim());\n    }\n  });\n\n  if (currentText.length > 0) {\n    textInfo.push(currentText.join(' '));\n  }\n\n  return { numberInfo, timeInfo, textInfo };\n}"
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "canEdit": true,
    +          "key": "text",
    +          "label": "text",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "448745",
    +            "userChatInput"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_rawResponse",
    +          "key": "system_rawResponse",
    +          "label": "完整响应数据",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "error",
    +          "key": "error",
    +          "label": "运行错误",
    +          "description": "代码运行错误信息,成功时返回空",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "customFieldConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          },
    +          "description": "将代码中 return 的对象作为输出,传递给后续的节点。变量名需要对应 return 的 key"
    +        },
    +        {
    +          "id": "h3qVuGhV9HNm",
    +          "valueType": "arrayString",
    +          "type": "dynamic",
    +          "key": "timeInfo",
    +          "label": "timeInfo"
    +        },
    +        {
    +          "id": "zGYRMNA9xGuI",
    +          "valueType": "arrayString",
    +          "type": "dynamic",
    +          "key": "textInfo",
    +          "label": "textInfo"
    +        },
    +        {
    +          "id": "dhzTt6Riz8Dp",
    +          "valueType": "arrayString",
    +          "type": "dynamic",
    +          "key": "numberInfo",
    +          "label": "numberInfo"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "ppPP6o7YYSTJ",
    +      "name": "格式化字幕文件",
    +      "intro": "执行一段简单的脚本代码,通常用于进行复杂的数据处理。",
    +      "avatar": "core/workflow/template/codeRun",
    +      "flowNodeType": "code",
    +      "showStatus": true,
    +      "position": {
    +        "x": 3825.553384884565,
    +        "y": 956.4575651844932
    +      },
    +      "version": "482",
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "这些变量会作为代码的运行的输入参数",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          }
    +        },
    +        {
    +          "key": "codeType",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": "js"
    +        },
    +        {
    +          "key": "code",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "label": "",
    +          "value": "function main({combinedText, transedText, timeInfo, currentIndex=0,numberInfo}){\n  const textLines = combinedText.split('<T>');\n  const resultLines = transedText.split('<T>');\n  const combinedLines = [];\n\n  resultLines.forEach((line, index) => {\n    combinedLines.push(numberInfo[currentIndex+index]);\n    combinedLines.push(timeInfo[currentIndex+index]);\n    combinedLines.push(line)\n    combinedLines.push(textLines[index]);\n    combinedLines.push('');\n  });\n\n  const srtContent = combinedLines.join('\\n');\n  \n\n    return {\n        srtContent,\n        currentIndex: currentIndex+textLines.length\n    }\n}"
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "canEdit": true,
    +          "key": "combinedText",
    +          "label": "combinedText",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "quYZgsW32ApA",
    +            "eCp73lztAEGK"
    +          ]
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "string",
    +          "canEdit": true,
    +          "key": "transedText",
    +          "label": "transedText",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "vlNHndpNuFXB",
    +            "qLUQfhG0ILRX"
    +          ]
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "arrayString",
    +          "canEdit": true,
    +          "key": "timeInfo",
    +          "label": "timeInfo",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "kbr342XlxSZR",
    +            "h3qVuGhV9HNm"
    +          ]
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "number",
    +          "canEdit": true,
    +          "key": "currentIndex",
    +          "label": "currentIndex",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "ppPP6o7YYSTJ",
    +            "u6eqeC0pEPe0"
    +          ]
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "arrayString",
    +          "canEdit": true,
    +          "key": "numberInfo",
    +          "label": "numberInfo",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "kbr342XlxSZR",
    +            "dhzTt6Riz8Dp"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_rawResponse",
    +          "key": "system_rawResponse",
    +          "label": "完整响应数据",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "error",
    +          "key": "error",
    +          "label": "运行错误",
    +          "description": "代码运行错误信息,成功时返回空",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "customFieldConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          },
    +          "description": "将代码中 return 的对象作为输出,传递给后续的节点。变量名需要对应 return 的 key"
    +        },
    +        {
    +          "id": "dYalXmYJ60bj",
    +          "valueType": "string",
    +          "type": "dynamic",
    +          "key": "srtContent",
    +          "label": "srtContent"
    +        },
    +        {
    +          "id": "u6eqeC0pEPe0",
    +          "valueType": "number",
    +          "type": "dynamic",
    +          "key": "currentIndex",
    +          "label": "currentIndex"
    +        }
    +      ]
    +    },
    +    {
    +      "nodeId": "y3WEYOQ09CGC",
    +      "name": "切分文本",
    +      "intro": "执行一段简单的脚本代码,通常用于进行复杂的数据处理。",
    +      "avatar": "core/workflow/template/codeRun",
    +      "flowNodeType": "code",
    +      "showStatus": true,
    +      "position": {
    +        "x": 742.138506499589,
    +        "y": 1011.2409789066801
    +      },
    +      "version": "482",
    +      "inputs": [
    +        {
    +          "key": "system_addInputParam",
    +          "renderTypeList": [
    +            "addInputParam"
    +          ],
    +          "valueType": "dynamic",
    +          "label": "",
    +          "required": false,
    +          "description": "这些变量会作为代码的运行的输入参数",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          }
    +        },
    +        {
    +          "key": "codeType",
    +          "renderTypeList": [
    +            "hidden"
    +          ],
    +          "label": "",
    +          "value": "js"
    +        },
    +        {
    +          "key": "code",
    +          "renderTypeList": [
    +            "custom"
    +          ],
    +          "label": "",
    +          "value": "function main({textArray}){\n const groupSize = 20\n const delimiter = '<T>'\n\n  const result = [];\n\n  for (let i = 0; i < textArray.length; i += groupSize) {\n    result.push(textArray.slice(i, i + groupSize).join(delimiter));\n  }\n\n  return {result};\n}"
    +        },
    +        {
    +          "renderTypeList": [
    +            "reference"
    +          ],
    +          "valueType": "arrayString",
    +          "canEdit": true,
    +          "key": "textArray",
    +          "label": "textArray",
    +          "customInputConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": true
    +          },
    +          "required": true,
    +          "value": [
    +            "kbr342XlxSZR",
    +            "zGYRMNA9xGuI"
    +          ]
    +        }
    +      ],
    +      "outputs": [
    +        {
    +          "id": "system_rawResponse",
    +          "key": "system_rawResponse",
    +          "label": "完整响应数据",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "error",
    +          "key": "error",
    +          "label": "运行错误",
    +          "description": "代码运行错误信息,成功时返回空",
    +          "valueType": "object",
    +          "type": "static"
    +        },
    +        {
    +          "id": "system_addOutputParam",
    +          "key": "system_addOutputParam",
    +          "type": "dynamic",
    +          "valueType": "dynamic",
    +          "label": "",
    +          "customFieldConfig": {
    +            "selectValueTypeList": [
    +              "string",
    +              "number",
    +              "boolean",
    +              "object",
    +              "arrayString",
    +              "arrayNumber",
    +              "arrayBoolean",
    +              "arrayObject",
    +              "any",
    +              "chatHistory",
    +              "datasetQuote",
    +              "dynamic",
    +              "selectApp",
    +              "selectDataset"
    +            ],
    +            "showDescription": false,
    +            "showDefaultValue": false
    +          },
    +          "description": "将代码中 return 的对象作为输出,传递给后续的节点。变量名需要对应 return 的 key"
    +        },
    +        {
    +          "id": "qLUQfhG0ILRX",
    +          "type": "dynamic",
    +          "key": "result",
    +          "valueType": "arrayString",
    +          "label": "result"
    +        }
    +      ]
    +    }
    +  ],
    +  "edges": [
    +    {
    +      "source": "bxz97Vg4Omux",
    +      "target": "yjFO3YcM7KG2",
    +      "sourceHandle": "bxz97Vg4Omux-source-right",
    +      "targetHandle": "yjFO3YcM7KG2-target-left"
    +    },
    +    {
    +      "source": "a2lqxASWi1vb",
    +      "target": "w4heEpNflz59",
    +      "sourceHandle": "a2lqxASWi1vb-source-right",
    +      "targetHandle": "w4heEpNflz59-target-left"
    +    },
    +    {
    +      "source": "w4heEpNflz59",
    +      "target": "izsNX8FXGD1t",
    +      "sourceHandle": "w4heEpNflz59-source-IF",
    +      "targetHandle": "izsNX8FXGD1t-target-left"
    +    },
    +    {
    +      "source": "448745",
    +      "target": "frjbsrlnJJsR",
    +      "sourceHandle": "448745-source-right",
    +      "targetHandle": "frjbsrlnJJsR-target-left"
    +    },
    +    {
    +      "source": "frjbsrlnJJsR",
    +      "target": "qlt9KJbbS9yJ",
    +      "sourceHandle": "frjbsrlnJJsR-source-right",
    +      "targetHandle": "qlt9KJbbS9yJ-target-left"
    +    },
    +    {
    +      "source": "tqzmK5oPR9BA",
    +      "target": "a2lqxASWi1vb",
    +      "sourceHandle": "tqzmK5oPR9BA-source-right",
    +      "targetHandle": "a2lqxASWi1vb-target-left"
    +    },
    +    {
    +      "source": "yjFO3YcM7KG2",
    +      "target": "vlNHndpNuFXB",
    +      "sourceHandle": "yjFO3YcM7KG2-source-right",
    +      "targetHandle": "vlNHndpNuFXB-target-left"
    +    },
    +    {
    +      "source": "ppPP6o7YYSTJ",
    +      "target": "tqzmK5oPR9BA",
    +      "sourceHandle": "ppPP6o7YYSTJ-source-right",
    +      "targetHandle": "tqzmK5oPR9BA-target-left"
    +    },
    +    {
    +      "source": "kbr342XlxSZR",
    +      "target": "y3WEYOQ09CGC",
    +      "sourceHandle": "kbr342XlxSZR-source-right",
    +      "targetHandle": "y3WEYOQ09CGC-target-left"
    +    },
    +    {
    +      "source": "y3WEYOQ09CGC",
    +      "target": "quYZgsW32ApA",
    +      "sourceHandle": "y3WEYOQ09CGC-source-right",
    +      "targetHandle": "quYZgsW32ApA-target-left"
    +    },
    +    {
    +      "source": "quYZgsW32ApA",
    +      "target": "bxz97Vg4Omux",
    +      "sourceHandle": "quYZgsW32ApA-source-right",
    +      "targetHandle": "bxz97Vg4Omux-target-left"
    +    },
    +    {
    +      "source": "w4heEpNflz59",
    +      "target": "quYZgsW32ApA",
    +      "sourceHandle": "w4heEpNflz59-source-ELSE",
    +      "targetHandle": "quYZgsW32ApA-target-left"
    +    },
    +    {
    +      "source": "qlt9KJbbS9yJ",
    +      "target": "kbr342XlxSZR",
    +      "sourceHandle": "qlt9KJbbS9yJ-source-IF",
    +      "targetHandle": "kbr342XlxSZR-target-left"
    +    },
    +    {
    +      "source": "qlt9KJbbS9yJ",
    +      "target": "dFxrGZS3Wmnz",
    +      "sourceHandle": "qlt9KJbbS9yJ-source-ELSE",
    +      "targetHandle": "dFxrGZS3Wmnz-target-right"
    +    },
    +    {
    +      "source": "vlNHndpNuFXB",
    +      "target": "ppPP6o7YYSTJ",
    +      "sourceHandle": "vlNHndpNuFXB-source-right",
    +      "targetHandle": "ppPP6o7YYSTJ-target-left"
    +    }
    +  ],
    +  "chatConfig": {
    +    "welcomeText": "你好,欢迎使用长字幕反思翻译机器人。\n\n在完成下方设置后,可以直接输入需要翻译的文本",
    +    "variables": [
    +      {
    +        "id": "v98n5b",
    +        "key": "source_lang",
    +        "label": "源语言",
    +        "type": "select",
    +        "required": true,
    +        "maxLen": 50,
    +        "enums": [
    +          {
    +            "value": "简体中文"
    +          },
    +          {
    +            "value": "繁體中文"
    +          },
    +          {
    +            "value": "English"
    +          },
    +          {
    +            "value": "Español"
    +          },
    +          {
    +            "value": "Français"
    +          },
    +          {
    +            "value": "Deutsch"
    +          },
    +          {
    +            "value": "Italiano"
    +          },
    +          {
    +            "value": "日本語"
    +          },
    +          {
    +            "value": "한국어"
    +          },
    +          {
    +            "value": "Русский"
    +          },
    +          {
    +            "value": "العربية"
    +          },
    +          {
    +            "value": "Bahasa Indonesia"
    +          },
    +          {
    +            "value": "Polski"
    +          }
    +        ],
    +        "icon": "core/app/variable/select"
    +      },
    +      {
    +        "id": "c3tvge",
    +        "key": "target_lang",
    +        "label": "目标语言",
    +        "type": "select",
    +        "required": true,
    +        "maxLen": 50,
    +        "enums": [
    +          {
    +            "value": "简体中文"
    +          },
    +          {
    +            "value": "繁體中文"
    +          },
    +          {
    +            "value": "English"
    +          },
    +          {
    +            "value": "Español"
    +          },
    +          {
    +            "value": "Français"
    +          },
    +          {
    +            "value": "Deutsch"
    +          },
    +          {
    +            "value": "Italiano"
    +          },
    +          {
    +            "value": "日本語"
    +          },
    +          {
    +            "value": "한국어"
    +          },
    +          {
    +            "value": "Русский"
    +          },
    +          {
    +            "value": "العربية"
    +          },
    +          {
    +            "value": "Bahasa Indonesia"
    +          },
    +          {
    +            "value": "Polski"
    +          }
    +        ],
    +        "icon": "core/app/variable/select"
    +      }
    +    ],
    +    "scheduledTriggerConfig": {
    +      "cronString": "",
    +      "timezone": "Asia/Shanghai",
    +      "defaultPrompt": ""
    +    },
    +    "_id": "6688b45317c65410d61d58aa"
    +  }
    +}
    +
    + + + + \ No newline at end of file diff --git a/docs/use-cases/external-integration/dingtalk/index.html b/docs/use-cases/external-integration/dingtalk/index.html new file mode 100644 index 000000000000..8347ca0af142 --- /dev/null +++ b/docs/use-cases/external-integration/dingtalk/index.html @@ -0,0 +1,44 @@ +接入钉钉机器人教程 | FastGPT
    +
    chat

    接入钉钉机器人教程

    FastGPT 接入钉钉机器人教程

    从 4.8.16 版本起,FastGPT 商业版支持直接接入钉钉机器人,无需额外的 API。

    1. 创建钉钉企业内部应用

    1. 钉钉开发者后台创建企业内部应用。

    图片1

    1. 获取Client IDClient Secret

    图片2

    2. 为 FastGPT 添加发布渠道

    在 FastGPT 中选择要接入的应用,在发布渠道页面,新建一个接入钉钉机器人的发布渠道。

    将前面拿到的 Client IDClient Secret 填入配置弹窗中。

    图片3

    创建完成后,点击请求地址按钮,然后复制回调地址。

    3. 为应用添加机器人应用能力。

    在钉钉开发者后台,点击左侧添加应用能力,为刚刚创建的企业内部应用添加 机器人 应用能力。

    图片4

    4. 配置机器人回调地址

    点击左侧机器人 应用能力,然后将底部消息接受模式设置为HTTP模式,消息接收地址填入前面复制的 FastGPT 的回调地址。

    图片5

    调试完成后,点击发布

    5. 发布应用

    机器人发布后,还需要在版本管理与发布页面发布应用版本。

    图片6

    点击创建新版本后,设置版本号和版本描述后点击保存发布即可。

    图片7

    应用发布后,即可在钉钉企业中使用机器人功能,可对机器人私聊。或者在群组添加机器人后@机器人,触发对话。

    图片8

    + + + + \ No newline at end of file diff --git a/docs/use-cases/external-integration/feishu/index.html b/docs/use-cases/external-integration/feishu/index.html new file mode 100644 index 000000000000..8b69a33008cb --- /dev/null +++ b/docs/use-cases/external-integration/feishu/index.html @@ -0,0 +1,46 @@ +接入飞书机器人教程 | FastGPT
    +
    chat

    接入飞书机器人教程

    FastGPT 接入飞书机器人教程

    从 4.8.10 版本起,FastGPT 商业版支持直接接入飞书机器人,无需额外的 API。

    1. 申请飞书应用

    开一个免费的测试企业更方便进行调试。

    1. 飞书开放平台的开发者后台申请企业自建应用。

    图片

    添加一个机器人应用。

    2. 在 FastGPT 新建发布渠道

    在fastgpt中选择想要接入的应用,在 发布渠道 页面,新建一个接入飞书机器人的发布渠道,填写好基础信息。

    图片

    3. 获取应用的 App ID, App Secret 两个凭证

    在飞书开放平台开发者后台,刚刚创建的企业自建应用中,找到 App ID 和 App Secret,填入 FastGPT 新建发布渠道的对话框里面。

    图片

    填入两个参数到 FastGPT 配置弹窗中。

    图片

    (可选)在飞书开放平台开发者后台,点击事件与回调 -> 加密策略 获取 Encrypt Key,并填入飞书机器人接入的对话框里面

    图片

    Encrypt Key 用于加密飞书服务器与 FastGPT 之间通信。 +建议如果使用 Https 协议,则不需要 Encrypt Key。如果使用 Http 协议通信,则建议使用 Encrypt Key +Verification Token 默认生成的这个 Token 用于校验来源。但我们使用飞书官方推荐的另一种更为安全的校验方式,因此可以忽略这个配置项。

    4. 配置回调地址

    新建好发布渠道后,点击请求地址,复制对应的请求地址。

    在飞书控制台,点击左侧的 事件与回调 ,点击配置订阅方式旁边的编辑 icon,粘贴刚刚复制的请求地址到输入框中。

    图片图片图片

    5. 配置机器人回调事件和权限

    • 添加 接收消息 事件

    事件与回调页面,点击添加事件

    搜索接收消息,或者直接搜索 im.message.receive_v1 ,找到接收消息 v2.0的时间,勾选上并点击确认添加

    添加事件后,增加两个权限:点击对应权限,会有弹窗提示添加权限,添加上图两个权限。

    图片图片

    不推荐启用上图中的两个“历史版本”,而是使用新版本的权限。

    • 若开启 “读取用户发给机器人的单聊消息”, 则单聊发送给机器人的消息将被送到 FastGPT
    • 若开启 “接收群聊中@机器人消息事件”, 则群聊中@机器人的消息将被送到 FastGPT
    • 若开启(不推荐开启)“获取群组中所有消息”,则群聊中所有消息都将被送到 FastGPT

    6. 配置回复消息权限

    在飞书控制台,点击左侧的 权限管理 ,搜索框中输入发消息,找到以应用的身份发消息的权限,点击开通权限。

    7. 发布机器人

    点击飞书控制台左侧的版本管理与发布,即可发布机器人。

    然后就可以在工作台里找到你的机器人啦。接下来就是把机器人拉进群组,或者单独与它对话。

    图片

    FAQ

    发送了消息,没响应

    1. 检查飞书机器人回调地址、权限等是否正确。
    2. 查看 FastGPT 对话日志,是否有对应的提问记录
    3. 如果有记录,飞书没回应,则是没给机器人开权限。
    4. 如果没记录,则可能是应用运行报错了,可以先试试最简单的机器人。(飞书机器人无法输入全局变量、文件、图片内容)
    + + + + \ No newline at end of file diff --git a/docs/use-cases/external-integration/iframe_integration/index.html b/docs/use-cases/external-integration/iframe_integration/index.html new file mode 100644 index 000000000000..e3d5f29921bd --- /dev/null +++ b/docs/use-cases/external-integration/iframe_integration/index.html @@ -0,0 +1,44 @@ +iframe 接入 | FastGPT
    +
    + + + + \ No newline at end of file diff --git a/docs/use-cases/external-integration/index.html b/docs/use-cases/external-integration/index.html new file mode 100644 index 000000000000..ab2d458560e1 --- /dev/null +++ b/docs/use-cases/external-integration/index.html @@ -0,0 +1,44 @@ +外部调用 FastGPT | FastGPT
    +
    + + + + \ No newline at end of file diff --git a/docs/use-cases/external-integration/index.xml b/docs/use-cases/external-integration/index.xml new file mode 100644 index 000000000000..d2dd5fb75bc0 --- /dev/null +++ b/docs/use-cases/external-integration/index.xml @@ -0,0 +1,54 @@ +外部调用 FastGPT on FastGPThttps://doc.tryfastgpt.ai/docs/use-cases/external-integration/Recent content in 外部调用 FastGPT on FastGPTHugo -- gohugo.iozh-cn通过 API 访问应用https://doc.tryfastgpt.ai/docs/use-cases/external-integration/openapi/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/openapi/在 FastGPT 中,你可以为每一个应用创建多个 API 密钥,用于访问应用的 API 接口。每个密钥仅能访问一个应用。完整的接口可以查看应用对话接口。 +获取 API 密钥 link依次选择应用 -&gt; 「API访问」,然后点击「API 密钥」来创建密钥。 +warning 密钥需要自己保管好,一旦关闭就无法再复制密钥,只能创建新密钥再复制。 +🍅 +Tips: 安全起见,你可以设置一个额度或者过期时间,放置 key 被滥用。 +替换三方应用的变量 link OPENAI_API_BASE_URL: https://api.fastgpt.in/api (改成自己部署的域名) OPENAI_API_KEY = 上一步获取到的密钥 ChatGPT Next Web 示例: +ChatGPT Web 示例:接入飞书机器人教程https://doc.tryfastgpt.ai/docs/use-cases/external-integration/feishu/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/feishu/从 4.8.10 版本起,FastGPT 商业版支持直接接入飞书机器人,无需额外的 API。 +1. 申请飞书应用 link开一个免费的测试企业更方便进行调试。 +在飞书开放平台的开发者后台申请企业自建应用。 添加一个机器人应用。 +2. 在 FastGPT 新建发布渠道 link在fastgpt中选择想要接入的应用,在 发布渠道 页面,新建一个接入飞书机器人的发布渠道,填写好基础信息。 +3. 获取应用的 App ID, App Secret 两个凭证 link在飞书开放平台开发者后台,刚刚创建的企业自建应用中,找到 App ID 和 App Secret,填入 FastGPT 新建发布渠道的对话框里面。 +填入两个参数到 FastGPT 配置弹窗中。 +(可选)在飞书开放平台开发者后台,点击事件与回调 -&gt; 加密策略 获取 Encrypt Key,并填入飞书机器人接入的对话框里面 +Encrypt Key 用于加密飞书服务器与 FastGPT 之间通信。 建议如果使用 Https 协议,则不需要 Encrypt Key。如果使用 Http 协议通信,则建议使用 Encrypt Key Verification Token 默认生成的这个 Token 用于校验来源。但我们使用飞书官方推荐的另一种更为安全的校验方式,因此可以忽略这个配置项。 +4. 配置回调地址 link新建好发布渠道后,点击请求地址,复制对应的请求地址。 +在飞书控制台,点击左侧的 事件与回调 ,点击配置订阅方式旁边的编辑 icon,粘贴刚刚复制的请求地址到输入框中。 +5. 配置机器人回调事件和权限 link 添加 接收消息 事件 在事件与回调页面,点击添加事件。接入钉钉机器人教程https://doc.tryfastgpt.ai/docs/use-cases/external-integration/dingtalk/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/dingtalk/从 4.8.16 版本起,FastGPT 商业版支持直接接入钉钉机器人,无需额外的 API。 +1. 创建钉钉企业内部应用 link 在钉钉开发者后台创建企业内部应用。 获取Client ID和Client Secret。 2. 为 FastGPT 添加发布渠道 link在 FastGPT 中选择要接入的应用,在发布渠道页面,新建一个接入钉钉机器人的发布渠道。 +将前面拿到的 Client ID 和 Client Secret 填入配置弹窗中。 +创建完成后,点击请求地址按钮,然后复制回调地址。 +3. 为应用添加机器人应用能力。 link在钉钉开发者后台,点击左侧添加应用能力,为刚刚创建的企业内部应用添加 机器人 应用能力。 +4. 配置机器人回调地址 link点击左侧机器人 应用能力,然后将底部消息接受模式设置为HTTP模式,消息接收地址填入前面复制的 FastGPT 的回调地址。 +调试完成后,点击发布。 +5. 发布应用 link机器人发布后,还需要在版本管理与发布页面发布应用版本。 +点击创建新版本后,设置版本号和版本描述后点击保存发布即可。 +应用发布后,即可在钉钉企业中使用机器人功能,可对机器人私聊。或者在群组添加机器人后@机器人,触发对话。接入微信公众号教程https://doc.tryfastgpt.ai/docs/use-cases/external-integration/official_account/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/official_account/从 4.8.10 版本起,FastGPT 商业版支持直接接入微信公众号,无需额外的 API。 +注意⚠️: 目前只支持通过验证的公众号(服务号和订阅号都可以) +1. 在 FastGPT 新建发布渠道 link在 FastGPT 中选择想要接入的应用,在 发布渠道 页面,新建一个接入微信公众号的发布渠道,填写好基础信息。 +2. 获取 AppID 、 Secret和Token link1. 登录微信公众平台,选择您的公众号。 link打开微信公众号官网:https://mp.weixin.qq.com +只支持通过验证的公众号,未通过验证的公众号暂不支持。 +开发者可以从这个链接申请微信公众号的测试号进行测试,测试号可以正常使用,但不能配置 AES Key +2. 把3个参数填入 FastGPT 配置弹窗中。 link 3. 在 IP 白名单中加入 FastGPT 的 IP link 私有部署的用户可自行查阅自己的 IP 地址。 +海外版用户(cloud.tryfastgpt.ai)可以填写下面的 IP 白名单: +35.240.227.100 34.124.237.188 34.143.240.160 34.87.51.146 34.87.79.202 35.247.163.68 34.87.102.86 35.198.192.104 34.126.163.205 34.124.189.116 34.143.149.171 34.87.173.252 34.142.157.52 34.87.180.104 34.87.20.189 34.87.110.152 34.87.44.74 34.87.152.33 35.197.149.75 35.247.161.35 国内版用户(fastgpt.cn)可以填写下面的 IP 白名单:对接 chatgpt-on-wechathttps://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/1 分钟对接 chatgpt-on-wechat linkchatgpt-on-wechat GitHub 地址 +由于 FastGPT 的 API 接口和 OpenAI 的规范一致,可以无需变更原来的应用即可使用 FastGPT 上编排好的应用。API 使用可参考 这篇文章。编排示例,可参考 高级编排介绍 +1. 获取 OpenAPI 密钥 link依次选择应用 -&gt; 「API访问」,然后点击「API 密钥」来创建密钥。 +warning 密钥需要自己保管好,一旦关闭就无法再复制密钥,只能创建新密钥再复制。 +3. 创建 docker-compose.yml 文件 link只需要修改 OPEN_AI_API_KEY 和 OPEN_AI_API_BASE 两个环境变量即可。其中 OPEN_AI_API_KEY 为第一步获取的密钥,OPEN_AI_API_BASE 为 FastGPT 的 OpenAPI 地址,例如:https://api.fastgpt.in/api/v1。 +随便找一个目录,创建一个 docker-compose.yml 文件,将下面的代码复制进去。 +version: &#39;2.0&#39; services: chatgpt-on-wechat: image: zhayujie/chatgpt-on-wechat container_name: chatgpt-on-wechat security_opt: - seccomp:unconfined environment: OPEN_AI_API_KEY: &#39;fastgpt-z51pkjqm9nrk03a1rx2funoy&#39; OPEN_AI_API_BASE: &#39;https://api.fastgpt.in/api/v1&#39; MODEL: &#39;gpt-3.5-turbo&#39; CHANNEL_TYPE: &#39;wx&#39; PROXY: &#39;&#39; HOT_RELOAD: &#39;False&#39; SINGLE_CHAT_PREFIX: &#39;[&#34;bot&#34;, &#34;@bot&#34;]&#39; SINGLE_CHAT_REPLY_PREFIX: &#39;&#34;[bot] &#34;&#39; GROUP_CHAT_PREFIX: &#39;[&#34;@bot&#34;]&#39; GROUP_NAME_WHITE_LIST: &#39;[&#34;ChatGPT测试群&#34;, &#34;ChatGPT测试群2&#34;]&#39; IMAGE_CREATE_PREFIX: &#39;[&#34;画&#34;, &#34;看&#34;, &#34;找&#34;]&#39; CONVERSATION_MAX_TOKENS: 1000 SPEECH_RECOGNITION: &#39;False&#39; CHARACTER_DESC: &#39;你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。&#39; SUBSCRIBE_MSG: &#39;感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输入。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持tool、角色扮演和文字冒险等丰富的插件。\n输入{trigger_prefix}#help 查看详细指令。&#39; EXPIRES_IN_SECONDS: 3600 USE_GLOBAL_PLUGIN_CONFIG: &#39;True&#39; USE_LINKAI: &#39;False&#39; LINKAI_API_KEY: &#39;&#39; LINKAI_APP_CODE: &#39;&#39; 4.接入微信和企业微信https://doc.tryfastgpt.ai/docs/use-cases/external-integration/wechat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/wechat/FastGPT 三分钟接入微信/企业微信 link私人微信和企业微信接入的方式基本一样,不同的地方会刻意指出。 +查看视频教程 +创建APIKey link首先找到我们需要接入的应用,然后点击「外部使用」-&gt;「API访问」创建一个APIKey并保存。 +配置微秘书 link打开微秘书 注册登录后找到菜单栏「基础配置」-&gt;「智能配置」,按照下图配置。 +继续往下看到 apikey 和服务器根地址,这里apikey填写我们在 FastGPT 应用外部访问中创建的 APIkey,服务器根地址填写官方地址或者私有化部署的地址,这里用官方地址示例,注意要添加/v1后缀,填写完毕后保存。 +sealos部署服务 link访问sealos 登录进来之后打开「应用管理」-&gt; 「新建应用」。 +应用名:称随便填写 镜像名:私人微信填写 aibotk/wechat-assistant 企业微信填写 aibotk/worker-assistant cpu和内存建议 1c1g 往下翻页找到「高级配置」-&gt; 「编辑环境变量」 +这里需要填写三个环境变量: +AIBOTK_KEY=微秘书 APIKEY AIBOTK_SECRET=微秘书 APISECRET WORK_PRO_TOKEN=你申请的企微 token (企业微信需要填写,私人微信不需要) 这里最后的企业微信 Token 在微秘书的-&gt;会员开通栏目中自行购买。 +这里环境变量我们介绍下如何填写: +AIBOTK_KEY 和 AIBOTK_SECRET 我们需要回到微秘书找到「个人中心」,这里的 APIKEY 对应 AIBOTK_KEY ,APISECRET 对应 AIBOTK_SECRET。 +WORK_PRO_TOKEN 微秘书的会员中心中自行购买即可。 +填写完毕后点右上角「部署」,等待应用状态变为运行中。 +返回微秘书 找到「首页」,扫码登录需要接入的微信号。 +测试 link只需要发送信息,或者拉入群聊@登录的微信就会回复信息啦。iframe 接入https://doc.tryfastgpt.ai/docs/use-cases/external-integration/iframe_integration/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/iframe_integration/ \ No newline at end of file diff --git a/docs/use-cases/external-integration/official_account/index.html b/docs/use-cases/external-integration/official_account/index.html new file mode 100644 index 000000000000..fde593eff15c --- /dev/null +++ b/docs/use-cases/external-integration/official_account/index.html @@ -0,0 +1,89 @@ +接入微信公众号教程 | FastGPT
    +
    description

    接入微信公众号教程

    FastGPT 接入微信公众号教程

    从 4.8.10 版本起,FastGPT 商业版支持直接接入微信公众号,无需额外的 API。

    注意⚠️: 目前只支持通过验证的公众号(服务号和订阅号都可以)

    1. 在 FastGPT 新建发布渠道

    在 FastGPT 中选择想要接入的应用,在 发布渠道 页面,新建一个接入微信公众号的发布渠道,填写好基础信息。

    图片

    2. 获取 AppID 、 Secret和Token

    1. 登录微信公众平台,选择您的公众号。

    打开微信公众号官网:https://mp.weixin.qq.com

    只支持通过验证的公众号,未通过验证的公众号暂不支持。

    开发者可以从这个链接申请微信公众号的测试号进行测试,测试号可以正常使用,但不能配置 AES Key

    图片

    2. 把3个参数填入 FastGPT 配置弹窗中。

    图片

    3. 在 IP 白名单中加入 FastGPT 的 IP

    图片

    私有部署的用户可自行查阅自己的 IP 地址。

    海外版用户(cloud.tryfastgpt.ai)可以填写下面的 IP 白名单:

    +  35.240.227.100
    +34.124.237.188
    +34.143.240.160
    +34.87.51.146
    +34.87.79.202
    +35.247.163.68
    +34.87.102.86
    +35.198.192.104
    +34.126.163.205
    +34.124.189.116
    +34.143.149.171
    +34.87.173.252
    +34.142.157.52
    +34.87.180.104
    +34.87.20.189
    +34.87.110.152
    +34.87.44.74
    +34.87.152.33
    +35.197.149.75
    +35.247.161.35
    +  

    国内版用户(fastgpt.cn)可以填写下面的 IP 白名单:

    +  47.97.1.240
    +121.43.105.217
    +121.41.178.7
    +121.40.65.187
    +47.97.59.172
    +101.37.205.32
    +120.55.195.90
    +120.26.229.115
    +120.55.193.112
    +47.98.190.173
    +112.124.41.79
    +121.196.235.183
    +121.41.75.88
    +121.43.108.48
    +112.124.12.6
    +121.43.52.222
    +121.199.162.43
    +121.199.162.102
    +120.55.94.163
    +47.99.59.223
    +112.124.46.5
    +121.40.46.247
    +  

    4. 获取AES Key,选择加密方式

    图片

    图片

    1. 随机生成AESKey,填入 FastGPT 配置弹窗中。

    2. 选择加密方式为安全模式。

    5. 获取 URL

    1. 在FastGPT确认创建,获取URL。

    图片

    1. 填入微信公众平台的 URL 处,然后提交保存 +图片

    6. 启用服务器配置(如已自动启用,请忽略)

    图片

    7. 开始使用

    现在用户向公众号发消息,消息则会被转发到 FastGPT,通过公众号返回对话结果。

    + + + + \ No newline at end of file diff --git a/docs/use-cases/external-integration/onwechat/index.html b/docs/use-cases/external-integration/onwechat/index.html new file mode 100644 index 000000000000..90ad196956f4 --- /dev/null +++ b/docs/use-cases/external-integration/onwechat/index.html @@ -0,0 +1,76 @@ +对接 chatgpt-on-wechat | FastGPT
    +
    chat

    对接 chatgpt-on-wechat

    FastGPT 对接 chatgpt-on-wechat

    1 分钟对接 chatgpt-on-wechat

    chatgpt-on-wechat GitHub 地址

    由于 FastGPT 的 API 接口和 OpenAI 的规范一致,可以无需变更原来的应用即可使用 FastGPT 上编排好的应用。API 使用可参考 这篇文章。编排示例,可参考 高级编排介绍

    1. 获取 OpenAPI 密钥

    依次选择应用 -> 「API访问」,然后点击「API 密钥」来创建密钥。

    3. 创建 docker-compose.yml 文件

    只需要修改 OPEN_AI_API_KEYOPEN_AI_API_BASE 两个环境变量即可。其中 OPEN_AI_API_KEY 为第一步获取的密钥,OPEN_AI_API_BASE 为 FastGPT 的 OpenAPI 地址,例如:https://api.fastgpt.in/api/v1

    随便找一个目录,创建一个 docker-compose.yml 文件,将下面的代码复制进去。

    +  version: '2.0'
    +services:
    +  chatgpt-on-wechat:
    +    image: zhayujie/chatgpt-on-wechat
    +    container_name: chatgpt-on-wechat
    +    security_opt:
    +      - seccomp:unconfined
    +    environment:
    +      OPEN_AI_API_KEY: 'fastgpt-z51pkjqm9nrk03a1rx2funoy'
    +      OPEN_AI_API_BASE: 'https://api.fastgpt.in/api/v1'
    +      MODEL: 'gpt-3.5-turbo'
    +      CHANNEL_TYPE: 'wx'
    +      PROXY: ''
    +      HOT_RELOAD: 'False'
    +      SINGLE_CHAT_PREFIX: '["bot", "@bot"]'
    +      SINGLE_CHAT_REPLY_PREFIX: '"[bot] "'
    +      GROUP_CHAT_PREFIX: '["@bot"]'
    +      GROUP_NAME_WHITE_LIST: '["ChatGPT测试群", "ChatGPT测试群2"]'
    +      IMAGE_CREATE_PREFIX: '["画", "看", "找"]'
    +      CONVERSATION_MAX_TOKENS: 1000
    +      SPEECH_RECOGNITION: 'False'
    +      CHARACTER_DESC: '你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。'
    +      SUBSCRIBE_MSG: '感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输入。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持tool、角色扮演和文字冒险等丰富的插件。\n输入{trigger_prefix}#help 查看详细指令。'
    +      EXPIRES_IN_SECONDS: 3600
    +      USE_GLOBAL_PLUGIN_CONFIG: 'True'
    +      USE_LINKAI: 'False'
    +      LINKAI_API_KEY: ''
    +      LINKAI_APP_CODE: ''
    +  

    4. 运行 chatgpt-on-wechat

    +  docker-compose pull
    +docker-compose up -d
    +  
    • 运行成功后会提示扫码登录
    • 随便找个账号,私信发送: bot问题 会将 问题 传到 FastGPT 进行回答。
    + + + + \ No newline at end of file diff --git a/docs/use-cases/external-integration/openapi/index.html b/docs/use-cases/external-integration/openapi/index.html new file mode 100644 index 000000000000..89f669157cb1 --- /dev/null +++ b/docs/use-cases/external-integration/openapi/index.html @@ -0,0 +1,47 @@ +通过 API 访问应用 | FastGPT
    +
    model_training

    通过 API 访问应用

    通过 API 访问 FastGPT 应用

    在 FastGPT 中,你可以为每一个应用创建多个 API 密钥,用于访问应用的 API 接口。每个密钥仅能访问一个应用。完整的接口可以查看应用对话接口

    获取 API 密钥

    依次选择应用 -> 「API访问」,然后点击「API 密钥」来创建密钥。

    替换三方应用的变量

    +  OPENAI_API_BASE_URL: https://api.fastgpt.in/api (改成自己部署的域名)
    +OPENAI_API_KEY = 上一步获取到的密钥
    +  

    ChatGPT Next Web 示例:

    ChatGPT Web 示例:

    + + + + \ No newline at end of file diff --git a/docs/use-cases/external-integration/wechat/index.html b/docs/use-cases/external-integration/wechat/index.html new file mode 100644 index 000000000000..c332607caf43 --- /dev/null +++ b/docs/use-cases/external-integration/wechat/index.html @@ -0,0 +1,49 @@ +接入微信和企业微信 | FastGPT
    +
    chat

    接入微信和企业微信

    FastGPT 接入微信和企业微信

    FastGPT 三分钟接入微信/企业微信

    私人微信和企业微信接入的方式基本一样,不同的地方会刻意指出。
    查看视频教程

    创建APIKey

    首先找到我们需要接入的应用,然后点击「外部使用」->「API访问」创建一个APIKey并保存。

    配置微秘书

    打开微秘书 注册登录后找到菜单栏「基础配置」->「智能配置」,按照下图配置。

    继续往下看到 apikey服务器根地址,这里apikey填写我们在 FastGPT 应用外部访问中创建的 APIkey,服务器根地址填写官方地址或者私有化部署的地址,这里用官方地址示例,注意要添加/v1后缀,填写完毕后保存。

    sealos部署服务

    访问sealos 登录进来之后打开「应用管理」-> 「新建应用」。

    • 应用名:称随便填写
    • 镜像名:私人微信填写 aibotk/wechat-assistant 企业微信填写 aibotk/worker-assistant
    • cpu和内存建议 1c1g

    往下翻页找到「高级配置」-> 「编辑环境变量」

    这里需要填写三个环境变量:

    +  AIBOTK_KEY=微秘书 APIKEY   
    +AIBOTK_SECRET=微秘书 APISECRET   
    +WORK_PRO_TOKEN=你申请的企微 token   (企业微信需要填写,私人微信不需要)
    +  

    这里最后的企业微信 Token 在微秘书的->会员开通栏目中自行购买。

    这里环境变量我们介绍下如何填写:

    AIBOTK_KEYAIBOTK_SECRET 我们需要回到微秘书找到「个人中心」,这里的 APIKEY 对应 AIBOTK_KEY ,APISECRET 对应 AIBOTK_SECRET

    WORK_PRO_TOKEN 微秘书的会员中心中自行购买即可。

    填写完毕后点右上角「部署」,等待应用状态变为运行中。

    返回微秘书 找到「首页」,扫码登录需要接入的微信号。

    测试

    只需要发送信息,或者拉入群聊@登录的微信就会回复信息啦。 +

    + + + + \ No newline at end of file diff --git a/docs/use-cases/index.html b/docs/use-cases/index.html new file mode 100644 index 000000000000..277ca4906f0e --- /dev/null +++ b/docs/use-cases/index.html @@ -0,0 +1,46 @@ +使用案例 | FastGPT
    +
    + + + + \ No newline at end of file diff --git a/docs/use-cases/index.xml b/docs/use-cases/index.xml new file mode 100644 index 000000000000..5e500e59332b --- /dev/null +++ b/docs/use-cases/index.xml @@ -0,0 +1 @@ +使用案例 on FastGPThttps://doc.tryfastgpt.ai/docs/use-cases/Recent content in 使用案例 on FastGPTHugo -- gohugo.iozh-cn \ No newline at end of file diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 000000000000..db96f84ad6c8 Binary files /dev/null and b/favicon-16x16.png differ diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 000000000000..f5619a938fd4 Binary files /dev/null and b/favicon-32x32.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 000000000000..c37991b15752 Binary files /dev/null and b/favicon.ico differ diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 000000000000..2a4b1e7a9606 --- /dev/null +++ b/favicon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/images/lotus_docs_screenshot_huea63e9b4b3759fd29bd9f072754ae476_100589_1349x768_resize_q85_h3_lanczos_3.webp b/images/lotus_docs_screenshot_huea63e9b4b3759fd29bd9f072754ae476_100589_1349x768_resize_q85_h3_lanczos_3.webp new file mode 100644 index 000000000000..cb2c4554a4a6 Binary files /dev/null and b/images/lotus_docs_screenshot_huea63e9b4b3759fd29bd9f072754ae476_100589_1349x768_resize_q85_h3_lanczos_3.webp differ diff --git a/images/screenshots/lotusdocs_blue_theme_colour.webp b/images/screenshots/lotusdocs_blue_theme_colour.webp new file mode 100644 index 000000000000..ae284e203b4c Binary files /dev/null and b/images/screenshots/lotusdocs_blue_theme_colour.webp differ diff --git a/images/screenshots/lotusdocs_cardinal_theme_colour.webp b/images/screenshots/lotusdocs_cardinal_theme_colour.webp new file mode 100644 index 000000000000..4394c7df967b Binary files /dev/null and b/images/screenshots/lotusdocs_cardinal_theme_colour.webp differ diff --git a/images/screenshots/lotusdocs_dark_v0.8.webp b/images/screenshots/lotusdocs_dark_v0.8.webp new file mode 100644 index 000000000000..d59570efc32d Binary files /dev/null and b/images/screenshots/lotusdocs_dark_v0.8.webp differ diff --git a/images/screenshots/lotusdocs_google_font_demo_inter_screenshot.webp b/images/screenshots/lotusdocs_google_font_demo_inter_screenshot.webp new file mode 100644 index 000000000000..d93152b07c90 Binary files /dev/null and b/images/screenshots/lotusdocs_google_font_demo_inter_screenshot.webp differ diff --git a/images/screenshots/lotusdocs_google_font_demo_lifesavers_screenshot.webp b/images/screenshots/lotusdocs_google_font_demo_lifesavers_screenshot.webp new file mode 100644 index 000000000000..1dc7bf49c1d0 Binary files /dev/null and b/images/screenshots/lotusdocs_google_font_demo_lifesavers_screenshot.webp differ diff --git a/images/screenshots/lotusdocs_light_v0.8.webp b/images/screenshots/lotusdocs_light_v0.8.webp new file mode 100644 index 000000000000..3d0675873df1 Binary files /dev/null and b/images/screenshots/lotusdocs_light_v0.8.webp differ diff --git a/images/templates/hero/gradient-desktop.webp b/images/templates/hero/gradient-desktop.webp new file mode 100644 index 000000000000..094e6365e91d Binary files /dev/null and b/images/templates/hero/gradient-desktop.webp differ diff --git a/images/templates/hero/gradient-mobile.webp b/images/templates/hero/gradient-mobile.webp new file mode 100644 index 000000000000..6893ec1de8d2 Binary files /dev/null and b/images/templates/hero/gradient-mobile.webp differ diff --git a/imgs/specialreply.png b/imgs/specialreply.png new file mode 100644 index 000000000000..0d35b05c3cac Binary files /dev/null and b/imgs/specialreply.png differ diff --git a/index.html b/index.html new file mode 100644 index 000000000000..33bbad1b44e3 --- /dev/null +++ b/index.html @@ -0,0 +1,11 @@ +FastGPT +

    Lotus Docs

    A lightweight, modern documentation theme for Hugo. Easily customised for building fast, secure, and SEO-friendly documentation sites.

    Open Source MIT Licensed.

    Lotus Docs Screenshot

    Why choose Lotus Docs?

    Lotus Docs is a highly configurable Hugo documentation theme. Yet, with the default configuration you can deploy and publish your documentation site in a matter of minutes. Check out some core features below.

    speed

    Fast

    4 x 100’s score on Google Lighthouse by default. Lotus Docs removes unused CSS, prefetches asset links, and lazy loads content images.

    trending_up

    SEO Friendly

    Data is automatically structured to be SEO friendly. Includes Meta tags, Opengraph, and Twitter cards. Choose the settings that best suit you.

    lock

    Secure by default

    Lotus Docs’ default configuration scores A+ on Mozilla Observatory. You can update the default Security Headers to suit your requirements.

    settings

    Optional Features

    Many Lotus Docs features are configurable via optional parameters. Require DocSearch for your site? Then enable it via a single setting.

    change_history

    Deploy to Vercel

    Deploy to Vercel in seconds. Vercel Functions, Vercel Redirects/Rewrites, and Vercel Headers are all configurable for an enriched experience.

    dark_mode

    Dark Mode

    Prefer not to be blasted by the sun while reading? Switch to a low-light UI with the click of a button. Modify colour variables to match your branding.

    search

    Search by DocSearch

    Search your docs with DocSearch. A powerful, efficient and accessible search solution built on Algolia Crawler & Autocomplete. TBC.

    translate

    Multilingual Support

    Lotus Docs supports Hugo’s Multilingual Mode. Create documentation in multiple languages side by side with i18n support.

    palette

    Bootstrap v5

    Built on Bootstrap 5, Lotus Docs allows for a familiar, flexible, and intuitive developer experience. Easily customise your site via SCSS variables and files.

    Customise The Lotus Docs Appearance

    Much of Lotus Docs’ appearance can be customised. Dark mode is optional (enabled by default) and you can choose a Google font that suites you via the config parameters.

    images/screenshots/lotusdocs_dark_v0.8.webp +images/screenshots/lotusdocs_light_v0.8.webp
    images/screenshots/lotusdocs_google_font_demo_inter_screenshot.webp +images/screenshots/lotusdocs_google_font_demo_lifesavers_screenshot.webp
    images/screenshots/lotusdocs_blue_theme_colour.webp +images/screenshots/lotusdocs_cardinal_theme_colour.webp
    + \ No newline at end of file diff --git a/index.xml b/index.xml new file mode 100644 index 000000000000..b92a64b084cb --- /dev/null +++ b/index.xml @@ -0,0 +1,711 @@ +FastGPThttps://doc.tryfastgpt.ai/Recent content on FastGPTHugo -- gohugo.iozh-cn快速了解 FastGPThttps://doc.tryfastgpt.ai/docs/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/intro/FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! +🤖 +FastGPT 在线使用:https://tryfastgpt.ai +FastGPT 能力 link1. 专属 AI 客服 link通过导入文档或已有问答对进行训练,让 AI 模型能根据你的文档以交互式对话方式回答问题。 +2. 简单易用的可视化界面 linkFastGPT 采用直观的可视化界面设计,为各种应用场景提供了丰富实用的功能。通过简洁易懂的操作步骤,可以轻松完成 AI 客服的创建和训练流程。 +3. 自动数据预处理 link提供手动输入、直接分段、LLM 自动处理和 CSV 等多种数据导入途径,其中“直接分段”支持通过 PDF、WORD、Markdown 和 CSV 文档内容作为上下文。FastGPT 会自动对文本数据进行预处理、向量化和 QA 分割,节省手动训练时间,提升效能。 +4. 工作流编排 link基于 Flow 模块的工作流编排,可以帮助你设计更加复杂的问答流程。例如查询数据库、查询库存、预约实验室等。 +5. 强大的 API 集成 linkFastGPT 对外的 API 接口对齐了 OpenAI 官方接口,可以直接接入现有的 GPT 应用,也可以轻松集成到企业微信、公众号、飞书等平台。 +FastGPT 特点 link 项目开源 +FastGPT 遵循附加条件 Apache License 2.0 开源协议,你可以 Fork 之后进行二次开发和发布。FastGPT 社区版将保留核心功能,商业版仅在社区版基础上使用 API 的形式进行扩展,不影响学习使用。 +独特的 QA 结构快速上手https://doc.tryfastgpt.ai/docs/guide/course/quick-start/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/quick-start/更多使用技巧,查看视屏教程 +知识库 link开始前,请准备一份测试电子文档,WORD,PDF,TXT,excel,markdown 都可以,比如公司休假制度,不涉密的销售说辞,产品知识等等。 +这里使用 FastGPT 中文 README 文件为例。 +首先我们需要创建一个知识库。 +知识库创建完之后我们需要上传一点内容。 +上传内容这里有四种模式: +手动输入:手动输入问答对,是最精准的数据 QA 拆分:选择文本文件,让AI自动生成问答对 直接分段:选择文本文件,直接将其按分段进行处理 CSV 导入:批量导入问答对 这里,我们选择 QA 拆分,让 AI 自动生成问答,若问答质量不高,可以后期手动修改。 +点击上传后我们需要等待数据处理完成,等到我们上传的文件状态为可用。 +应用 link点击「应用」按钮来新建一个应用,这里有四个模板,我们选择「知识库 + 对话引导」。 +应用创建后来再应用详情页找到「知识库」模块,把我们刚刚创建的知识库添加进去。 +添加完知识库后记得点击「保存并预览」,这样我们的应用就和知识库关联起来了。 +然后我们就可以愉快的开始聊天啦。AI 相关参数配置说明https://doc.tryfastgpt.ai/docs/guide/course/ai_settings/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/ai_settings/在 FastGPT 的 AI 对话模块中,有一个 AI 高级配置,里面包含了 AI 模型的参数配置,本文详细介绍这些配置的含义。 +流响应(高级编排 AI 对话 特有) link旧版名字叫做:返回 AI 内容;新版改名:流响应。 +这是一个开关,打开的时候,当 AI 对话模块运行时,会将其输出的内容返回到浏览器(API响应); 如果关闭,会强制使用非流模式调用模型,并且 AI 输出的内容不会返回到浏览器,但是生成的内容仍可以通过【AI回复】进行输出。你可以将【AI回复】连接到其他模块中进行二次使用。 +最大上下文 link代表模型最多容纳的文字数量。 +函数调用 link支持函数调用的模型,在使用工具时更加准确。 +温度 link越低回答越严谨,少废话(实测下来,感觉差别不大) +回复上限 link最大回复 token 数量。注意,是回复的Tokens!不是上下文 tokens。 +通常,回复上限=min(模型允许的最大回复上限, 最大上下文-已用上下文) +所以,一般配置模型时,不会把最大上下文配置成模型实际最大上下文,而是预留预定空间给回答,例如 128k 模型,可以配置 max_context=115000 +系统提示词 link被放置在上下文数组的最前面,role 为 system,用于引导模型。 +记忆轮数(仅简易模式) link可以配置模型支持的记忆轮数,如果模型的超出上下文,系统会自动截断,尽可能保证不超模型上下文。 +所以尽管配置 30 轮对话,实际运行时候,不一定会达到 30 轮。 +引用模板 &amp; 引用提示词 link进行知识库搜索后,你可以自定义组织检索结果构成的提示词,这个配置,仅工作流中 AI 对话节点可用。并且,只会在有引用知识库内容时才会生效。 +AI 对话消息组成 link想使用明白这两个变量,首先要了解传递传递给 AI 模型的消息格式。它是一个数组,FastGPT 中这个数组的组成形式为: +[ 内置提示词(config.json 配置,一般为空) 系统提示词 (用户输入的提示词) 历史记录 问题(由引用提示词、引用模板和用户问题组成) ] 🍅对话问题引导https://doc.tryfastgpt.ai/docs/guide/course/chat_input_guide/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/chat_input_guide/ 什么是自定义问题引导 link你可以为你的应用提前预设一些问题,用户在输入时,会根据输入的内容,动态搜索这些问题作为提示,从而引导用户更快的进行提问。 +你可以直接在 FastGPT 中配置词库,或者提供自定义词库接口。 +自定义词库接口 link需要保证这个接口可以被用户浏览器访问。 +请求: +curl --location --request GET &#39;http://localhost:3000/api/core/chat/inputGuide/query?appId=663c75302caf8315b1c00194&amp;searchKey=你&#39; 其中 appId 为应用ID,searchKey 为搜索关键字,最多是50个字符。 +响应 +{ &#34;code&#34;: 200, &#34;statusText&#34;: &#34;&#34;, &#34;message&#34;: &#34;&#34;, &#34;data&#34;: [ &#34;是你&#34;, &#34;你是谁呀&#34;, &#34;你好好呀&#34;, &#34;你好呀&#34;, &#34;你是谁!&#34;, &#34;你好&#34; ] } data是一个数组,包含了搜索到的问题,最多只需要返回5个问题。 +参数说明: +appId - 应用ID searchKey - 搜索关键字知识库集合标签https://doc.tryfastgpt.ai/docs/guide/course/collection_tags/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/collection_tags/知识库集合标签是 FastGPT 商业版特有功能。它允许你对知识库中的数据集合添加标签进行分类,更高效地管理知识库数据。 +而进一步可以在问答中,搜索知识库时添加集合过滤,实现更精确的搜索。 +标签基础操作说明 link在知识库详情页面,可以对标签进行管理,可执行的操作有 +创建标签 修改标签名 删除标签 将一个标签赋给多个数据集合 给一个数据集合添加多个标签 也可以利用标签对数据集合进行筛选 +知识库搜索-集合过滤说明 link利用标签可以在知识库搜索时,通过填写「集合过滤」这一栏来实现更精确的搜索,具体的填写示例如下 +{ &#34;tags&#34;: { &#34;$and&#34;: [&#34;标签 1&#34;,&#34;标签 2&#34;], &#34;$or&#34;: [&#34;有 $and 标签时,and 生效,or 不生效&#34;] }, &#34;createTime&#34;: { &#34;$gte&#34;: &#34;YYYY-MM-DD HH:mm 格式即可,集合的创建时间大于该时间&#34;, &#34;$lte&#34;: &#34;YYYY-MM-DD HH:mm 格式即可,集合的创建时间小于该时间,可和 $gte 共同使用&#34; } } 在填写时有两个注意的点, +标签值可以为 string 类型的标签名,也可以为 null,而 null 代表着未设置标签的数据集合 标签过滤有 $and 和 $or 两种条件类型,在同时设置了 $and 和 $or 的情况下,只有 $and 会生效文件输入功能介绍https://doc.tryfastgpt.ai/docs/guide/course/fileinput/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/course/fileinput/从 4.8.9 版本起,FastGPT 支持在简易模式和工作流中,配置用户上传文件、图片功能。下面先简单介绍下如何使用文件输入功能,最后是介绍下文件解析的工作原理。 +简易模式中使用 link简易模式打开文件上传后,会使用工具调用模式,也就是由模型自行决策,是否需要读取文件内容。 +可以找到左侧文件上传的配置项,点击其右侧的开启/关闭按键,即可打开配置弹窗。 +随后,你的调试对话框中,就会出现一个文件选择的 icon,可以点击文件选择 icon,选择你需要上传的文件。 +工作模式 +从 4.8.13 版本起,简易模式的文件读取将会强制解析文件并放入 system 提示词中,避免连续对话时,模型有时候不会主动调用读取文件的工具。 +工作流中使用 link工作流中,可以在系统配置中,找到文件输入配置项,点击其右侧的开启/关闭按键,即可打开配置弹窗。 +在工作流中,使用文件的方式很多,最简单的就是类似下图中,直接通过工具调用接入文档解析,实现和简易模式一样的效果。 +当然,你也可以在工作流中,对文档进行内容提取、内容分析等,然后将分析的结果传递给 HTTP 或者其他模块,从而实现文件处理的 SOP。 +文档解析工作原理 link不同于图片识别,LLM 模型目前没有支持直接解析文档的能力,所有的文档“理解”都是通过文档转文字后拼接 prompt 实现。这里通过几个 FAQ 来解释文档解析的工作原理,理解文档解析的原理,可以更好的在工作流中使用文档解析功能。 +上传的文件如何存储在数据库中 linkFastGPT 的对话记录存储结构中,role=user 的消息,value 值会按以下结构存储: +type UserChatItemValueItemType = { type: &#39;text&#39; | &#39;file&#39; text?: { content: string; }; file?: { type: &#39;img&#39; | &#39;doc&#39; name?: string; url: string; }; }; 也就是说,上传的图片和文档,都会以 URL 的形式存储在库中,并不会存储解析后的文档内容。 +图片如何处理 link文档解析节点不会处理图片,图片链接会被过滤,图片识别请直接使用支持图片识别的 LLM 模型。 +文档解析节点如何工作 link文档解析依赖文档解析节点,这个节点会接收一个array&lt;string&gt;类型的输入,对应的是文件输入的 URL;输出的是一个string,对应的是文档解析后的内容。简易模式https://doc.tryfastgpt.ai/docs/guide/workbench/basic-mode/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/basic-mode/工作流&插件https://doc.tryfastgpt.ai/docs/guide/workbench/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/intro/FastGPT 从 V4 版本开始采用新的交互方式来构建 AI 应用。使用了 Flow 节点编排(工作流)的方式来实现复杂工作流,提高可玩性和扩展性。但同时也提高了上手的门槛,有一定开发背景的用户使用起来会比较容易。 +查看视频教程 +什么是节点? link在程序中,节点可以理解为一个个 Function 或者接口。可以理解为它就是一个步骤。将多个节点一个个拼接起来,即可一步步的去实现最终的 AI 输出。 +如下图,这是一个最简单的 AI 对话。它由用流程开始和 AI 对话节点组成。 +执行流程如下: +用户输入问题后,【流程开始】节点执行,用户问题被保存。 【AI 对话】节点执行,此节点有两个必填参数“聊天记录” “用户问题”,聊天记录的值是默认输入的6条,表示此模块上下文长度。用户问题选择的是【流程开始】模块中保存的用户问题。 【AI 对话】节点根据传入的聊天记录和用户问题,调用对话接口,从而实现回答。 节点分类 link从功能上,节点可以分为 2 类: +系统节点:用户引导(配置一些对话框信息)、用户问题(流程入口)。 功能节点:知识库搜索、AI 对话等剩余节点。(这些节点都有输入和输出,可以自由组合)。 节点的组成 link每个节点会包含 3 个核心部分:输入、输出和触发器。 +AI模型、提示词、聊天记录、用户问题,知识库引用为输入,节点的输入可以是手动输入也可以是变量引用,变量引用的范围包括“全局变量”和之前任意一个节点的输出。 新的上下文和AI回复内容为输出,输出可以被之后任意节点变量引用。 节点的上下左右有四个“触发器”可以被用来连接,被连接的节点按顺序决定是否执行。 重点 - 工作流是如何运行的 linkFastGPT的工作流从【流程开始】节点开始执行,可以理解为从用户输入问题开始,没有固定的出口,是以节点运行结束作为出口,如果在一个轮调用中,所有节点都不再运行,则工作流结束。 +下面我们来看下,工作流是如何运行的,以及每个节点何时被触发执行。 +如上图所示节点会“被连接”也会“连接其他节点”,我们称“被连接”的那根线为前置线,“连接其他节点的线”为后置线。上图例子中【知识库搜索】模块左侧有一根前置线,右侧有一根后置线。而【AI对话】节点只有左侧一根前置线。 +FastGPT工作流中的线有以下几种状态: +waiting:被连接的节点等待执行。 active:被连接的节点可以执行。 skip:被连接的节点不需要执行跳过。 节点执行的原则: +判断前置线中有没有状态为 waiting 的,如果有则等待。 判断前置线中状态有没有状态为 active 如果有则执行。 如果前置线中状态即没有 waiting 也没有 active 则认为此节点需要跳过。 节点执行完毕后,需要根据实际情况更改后置线的状态为active或skip并且更改前置线状态为waiting等待下一轮执行。 让我们看一下上面例子的执行过程: +【流程开始】节点执行完毕,更改后置线为active。 【知识库搜索】节点判断前置线状态为active开始执行,执行完毕后更改后置线状态为active 前置线状态为waiting。 【AI对话】节点判断前置线状态为active开始执行,流程执行结束。 如何连接节点 link 为了方便连接,FastGPT 每个节点的上下左右都有连接点,左和上是前置线连接点,右和下是后置线连接点。 可以点击连接线中间的 x 来删除连接线。 可以左键点击选中连接线 如何阅读? link 建议从左往右阅读。 从 用户问题 节点开始。用户问题节点,代表的是用户发送了一段文本,触发任务开始。 关注【AI 对话】和【指定回复】节点,这两个节点是输出答案的地方。 FAQ link想合并多个输出结果怎么实现? link 文本加工,可以对字符串进行合并。 知识库搜索合并,可以合并多个知识库搜索结果 其他结果,无法直接合并,可以考虑传入到HTTP节点中进行合并,使用[Laf](https://laf.AI 对话https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/ai_chat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/ai_chat/特点 link 可重复添加 触发执行 核心模块 参数说明 linkAI模型 link可以通过 config.json 配置可选的对话模型,通过 one-api 来实现多模型接入。 +点击AI模型后,可以配置模型的相关参数。 +🍅 +具体配置参数介绍可以参考: AI参数配置说明知识库搜索https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/dataset_search/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/dataset_search/知识库搜索具体参数说明,以及内部逻辑请移步:FastGPT知识库搜索方案 +特点 link 可重复添加(复杂编排时防止线太乱,可以更美观) 有外部输入 有静态配置 触发执行 核心模块 参数说明 link输入 - 关联的知识库 link可以选择一个或多个相同向量模型的知识库,用于向量搜索。 +输入 - 搜索参数 link点击查看参数介绍 +输出 - 引用内容 link以数组格式输出引用,长度可以为 0。意味着,即使没有搜索到内容,这个输出链路也会走通。工具调用&终止https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/tool/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/tool/ 什么是工具 link工具可以是一个系统模块,例如:AI对话、知识库搜索、HTTP模块等。也可以是一个插件。 +工具调用可以让 LLM 更动态的决策流程,而不都是固定的流程。(当然,缺点就是费tokens) +工具的组成 link 工具介绍。通常是模块的介绍或插件的介绍,这个介绍会告诉LLM,这个工具的作用是什么。 工具参数。对于系统模块来说,工具参数已经是固定的,无需额外配置。对于插件来说,工具参数是一个可配置项。 工具是如何运行的 link要了解工具如何运行的,首先需要知道它的运行条件。 +需要工具的介绍(或者叫描述)。这个介绍会告诉LLM,这个工具的作用是什么,LLM会根据上下文语义,决定是否需要调用这个工具。 工具的参数。有些工具调用时,可能需要一些特殊的参数。参数中有2个关键的值:参数介绍和是否必须。 结合工具的介绍、参数介绍和参数是否必须,LLM会决定是否调用这个工具。有以下几种情况: +无参数的工具:直接根据工具介绍,决定是否需要执行。例如:获取当前时间。 有参数的工具: 无必须的参数:尽管上下文中,没有适合的参数,也可以调用该工具。但有时候,LLM会自己伪造一个参数。 有必须的参数:如果没有适合的参数,LLM可能不会调用该工具。可以通过提示词,引导用户提供参数。 工具调用逻辑 link在支持函数调用的模型中,可以一次性调用多个工具,调用逻辑如下: +怎么用 link 高级编排中,拖动工具调用的连接点,可用的工具头部会出现一个菱形,可以将它与工具调用模块底部的菱形相连接。 +被连接的工具,会自动分离工具输入与普通的输入,并且可以编辑介绍,可以通过调整介绍,使得该工具调用时机更加精确。 +关于工具调用,如何调试仍然是一个玄学,所以建议,不要一次性增加太多工具,选择少量工具调优后再进一步尝试。 +用途 link默认情况下,工具调用节点,在决定调用工具后,会将工具运行的结果,返回给AI,让 AI 对工具运行的结果进行总结输出。有时候,如果你不需要 AI 进行进一步的总结输出,可以使用该节点,将其接入对于工具流程的末尾。 +如下图,在执行知识库搜索后,发送给了 HTTP 请求,搜索将不会返回搜索的结果给工具调用进行 AI 总结。 +附加节点 link当您使用了工具调用节点,同时就会出现工具调用终止节点和自定义变量节点,能够进一步提升工具调用的使用体验。 +工具调用终止 link工具调用终止可用于结束本次调用,即可以接在某个工具后面,当工作流执行到这个节点时,便会强制结束本次工具调用,不再调用其他工具,也不会再调用 AI 针对工具调用结果回答问题。 +自定义工具变量 link自定义变量可以扩展工具的变量输入,即对于一些未被视作工具参数或无法工具调用的节点,可以自定义工具变量,填上对应的参数描述,那么工具调用便会相对应的调用这个节点,进而调用其之后的工作流。 +相关示例 link 谷歌搜索 发送飞书webhook问题分类https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/question_classify/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/question_classify/特点 link 可重复添加 有外部输入 需要手动配置 触发执行 function_call 模块 功能 link可以将用户的问题进行分类,分类后执行不同操作。在一些较模糊的场景中,分类效果不是很明显。 +参数说明 link系统提示词 link被放置在对话最前面,可用于补充说明分类内容的定义。例如问题会被分为: +打招呼 Laf 常见问题 其他问题 由于 Laf 不是一个明确的东西,需要给它一个定义,此时提示词里可以填入 Laf 的定义: +Laf 是云开发平台,可以快速的开发应用 Laf 是一个开源的 BaaS 开发平台(Backend as a Service) Laf 是一个开箱即用的 serverless 开发平台 Laf 是一个集「函数计算」、「数据库」、「对象存储」等于一身的一站式开发平台 Laf 可以是开源版的腾讯云开发、开源版的 Google Firebase、开源版的 UniCloud 聊天记录 link适当增加一些聊天记录,可以联系上下文进行分类。 +用户问题 link用户输入的内容。 +分类内容 link依然以这 3 个分类为例,可以看到最终组成的 Function。其中返回值由系统随机生成,不需要关心。 +打招呼 Laf 常见问题 其他问题 const agentFunction = { name: agentFunName, description: &#39;判断用户问题的类型属于哪方面,返回对应的枚举字段&#39;, parameters: { type: &#39;object&#39;, properties: { type: { type: &#39;string&#39;, description: `打招呼,返回: abc;Laf 常见问题,返回:vvv;其他问题,返回:aaa` enum: [&#34;abc&#34;,&#34;vvv&#34;,&#34;aaa&#34;] } }, required: [&#39;type&#39;] } }; 上面的 Function 必然会返回 type = abc,vvv,aaa 其中一个值,从而实现分类判断。文本内容提取https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/content_extract/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/content_extract/特点 link 可重复添加 需要手动配置 触发执行 function_call 模块 核心模块 功能 link从文本中提取结构化数据,通常是配合 HTTP 模块实现扩展。也可以做一些直接提取操作,例如:翻译。 +参数说明 link提取要求描述 link顾名思义,给模型设置一个目标,需要提取哪些内容。 +示例 1 +你是实验室预约助手,从对话中提取出姓名,预约时间,实验室号。当前时间 {{cTime}} +示例 2 +你是谷歌搜索助手,从对话中提取出搜索关键词 +示例 3 +将我的问题直接翻译成英文,不要回答问题 +历史记录 link通常需要一些历史记录,才能更完整的提取用户问题。例如上图中需要提供姓名、时间和实验室名,用户可能一开始只给了时间和实验室名,没有提供自己的姓名。再经过一轮缺失提示后,用户输入了姓名,此时需要结合上一次的记录才能完整的提取出 3 个内容。 +目标字段 link目标字段与提取的结果相对应,从上图可以看到,每增加一个字段,输出会增加一个对应的出口。 +key: 字段的唯一标识,不可重复! 字段描述:描述该字段是关于什么的,例如:姓名、时间、搜索词等等。 必须:是否强制模型提取该字段,可能提取出来是空字符串。 输出介绍 link 完整提取结果: 一个 JSON 字符串,包含所有字段的提取结果。 目标字段提取结果:类型均为字符串。用户选择https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/user-selection/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/user-selection/特点 link 用户交互 可重复添加 触发执行 功能 link「用户选择」节点属于用户交互节点,当触发这个节点时,对话会进入“交互”状态,会记录工作流的状态,等用户完成交互后,继续向下执行工作流 +比如上图中的例子,当触发用户选择节点时,对话框隐藏,对话进入“交互状态” +当用户做出选择时,节点会判断用户的选择,执行“是”的分支 +作用 link基础的用法为提出需要用户做抉择的问题,然后根据用户的反馈设计不同的工作流流程表单输入https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/form_input/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/form_input/特点 link 用户交互 可重复添加 触发执行 功能 link「表单输入」节点属于用户交互节点,当触发这个节点时,对话会进入“交互”状态,会记录工作流的状态,等用户完成交互后,继续向下执行工作流 +比如上图中的例子,当触发表单输入节点时,对话框隐藏,对话进入“交互状态” +当用户填完必填的信息并点击提交后,节点能够收集用户填写的表单信息,传递到后续的节点中使用 +作用 link能够精准收集需要的用户信息,再根据用户信息进行后续操作文本拼接https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/text_editor/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/text_editor/特点 link 可重复添加 有外部输入 触发执行 手动配置 功能 link对输入文本进行固定加工处理,入参仅支持字符串和数字格式,入参以变量形式使用在文本编辑区域。 +根据上方示例图的处理方式,对任何输入都会在前面拼接“用户的问题是:”。 +作用 link给任意模块输入自定格式文本,或处理 AI 模块系统提示词。 +示例 link 接入谷歌搜索指定回复https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/reply/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/reply/特点 link 可重复添加(防止复杂编排时线太乱,重复添加可以更美观) 可手动输入 可外部输入 会输出结果给客户端 指定回复模块通常用户特殊状态回复,回复内容有两种: +一种是手动输入固定内容。 一种是通过变量引用。 图 1文档解析https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/document_parsing/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/document_parsing/ 开启文件上传后,可使用文档解析组件。 +功能 link作用 linkHTTP 请求https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/http/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/http/特点 link 可重复添加 手动配置 触发执行 核中核模块 介绍 linkHTTP 模块会向对应的地址发送一个 HTTP 请求,实际操作与 Postman 和 ApiFox 这类直流工具使用差不多。 +Params 为路径请求参数,GET请求中用的居多。 Body 为请求体,POST/PUT请求中用的居多。 Headers 为请求头,用于传递一些特殊的信息。 自定义变量中可以接收前方节点的输出作为变量 3 种数据中均可以通过 {{}} 来引用变量。 url 也可以通过 {{}} 来引用变量。 变量来自于全局变量、系统变量、前方节点输出 参数结构 link系统变量说明 link你可以将鼠标放置在请求参数旁边的问号中,里面会提示你可用的变量。 +appId: 应用的ID chatId: 当前对话的ID,测试模式下不存在。 responseChatItemId: 当前对话中,响应的消息ID,测试模式下不存在。 variables: 当前对话的全局变量。 cTime: 当前时间。 histories: 历史记录(默认最多取10条,无法修改长度) Params, Headers link不多描述,使用方法和Postman, ApiFox 基本一致。 +可通过 {{key}} 来引入变量。例如: +key value appId {{appId}} Authorization Bearer {{token}} Body link只有特定请求类型下会生效。 +可以写一个自定义的 Json,并通过 {{key}} 来引入变量。例如: +假设有一组变量 Http 模块中的Body声明 最终得到的解析 { &#34;string&#34;: &#34;字符串&#34;, &#34;number&#34;: 123, &#34;boolean&#34;: true, &#34;array&#34;: [1, 2, 3], &#34;obj&#34;: { &#34;name&#34;: &#34;FastGPT&#34;, &#34;url&#34;: &#34;https://tryfastgpt.判断器https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/tfswitch/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/tfswitch/特点 link 可重复添加 有外部输入 触发执行 功能 link对任意变量进行IF判断,若满足条件则执行IF分支,不满足条件执行ELSE分支。 +上述例子中若「知识库引用」变量的长度等于0则执行IF分支,否则执行ELSE分支。 +支持增加更多的判断条件和分支,同编程语言中的IF语句逻辑相同。 +作用 link适用场景有:让大模型做判断后输出固定内容,根据大模型回复内容判断是否触发后续模块。变量更新https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/variable_update/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/variable_update/特点 link 可重复添加 有外部输入 触发执行 手动配置 功能 link 更新指定节点的输出值 更新全局变量 作用 link最基础的使用场景为 +给一个「自定义变量」类型的全局变量赋值,从而实现全局变量无需用户输入 更新「变量更新」节点前的工作流节点输出,在后续使用中,使用的节点输出值为新的输出代码运行https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/sandbox/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/sandbox/功能 link可用于执行一段简单的 js 代码,用于进行一些复杂的数据处理。代码运行在沙盒中,无法进行网络请求、dom和异步操作。如需复杂操作,需外挂 HTTP 实现。 +注意事项 +私有化用户需要部署fastgpt-sandbox 镜像,并配置SANDBOX_URL环境变量。 沙盒最大运行 10s, 32M 内存限制。 变量输入 link可在自定义输入中添加代码运行需要的变量,在代码的 main 函数中,可解构出相同名字的变量。 +如上图,自定义输入中有 data1 和 data2 两个变量,main 函数中可以解构出相同名字的变量。 +结果输出 link务必返回一个 object 对象 +自定义输出中,可以添加变量名来获取 object 对应 key 下的值。例如上图中,返回了一个对象: +{ result: data1, data2 } 他有 2 个 key:result和 data2(js 缩写,key=data2,value=data2)。这时候自定义输出中就可以添加 2 个变量来获取对应 key 下的 value。 +内置 JS 全局变量 linkdelay 延迟 link延迟 1 秒后返回 +async function main({data1, data2}){ await delay(1000) return { result: &#34;111&#34; } } countToken 统计 token link function main({input}){ return { result: countToken(input) } } strToBase64 字符串转 base64(4.循环执行https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/loop/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/loop/节点概述 link【循环运行】节点是 FastGPT V4.8.11 版本新增的一个重要功能模块。它允许工作流对数组类型的输入数据进行迭代处理,每次处理数组中的一个元素,并自动执行后续节点,直到完成整个数组的处理。 +这个节点的设计灵感来自编程语言中的循环结构,但以可视化的方式呈现。 +在程序中,节点可以理解为一个个 Function 或者接口。可以理解为它就是一个步骤。将多个节点一个个拼接起来,即可一步步的去实现最终的 AI 输出。 +【循环运行】节点本质上也是一个 Function,它的主要职责是自动化地重复执行特定的工作流程。 +核心特性 link 数组批量处理 +支持输入数组类型数据 自动遍历数组元素 保持处理顺序 支持并行处理 (性能优化) 自动迭代执行 +自动触发后续节点 支持条件终止 支持循环计数 维护执行上下文 与其他节点协同 +支持与 AI 对话节点配合 支持与 HTTP 节点配合 支持与内容提取节点配合 支持与判断器节点配合 应用场景 link【循环运行】节点的主要作用是通过自动化的方式扩展工作流的处理能力,使 FastGPT 能够更好地处理批量任务和复杂的数据处理流程。特别是在处理大规模数据或需要多轮迭代的场景下,循环运行节点能显著提升工作流的效率和自动化程度。 +【循环运行】节点特别适合以下场景: +批量数据处理 +批量翻译文本 批量总结文档 批量生成内容 数据流水线处理 +对搜索结果逐条分析 对知识库检索结果逐条处理 对 HTTP 请求返回的数组数据逐项处理 递归或迭代任务 +长文本分段处理 多轮优化内容 链式数据处理 使用方法 link输入参数设置 link【循环运行】节点需要配置两个核心输入参数: +数组 (必填):接收一个数组类型的输入,可以是: +字符串数组 (Array&lt;string&gt;) 数字数组 (Array&lt;number&gt;) 布尔数组 (Array&lt;boolean&gt;) 对象数组 (Array&lt;object&gt;) 循环体 (必填):定义每次循环需要执行的节点流程,包含: +循环体开始:标记循环开始的位置。 循环体结束:标记循环结束的位置,并可选择输出结果变量。 循环体配置 link 在循环体内部,可以添加任意类型的节点,如:知识库搜索引用合并https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/knowledge_base_search_merge/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/knowledge_base_search_merge/ 作用 link将多个知识库搜索结果合并成一个结果进行输出,并会通过 RRF 进行重新排序(根据排名情况),并且支持最大 tokens 过滤。 +使用方法 linkAI对话只能接收一个知识库引用内容。因此,如果调用了多个知识库,无法直接引用所有知识库(如下图) +使用知识库搜索引用合并,可以把多个知识库的搜索结果合在一起。 +可用例子: link 经过问题分类后对不同知识库进行检索,然后统一给一个 AI 进行回答,此时可以用到合并,不需要每个分支都添加一个 AI 对话。问题优化https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/coreferenceresolution/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/coreferenceresolution/特点 link 可重复添加 有外部输入 触发执行 背景 link在 RAG 中,我们需要根据输入的问题去数据库里执行 embedding 搜索,查找相关的内容,从而查找到相似的内容(简称知识库搜索)。 +在搜索的过程中,尤其是连续对话的搜索,我们通常会发现后续的问题难以搜索到合适的内容,其中一个原因是知识库搜索只会使用“当前”的问题去执行。看下面的例子: +用户在提问“第二点是什么”的时候,只会去知识库里查找“第二点是什么”,压根查不到内容。实际上需要查询的是“QA结构是什么”。因此我们需要引入一个【问题优化】模块,来对用户当前的问题进行补全,从而使得知识库搜索能够搜索到合适的内容。使用补全后效果如下: +功能 link调用 AI 去对用户当前的问题进行补全。目前主要是补全“指代”词,使得检索词更加的完善可靠,从而增强上下文连续对话的知识库搜索能力。 +遇到最大的难题在于:模型对于【补全】的概念可能不清晰,且对于长上下文往往无法准确的知道应该如何补全。 +示例 link 接入谷歌搜索Laf 函数调用https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/laf/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/laf/介绍 linkLaf 函数调用模块可以调用 Laf 账号下的云函数,其工作原理与 HTTP 模块相同,有以下特殊特征: +只能使用 POST 请求 请求自带系统参数 systemParams,无需通过变量传递。 绑定 Laf 账号 link要调用 Laf 云函数,首先需要绑定 Laf 账号和应用,并且在应用中创建云函数。 +Laf 提供了 PAT(访问凭证) 来实现 Laf 平台外的快捷登录,可以访问 Laf 文档查看详细如何获取 PAT。 +在获取到 PAT 后,我们可以进入 FastGPT 的账号页或是在高级编排中的 Laf模块 对 Laf 账号进行绑定。Laf 账号是团队共享的,仅团队管理员可配置。 +填入 PAT 验证后,选择需要绑定的应用(应用需要是 Running 状态),即可调用该应用下的云函数。 +编写云函数 linkLaf 云函数拥有根据 interface 自动生成 OpenAPI 的能力,可以参照下面的代码编写云函数,以便自动生成 OpenAPI 文档。 +Laf模块可以根据 OpenAPI 文档,自动识别出入参,无需手动添加数据类型。如果不会写 TS,可忽略,手动在 FastGPT 中添加参数即可。 +import cloud from &#39;@lafjs/cloud&#39; interface IRequestBody { // 自定义入参,FastGPT 传入的均为POST请求。 data1: string // 必填参数 data2?自定义反馈https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/custom_feedback/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/workflow/custom_feedback/该模块为临时模块,后续会针对该模块进行更全面的设计。 +特点 link 可重复添加 无外部输入 自动执行 介绍 link自定义反馈模块,可以为你的对话增加一个反馈标记,从而方便在后台更好的分析对话的数据。 +在调试模式下,不会记录反馈内容,而是直接提示: 自动反馈测试: 反馈内容。 +在对话模式(对话、分享窗口、带 chatId 的 API 调用)时,会将反馈内容记录到对话日志中。(会延迟60s记录) +作用 link自定义反馈模块的功能类似于程序开发的埋点,便于你观测的对话中的数据。使用 Gapier 快速导入Agent工具https://doc.tryfastgpt.ai/docs/guide/workbench/gapier/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/workbench/gapier/FastGPT V4.7版本加入了工具调用,可以兼容 GPTs 的 Actions。这意味着,你可以直接导入兼容 GPTs 的 Agent 工具。 +Gapier 是一个在线 GPTs Actions工具,提供了50多种现成工具,并且每天有免费额度进行测试,方便用户试用,官方地址为:https://gapier.com/。 +现在,我们开始把 Gapier 的工具导入到 FastGPT 中。 +1. 创建插件 link Step1 Step2 Step3 登录Gapier 复制相关参数 Step4 Step5 Step6 自定义请求头: Authorization +请求值: Bearer 复制的key 创建完后,如果需要变更,无需重新创建,只需要修改对应参数即可,会自动做差值比较更新。 +2. 应用绑定工具 link简易模式 link Step1 Step2 Step3 Step4 高级编排 link Step1 Step2 Step3 Step4 3. 工具调用说明 link不同模型的区别 link不同模型调用工具采用不同的方法,有些模型支持 toolChoice 和 functionCall 效果会更好。不支持这两种方式的模型通过提示词调用,但是效果不是很好,并且为了保证顺利调用,FastGPT内置的提示词,仅支持每次调用一个工具。 +具体哪些模型支持 functionCall 可以官网查看(当然,也需要OneAPI支持),同时需要调整模型配置文件中的对应字段(详细看配置字段说明)。 +线上版用户,可以在模型选择时,看到是否支持函数调用的标识。如何提交系统插件https://doc.tryfastgpt.ai/docs/guide/plugins/how_to_submit_system_plugin/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/how_to_submit_system_plugin/如何向 FastGPT 社区提交系统插件 +系统插件原则 link 尽可能的轻量简洁,以解决实际问题的工具为主 不允许有密集 cpu 计算,不会占用大量内存占用或网络消耗 不允许操作数据库 不允许往固定的私人地址发送请求(不包含请求某些在线服务,例如 gapier, firecrawl等) 不允许使用私人包,可使用主流的开源包 什么插件可以合并 link由于目前未采用按需安装的模式,合并进仓库的插件会全部展示给用户使用。 +为了控制插件的质量以及避免数量过多带来的繁琐,并不是所有的插件都会被合并到开源仓库中,你可以提前 PR 与我们沟通插件的内容。 +后续实现插件按需安装后,我们会允许更多的社区插件合入。 +如何写一个系统插件 - 初步 linkFastGPT 系统插件和用户工作台的插件效果是一致的,所以你需要提前了解“插件”的定义和功能。 +在 FastGPT 中,插件是一种特殊的工作流,它允许你将一个工作流封装起来,并自定义入口参数和出口参数,类似于代码里的 “子函数”。 +跑通 FastGPT dev 环境 link 需要在 dev 环境下执行下面的操作。 +在 FastGPT 工作台中,创建一个插件 link 选择基础模板即可。 +创建系统插件配置 link 系统插件配置以及自定义代码,都会在 packages/plugins 目录下。 +在 packages/plugins/src 下,复制一份 template 目录,并修改名字。 打开目录里面的 template.json 文件,配置如下: 目录还有一个 index.ts 文件,下文再提。 { &#34;author&#34;: &#34;填写你的名字&#34;, &#34;version&#34;: &#34;当前系统版本号&#34;, &#34;name&#34;: &#34;插件名&#34;, &#34;avatar&#34;: &#34;插件头像,需要配成 icon 格式。直接把 logo 图在 pr 评论区提交即可,我们会帮你加入。&#34;, &#34;intro&#34;: &#34; 插件的描述,这个描述会影响工具调用&#34;, &#34;showStatus&#34;: false, // 是否在对话过程展示状态 &#34;weight&#34;: 10, // 排序权重,均默认 10 &#34;isTool&#34;: true, // 是否作为工具调用节点 &#34;templateType&#34;: &#34;tools&#34;, // 都填写 tools 即可,由官方来分类 &#34;workflow&#34;: { // 这个对象先不管,待会直接粘贴导出的工作流即可 &#34;nodes&#34;: [], &#34;edges&#34;: [] } } 打开 packages/plugins/register 文件,注册你的插件。在 list 数组中,加入一个你插件目录的名字,如下图的例子。如需构建插件组(带目录),可参考 DuckDuckGo 插件。 无需额外写代码的插件,直接放在 staticPluginList 内,需要在项目内额外写代码的,写在 packagePluginList 中。SearXNG 搜索插件配置与使用说明https://doc.tryfastgpt.ai/docs/guide/plugins/searxng_plugin_guide/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/searxng_plugin_guide/SearXNG是一款免费的互联网元搜索引擎,它汇总了来自各种搜索服务和数据库的结果。它不会跟踪或分析用户。用户可以自行部署它进行使用。本文介绍 Searxng 的部署以及接入 FastGPT 插件。 +1. 部署应用 link这里介绍在 Sealos 中部署 SearXNG 的方法。Docker 部署,可以直接参考 SearXNG 官方教程。 +点击打开 Sealos 北京区,点击应用部署,并新建一个应用: +打开应用部署 点击新建应用 2. 部署配置 link把下面参数,填入配置中: +镜像名: searxng/searxng:latest CPU: 0.2 内存: 512M 容器暴露端口: 8080 开启公网访问 点击高级配置,填写环境变量和配置文件 环境变量 +填下面两个内容,主要是为了减小并发,不然内存占用非常大。 +UWSGI_WORKERS=4 UWSGI_THREADS=4 配置文件 +新增一个配置文件,文件名:/etc/searx/settings.yml 文件内容: +general: debug: false instance_name: &#34;searxng&#34; privacypolicy_url: false donation_url: false contact_url: false enable_metrics: true open_metrics: &#39;&#39; brand: new_issue_url: https://github.com/searxng/searxng/issues/new docs_url: https://docs.searxng.org/ public_instances: https://searx.space wiki_url: https://github.com/searxng/searxng/wiki issue_url: https://github.com/searxng/searxng/issues search: safe_search: 0 autocomplete: &#34;&#34; autocomplete_min: 4 default_lang: &#34;auto&#34; ban_time_on_fail: 5 max_ban_time_on_fail: 120 formats: - html server: port: 8080 bind_address: &#34;0.Google 搜索插件填写说明https://doc.tryfastgpt.ai/docs/guide/plugins/google_search_plugin_guide/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/google_search_plugin_guide/创建Google Custom Search Engine link https://programmablesearchengine.google.com/ +我们连到Custom Search Engine control panel 建立Search Engine +取得搜索引擎的ID,即cx +获取api key link https://developers.google.com/custom-search/v1/overview?hl=zh-cn +填入插件输入参数 link 将搜索引擎ID填入cx字段,api key填入key字段Bing 搜索插件填写说明https://doc.tryfastgpt.ai/docs/guide/plugins/bing_search_plugin/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/bing_search_plugin/ 打开微软Azure官网,登陆账号 link https://portal.azure.com/ +创建bing web搜索资源 link 搜索Bing Search v7,点击创建 +https://portal.azure.com/#create/Microsoft.BingSearch +进入资源详情点击管理密钥 link 4. 复制任意一个密钥填入插件输入 linkDoc2x 插件填写说明https://doc.tryfastgpt.ai/docs/guide/plugins/doc2x_plugin_guide/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/plugins/doc2x_plugin_guide/打开docx官网,创建账号,并复制 apikey link https://doc2x.noedgeai.com/ +填写apikey到fastgpt中 link 工作流****中: +简易模式使用:知识库基础原理介绍https://doc.tryfastgpt.ai/docs/guide/knowledge_base/rag/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/rag/RAG文档 +1. 引言 link随着自然语言处理(NLP)技术的迅猛发展,生成式语言模型(如GPT、BART等)在多种文本生成任务中表现卓越,尤其在语言生成和上下文理解方面。然而,纯生成模型在处理事实类任务时存在一些固有的局限性。例如,由于这些模型依赖于固定的预训练数据,它们在回答需要最新或实时信息的问题时,可能会出现“编造”信息的现象,导致生成结果不准确或缺乏事实依据。此外,生成模型在面对长尾问题和复杂推理任务时,常因缺乏特定领域的外部知识支持而表现不佳,难以提供足够的深度和准确性。 +与此同时,检索模型(Retriever)能够通过在海量文档中快速找到相关信息,解决事实查询的问题。然而,传统检索模型(如BM25)在面对模糊查询或跨域问题时,往往只能返回孤立的结果,无法生成连贯的自然语言回答。由于缺乏上下文推理能力,检索模型生成的答案通常不够连贯和完整。 +为了解决这两类模型的不足,检索增强生成模型(Retrieval-Augmented Generation,RAG)应运而生。RAG通过结合生成模型和检索模型的优势,实时从外部知识库中获取相关信息,并将其融入生成任务中,确保生成的文本既具备上下文连贯性,又包含准确的知识。这种混合架构在智能问答、信息检索与推理、以及领域特定的内容生成等场景中表现尤为出色。 +1.1 RAG的定义 linkRAG是一种将信息检索与生成模型相结合的混合架构。首先,检索器从外部知识库或文档集中获取与用户查询相关的内容片段;然后,生成器基于这些检索到的内容生成自然语言输出,确保生成的内容既信息丰富,又具备高度的相关性和准确性。 +2. RAG模型的核心机制 linkRAG 模型由两个主要模块构成:检索器(Retriever)与生成器(Generator)。这两个模块相互配合,确保生成的文本既包含外部的相关知识,又具备自然流畅的语言表达。 +2.1 检索器(Retriever) link检索器的主要任务是从一个外部知识库或文档集中获取与输入查询最相关的内容。在RAG中,常用的技术包括: +向量检索:如BERT向量等,它通过将文档和查询转化为向量空间中的表示,并使用相似度计算来进行匹配。向量检索的优势在于能够更好地捕捉语义相似性,而不仅仅是依赖于词汇匹配。 传统检索算法:如BM25,主要基于词频和逆文档频率(TF-IDF)的加权搜索模型来对文档进行排序和检索。BM25适用于处理较为简单的匹配任务,尤其是当查询和文档中的关键词有直接匹配时。 RAG中检索器的作用是为生成器提供一个上下文背景,使生成器能够基于这些检索到的文档片段生成更为相关的答案。 +2.2 生成器(Generator) link生成器负责生成最终的自然语言输出。在RAG系统中,常用的生成器包括: +BART:BART是一种序列到序列的生成模型,专注于文本生成任务,可以通过不同层次的噪声处理来提升生成的质量 。 GPT系列:GPT是一个典型的预训练语言模型,擅长生成流畅自然的文本。它通过大规模数据训练,能够生成相对准确的回答,尤其在任务-生成任务中表现尤为突出 。 生成器在接收来自检索器的文档片段后,会利用这些片段作为上下文,并结合输入的查询,生成相关且自然的文本回答。这确保了模型的生成结果不仅仅基于已有的知识,还能够结合外部最新的信息。 +2.3 RAG的工作流程 linkRAG模型的工作流程可以总结为以下几个步骤: +输入查询:用户输入问题,系统将其转化为向量表示。 文档检索:检索器从知识库中提取与查询最相关的文档片段,通常使用向量检索技术或BM25等传统技术进行。 生成答案:生成器接收检索器提供的片段,并基于这些片段生成自然语言答案。生成器不仅基于原始的用户查询,还会利用检索到的片段提供更加丰富、上下文相关的答案。 输出结果:生成的答案反馈给用户,这个过程确保了用户能够获得基于最新和相关信息的准确回答。 3. RAG模型的工作原理 link3.1 检索阶段 link在RAG模型中,用户的查询首先被转化为向量表示,然后在知识库中执行向量检索。通常,检索器采用诸如BERT等预训练模型生成查询和文档片段的向量表示,并通过相似度计算(如余弦相似度)匹配最相关的文档片段。RAG的检索器不仅仅依赖简单的关键词匹配,而是采用语义级别的向量表示,从而在面对复杂问题或模糊查询时,能够更加准确地找到相关知识。这一步骤对于最终生成的回答至关重要,因为检索的效率和质量直接决定了生成器可利用的上下文信息 。 +3.2 生成阶段 link生成阶段是RAG模型的核心部分,生成器负责基于检索到的内容生成连贯且自然的文本回答。RAG中的生成器,如BART或GPT等模型,结合用户输入的查询和检索到的文档片段,生成更加精准且丰富的答案。与传统生成模型相比,RAG的生成器不仅能够生成语言流畅的回答,还可以根据外部知识库中的实际信息提供更具事实依据的内容,从而提高了生成的准确性 。 +3.3 多轮交互与反馈机制 linkRAG模型在对话系统中能够有效支持多轮交互。每一轮的查询和生成结果会作为下一轮的输入,系统通过分析和学习用户的反馈,逐步优化后续查询的上下文。通过这种循环反馈机制,RAG能够更好地调整其检索和生成策略,使得在多轮对话中生成的答案越来越符合用户的期望。此外,多轮交互还增强了RAG在复杂对话场景中的适应性,使其能够处理跨多轮的知识整合和复杂推理 。 +4. RAG的优势与局限 link4.1 优势 link 信息完整性:RAG 模型结合了检索与生成技术,使得生成的文本不仅语言自然流畅,还能够准确利用外部知识库提供的实时信息。这种方法能够显著提升生成任务的准确性,特别是在知识密集型场景下,如医疗问答或法律意见生成。通过从知识库中检索相关文档,RAG 模型避免了生成模型“编造”信息的风险,确保输出更具真实性 。 知识推理能力:RAG 能够利用大规模的外部知识库进行高效检索,并结合这些真实数据进行推理,生成基于事实的答案。相比传统生成模型,RAG 能处理更为复杂的任务,特别是涉及跨领域或跨文档的推理任务。例如,法律领域的复杂判例推理或金融领域的分析报告生成都可以通过RAG的推理能力得到优化 。 领域适应性强:RAG 具有良好的跨领域适应性,能够根据不同领域的知识库进行特定领域内的高效检索和生成。例如,在医疗、法律、金融等需要实时更新和高度准确性的领域,RAG 模型的表现优于仅依赖预训练的生成模型 。 4.2 局限 linkRAG(检索增强生成)模型通过结合检索器和生成器,实现了在多种任务中知识密集型内容生成的突破性进展。然而,尽管其具有较强的应用潜力和跨领域适应能力,但在实际应用中仍然面临着一些关键局限,限制了其在大规模系统中的部署和优化。以下是RAG模型的几个主要局限性: +4.2.1 检索器的依赖性与质量问题 linkRAG模型的性能很大程度上取决于检索器返回的文档质量。由于生成器主要依赖检索器提供的上下文信息,如果检索到的文档片段不相关、不准确,生成的文本可能出现偏差,甚至产生误导性的结果。尤其在多模糊查询或跨领域检索的情况下,检索器可能无法找到合适的片段,这将直接影响生成内容的连贯性和准确性。知识库搜索方案和参数https://doc.tryfastgpt.ai/docs/guide/knowledge_base/dataset_engine/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/dataset_engine/理解向量 linkFastGPT 采用了 RAG 中的 Embedding 方案构建知识库,要使用好 FastGPT 需要简单的理解Embedding向量是如何工作的及其特点。 +人类的文字、图片、视频等媒介是无法直接被计算机理解的,要想让计算机理解两段文字是否有相似性、相关性,通常需要将它们转成计算机可以理解的语言,向量是其中的一种方式。 +向量可以简单理解为一个数字数组,两个向量之间可以通过数学公式得出一个距离,距离越小代表两个向量的相似度越大。从而映射到文字、图片、视频等媒介上,可以用来判断两个媒介之间的相似度。向量搜索便是利用了这个原理。 +而由于文字是有多种类型,并且拥有成千上万种组合方式,因此在转成向量进行相似度匹配时,很难保障其精确性。在向量方案构建的知识库中,通常使用topk召回的方式,也就是查找前k个最相似的内容,丢给大模型去做更进一步的语义判断、逻辑推理和归纳总结,从而实现知识库问答。因此,在知识库问答中,向量搜索的环节是最为重要的。 +影响向量搜索精度的因素非常多,主要包括:向量模型的质量、数据的质量(长度,完整性,多样性)、检索器的精度(速度与精度之间的取舍)。与数据质量对应的就是检索词的质量。 +检索器的精度比较容易解决,向量模型的训练略复杂,因此数据和检索词质量优化成了一个重要的环节。 +提高向量搜索精度的方法 link 更好分词分段:当一段话的结构和语义是完整的,并且是单一的,精度也会提高。因此,许多系统都会优化分词器,尽可能的保障每组数据的完整性。 精简index的内容,减少向量内容的长度:当index的内容更少,更准确时,检索精度自然会提高。但与此同时,会牺牲一定的检索范围,适合答案较为严格的场景。 丰富index的数量,可以为同一个chunk内容增加多组index。 优化检索词:在实际使用过程中,用户的问题通常是模糊的或是缺失的,并不一定是完整清晰的问题。因此优化用户的问题(检索词)很大程度上也可以提高精度。 微调向量模型:由于市面上直接使用的向量模型都是通用型模型,在特定领域的检索精度并不高,因此微调向量模型可以很大程度上提高专业领域的检索效果。 FastGPT 构建知识库方案 link数据存储结构 link在 FastGPT 中,整个知识库由库、集合和数据 3 部分组成。集合可以简单理解为一个文件。一个库中可以包含多个集合,一个集合中可以包含多组数据。最小的搜索单位是库,也就是说,知识库搜索时,是对整个库进行搜索,而集合仅是为了对数据进行分类管理,与搜索效果无关。(起码目前还是) +向量存储结构 linkFastGPT 采用了PostgresSQL的PG Vector插件作为向量检索器,索引为HNSW。且PostgresSQL仅用于向量检索(该引擎可以替换成其它数据库),MongoDB用于其他数据的存取。 +在MongoDB的dataset.datas表中,会存储向量原数据的信息,同时有一个indexes字段,会记录其对应的向量ID,这是一个数组,也就是说,一组数据可以对应多个向量。 +在PostgresSQL的表中,设置一个vector字段用于存储向量。在检索时,会先召回向量,再根据向量的ID,去MongoDB中寻找原数据内容,如果对应了同一组原数据,则进行合并,向量得分取最高得分。 +多向量的目的和使用方式 link在一组向量中,内容的长度和语义的丰富度通常是矛盾的,无法兼得。因此,FastGPT 采用了多向量映射的方式,将一组数据映射到多组向量中,从而保障数据的完整性和语义的丰富度。 +你可以为一组较长的文本,添加多组向量,从而在检索时,只要其中一组向量被检索到,该数据也将被召回。 +意味着,你可以通过标注数据块的方式,不断提高数据块的精度。 +检索方案 link 通过问题优化实现指代消除和问题扩展,从而增加连续对话的检索能力以及语义丰富度。 通过Concat query来增加Rerank连续对话的时,排序的准确性。 通过RRF合并方式,综合多个渠道的检索效果。 通过Rerank来二次排序,提高精度。 搜索参数 link 搜索模式 link语义检索 link语义检索是通过向量距离,计算用户问题与知识库内容的距离,从而得出“相似度”,当然这并不是语文上的相似度,而是数学上的。 +优点: +相近语义理解 跨多语言理解(例如输入中文问题匹配英文知识点) 多模态理解(文本,图片,音视频等) 缺点: +依赖模型训练效果 精度不稳定 受关键词和句子完整度影响 全文检索 link采用传统的全文检索方式。适合查找关键的主谓语等。 +混合检索 link同时使用向量检索和全文检索,并通过 RRF 公式进行两个搜索结果合并,一般情况下搜索结果会更加丰富准确。 +由于混合检索后的查找范围很大,并且无法直接进行相似度过滤,通常需要进行利用重排模型进行一次结果重新排序,并利用重排的得分进行过滤。 +结果重排 link利用ReRank模型对搜索结果进行重排,绝大多数情况下,可以有效提高搜索结果的准确率。不过,重排模型与问题的完整度(主谓语齐全)有一些关系,通常会先走问题优化后再进行搜索-重排。重排后可以得到一个0-1的得分,代表着搜索内容与问题的相关度,该分数通常比向量的得分更加精确,可以根据得分进行过滤。 +FastGPT 会使用 RRF 对重排结果、向量搜索结果、全文检索结果进行合并,得到最终的搜索结果。API 文件库https://doc.tryfastgpt.ai/docs/guide/knowledge_base/api_dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/api_dataset/背景 link目前 FastGPT 支持本地文件导入,但是很多时候,用户自身已经有了一套文档库,如果把文件重复导入一遍,会造成二次存储,并且不方便管理。因为 FastGPT 提供了一个 API 文件库的概念,可以通过简单的 API 接口,去拉取已有的文档库,并且可以灵活配置是否导入。 +API 文件库能够让用户轻松对接已有的文档库,只需要按照 FastGPT 的 API 文件库规范,提供相应文件接口,然后将服务接口的 baseURL 和 token 填入知识库创建参数中,就能直接在页面上拿到文件库的内容,并选择性导入 +如何使用 API 文件库 link创建知识库时,选择 API 文件库类型,然后需要配置两个关键参数:文件服务接口的 baseURL 和用于身份验证的请求头信息。只要提供的接口规范符合 FastGPT 的要求,系统就能自动获取并展示完整的文件列表,可以根据需要选择性地将文件导入到知识库中。 +你需要提供两个参数: +baseURL: 文件服务接口的 baseURL authorization: 用于身份验证的请求头信息,实际请求格式为 Authorization: Bearer &lt;token&gt; 接口规范 link接口响应格式: +type ResponseType = { success: boolean; message: string; data: any; } 数据类型: +// 文件列表中,单项的文件类型 type FileListItem = { id: string; parentId: string | null; name: string; type: &#39;file&#39; | &#39;folder&#39;; updateTime: Date; createTime: Date; } 1.飞书知识库https://doc.tryfastgpt.ai/docs/guide/knowledge_base/lark_dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/lark_dataset/FastGPT v4.8.16 版本开始,商业版用户支持飞书知识库导入,用户可以通过配置飞书应用的 appId 和 appSecret,并选中一个文档空间的顶层文件夹来导入飞书知识库。目前处于测试阶段,部分交互有待优化。 +由于飞书限制,无法直接获取所有文档内容,目前仅可以获取共享空间下文件目录的内容,无法获取个人空间和知识库里的内容。 +1. 创建飞书应用 link打开 飞书开放平台,点击创建应用,选择自建应用,然后填写应用名称。 +2. 配置应用权限 link创建应用后,进入应用可以配置相关权限,这里需要增加两个权限: +获取云空间文件夹下的云文档清单 查看新版文档 3. 获取 appId 和 appSecret link 4. 给 Folder 增加权限 link可参考飞书教程: https://open.feishu.cn/document/server-docs/docs/drive-v1/faq#b02e5bfb +大致总结为: +把刚刚创建的应用拉入一个群里 给这个群增加目录权限 如果你的目录已经给全员组增加权限了,则可以跳过上面步骤,直接获取 Folder Token。 +5. 获取 Folder Token link可以页面路径上获取 Folder Token,注意不要把问号复制进来。 +6. 创建知识库 link根据 3 和 5 获取到的 3 个参数,创建知识库,选择飞书文件库类型,然后填入对应的参数,点击创建。语雀文件库https://doc.tryfastgpt.ai/docs/guide/knowledge_base/yuque_dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/yuque_dataset/FastGPT v4.8.16 版本开始,商业版用户支持语雀文件库导入,用户可以通过配置语雀的 token 和 uid 来导入语雀文档库。目前处于测试阶段,部分交互有待优化。 +1. 获取语雀的 token 和 uid link在语雀首页 - 个人头像 - 设置,可找到对应参数。 +参考下图获取 Token 和 User ID,注意给 Token 赋值权限: +获取 Token 增加权限 获取 User ID 2. 创建知识库 link使用上一步获取的 token 和 uid,创建知识库,选择语雀文件库类型,然后填入对应的参数,点击创建。 +3. 导入文档 link创建完知识库后,点击添加文件即可导入语雀的文档库,跟随引导即可。 +语雀知识库支持定时同步功能,每天会不定时的扫描一次,如果文档有更新,则会进行同步,也可以进行手动同步。Web 站点同步https://doc.tryfastgpt.ai/docs/guide/knowledge_base/websync/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/websync/该功能目前仅向商业版用户开放。 +什么是 Web 站点同步 linkWeb 站点同步利用爬虫的技术,可以通过一个入口网站,自动捕获同域名下的所有网站,目前最多支持200个子页面。出于合规与安全角度,FastGPT 仅支持静态站点的爬取,主要用于各个文档站点快速构建知识库。 +Tips: 国内的媒体站点基本不可用,公众号、csdn、知乎等。可以通过终端发送curl请求检测是否为静态站点,例如: +curl https://doc.tryfastgpt.ai/docs/intro/ 如何使用 link1. 新建知识库,选择 Web 站点同步 link 2. 点击配置站点信息 link 3. 填写网址和选择器 link 好了, 现在点击开始同步,静等系统自动抓取网站信息即可。 +创建应用,绑定知识库 link 选择器如何使用 link选择器是 HTML CSS JS 的产物,你可以通过选择器来定位到你需要抓取的具体内容,而不是整个站点。使用方式为: +首先打开浏览器调试面板(通常是 F12,或者【右键 - 检查】) link 输入对应元素的选择器 link菜鸟教程 css 选择器,具体选择器的使用方式可以参考菜鸟教程。 +上图中,我们选中了一个区域,对应的是div标签,它有 data-prismjs-copy, data-prismjs-copy-success, data-prismjs-copy-error 三个属性,这里我们用到一个就够。所以选择器是: div[data-prismjs-copy] +除了属性选择器,常见的还有类和ID选择器。例如: +上图 class 里的是类名(可能包含多个类名,都是空格隔开的,选择一个即可),选择器可以为:.docs-content +多选择器使用 link在开头的演示中,我们对 FastGPT 文档是使用了多选择器的方式来选择,通过逗号隔开了两个选择器。 +我们希望选中上图两个标签中的内容,此时就需要两组选择器。一组是:.docs-content .mb-0.d-flex,含义是 docs-content 类下同时包含 mb-0和d-flex 两个类的子元素; +另一组是.docs-content div[data-prismjs-copy],含义是docs-content 类下包含data-prismjs-copy属性的div元素。 +把两组选择器用逗号隔开即可:.docs-content .mb-0.d-flex, .docs-content div[data-prismjs-copy]外部文件知识库https://doc.tryfastgpt.ai/docs/guide/knowledge_base/externalfile/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/knowledge_base/externalfile/外部文件库是 FastGPT 商业版特有功能。它允许接入你现在的文件系统,无需将文件再导入一份到 FastGPT 中。 +并且,阅读权限可以通过你的文件系统进行控制。 +导入参数说明 link 外部预览地址:用于跳转你的文件阅读地址,会携带“文件阅读ID”进行访问。 文件访问URL:文件可访问的地址。 文件阅读ID:通常情况下,文件访问URL是临时的。如果希望永久可以访问,你需要使用该文件阅读ID,并配合上“外部预览地址”,跳转至新的阅读地址进行原文件访问。 文件名:默认会自动解析文件访问URL上的文件名。如果你手动填写,将会以手动填写的值为准。 点击查看API导入文档 +API 文件库替代方案 link4.8.15 提供了新的知识库类型 - API 文件库,对外部文件知识库做了进一步的拓展 +通过对接口进行简单的调整,就能使用 API 文件库代替外部文件知识库的功能 +你可以直接将外部文件知识库中的外部预览地址,作为 API 文件库接口规范中获取文件阅读链接的接口返回 +然后再以相同的 baseURL 实现获取文件列表和获取单个文件内容这两个接口 +这样就能轻松地使用 API 文件库替代原有的外部文件知识库,更多详细的内容见 API 文件库的文档团队&成员组&权限https://doc.tryfastgpt.ai/docs/guide/team_permissions/team_roles_permissions/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/team_permissions/team_roles_permissions/对话框与HTML渲染https://doc.tryfastgpt.ai/docs/guide/dialogboxes/htmlrendering/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/dialogboxes/htmlrendering/ 源码模式 预览模式 全屏模式 1. 设计背景 link尽管Markdown本身支持嵌入HTML标签,但由于安全问题,许多平台和环境对HTML的渲染进行了限制,特别是在渲染动态内容、交互式元素以及外部资源时。这些限制大大降低了用户在撰写和展示复杂文档时的灵活性,尤其是当需要嵌入外部HTML内容时。为了应对这一问题,我们通过使用 iframe 来嵌入和渲染HTML内容,并结合 sandbox 属性,保障了外部HTML的安全渲染。 +2. 功能简介 link该功能模块的主要目的是扩展FastGPT在Markdown渲染中的能力,支持嵌入和渲染HTML内容。由于是利用 Iframe 渲染,所以无法确认内容的高度,FastGPT 中会给 Iframe 设置一个固定高度来进行渲染。并且不支持 HTML 中执行 js 脚本。 +3. 技术实现 link本模块通过以下方式实现了HTML渲染和互动功能: +组件设计:该模块通过渲染 iframe 类型的代码块展示HTML内容。使用自定义的 IframeBlock 组件,结合 sandbox 属性来保障嵌入内容的安全性。sandbox 限制了外部HTML中的行为,如禁用脚本执行、限制表单提交等,确保HTML内容的安全性。通过辅助函数与渲染Markdown内容的部分结合,处理 iframe 嵌入的HTML内容。 安全机制:通过 iframe 的 sandbox 属性和 referrerPolicy 来防止潜在的安全风险。sandbox 属性提供了细粒度的控制,允许特定的功能(如脚本、表单、弹出窗口等)在受限的环境中执行,以确保渲染的HTML内容不会对系统造成威胁。 展示与互动功能:用户可以通过不同的展示模式(如全屏、预览、源代码模式)自由切换,以便更灵活地查看和控制嵌入的HTML内容。嵌入的 iframe 自适应父容器的宽度,同时保证 iframe嵌入的内容能够适当显示。 4. 如何使用 link你只需要通过 Markdown 代码块格式,并标记语言为 html 即可。例如: +```html &lt;!DOCTYPE html&gt; &lt;html lang=&#34;zh-CN&#34;&gt; &lt;head&gt; &lt;meta charset=&#34;UTF-8&#34;&gt; &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt; &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&gt; &lt;title&gt;欢迎使用FastGPT&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;nav&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;#home&#34;&gt;首页&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#about&#34;&gt;关于我们&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#contact&#34;&gt;联系我们&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#gallery&#34;&gt;图库&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/nav&gt; &lt;/body&gt; &lt;/html&gt;钉钉 SSO 配置https://doc.tryfastgpt.ai/docs/guide/admin/sso_dingtalk/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/guide/admin/sso_dingtalk/1. 注册钉钉应用 link登录 钉钉开放平台,创建一个应用。 +2. 配置钉钉应用安全设置 link点击进入创建好的应用后,点开安全设置,配置出口 IP(服务器 IP),和重定向 URL。重定向 URL 填写逻辑: +{{fastgpt 域名}}/login/provider +3. 设置钉钉应用权限 link点击进入创建好的应用后,点开权限设置,开放两个权限: 个人手机号信息和通讯录个人信息读权限 +4. 发布应用 link点击进入创建好的应用后,点开版本管理与发布,随便创建一个新版本即可。 +5. 在 FastGPT Admin 配置钉钉应用 id link名字都是对应上,直接填写即可。 +6. 测试 link通过 API 访问应用https://doc.tryfastgpt.ai/docs/use-cases/external-integration/openapi/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/openapi/在 FastGPT 中,你可以为每一个应用创建多个 API 密钥,用于访问应用的 API 接口。每个密钥仅能访问一个应用。完整的接口可以查看应用对话接口。 +获取 API 密钥 link依次选择应用 -&gt; 「API访问」,然后点击「API 密钥」来创建密钥。 +warning 密钥需要自己保管好,一旦关闭就无法再复制密钥,只能创建新密钥再复制。 +🍅 +Tips: 安全起见,你可以设置一个额度或者过期时间,放置 key 被滥用。 +替换三方应用的变量 link OPENAI_API_BASE_URL: https://api.fastgpt.in/api (改成自己部署的域名) OPENAI_API_KEY = 上一步获取到的密钥 ChatGPT Next Web 示例: +ChatGPT Web 示例:接入飞书机器人教程https://doc.tryfastgpt.ai/docs/use-cases/external-integration/feishu/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/feishu/从 4.8.10 版本起,FastGPT 商业版支持直接接入飞书机器人,无需额外的 API。 +1. 申请飞书应用 link开一个免费的测试企业更方便进行调试。 +在飞书开放平台的开发者后台申请企业自建应用。 添加一个机器人应用。 +2. 在 FastGPT 新建发布渠道 link在fastgpt中选择想要接入的应用,在 发布渠道 页面,新建一个接入飞书机器人的发布渠道,填写好基础信息。 +3. 获取应用的 App ID, App Secret 两个凭证 link在飞书开放平台开发者后台,刚刚创建的企业自建应用中,找到 App ID 和 App Secret,填入 FastGPT 新建发布渠道的对话框里面。 +填入两个参数到 FastGPT 配置弹窗中。 +(可选)在飞书开放平台开发者后台,点击事件与回调 -&gt; 加密策略 获取 Encrypt Key,并填入飞书机器人接入的对话框里面 +Encrypt Key 用于加密飞书服务器与 FastGPT 之间通信。 建议如果使用 Https 协议,则不需要 Encrypt Key。如果使用 Http 协议通信,则建议使用 Encrypt Key Verification Token 默认生成的这个 Token 用于校验来源。但我们使用飞书官方推荐的另一种更为安全的校验方式,因此可以忽略这个配置项。 +4. 配置回调地址 link新建好发布渠道后,点击请求地址,复制对应的请求地址。 +在飞书控制台,点击左侧的 事件与回调 ,点击配置订阅方式旁边的编辑 icon,粘贴刚刚复制的请求地址到输入框中。 +5. 配置机器人回调事件和权限 link 添加 接收消息 事件 在事件与回调页面,点击添加事件。接入钉钉机器人教程https://doc.tryfastgpt.ai/docs/use-cases/external-integration/dingtalk/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/dingtalk/从 4.8.16 版本起,FastGPT 商业版支持直接接入钉钉机器人,无需额外的 API。 +1. 创建钉钉企业内部应用 link 在钉钉开发者后台创建企业内部应用。 获取Client ID和Client Secret。 2. 为 FastGPT 添加发布渠道 link在 FastGPT 中选择要接入的应用,在发布渠道页面,新建一个接入钉钉机器人的发布渠道。 +将前面拿到的 Client ID 和 Client Secret 填入配置弹窗中。 +创建完成后,点击请求地址按钮,然后复制回调地址。 +3. 为应用添加机器人应用能力。 link在钉钉开发者后台,点击左侧添加应用能力,为刚刚创建的企业内部应用添加 机器人 应用能力。 +4. 配置机器人回调地址 link点击左侧机器人 应用能力,然后将底部消息接受模式设置为HTTP模式,消息接收地址填入前面复制的 FastGPT 的回调地址。 +调试完成后,点击发布。 +5. 发布应用 link机器人发布后,还需要在版本管理与发布页面发布应用版本。 +点击创建新版本后,设置版本号和版本描述后点击保存发布即可。 +应用发布后,即可在钉钉企业中使用机器人功能,可对机器人私聊。或者在群组添加机器人后@机器人,触发对话。接入微信公众号教程https://doc.tryfastgpt.ai/docs/use-cases/external-integration/official_account/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/official_account/从 4.8.10 版本起,FastGPT 商业版支持直接接入微信公众号,无需额外的 API。 +注意⚠️: 目前只支持通过验证的公众号(服务号和订阅号都可以) +1. 在 FastGPT 新建发布渠道 link在 FastGPT 中选择想要接入的应用,在 发布渠道 页面,新建一个接入微信公众号的发布渠道,填写好基础信息。 +2. 获取 AppID 、 Secret和Token link1. 登录微信公众平台,选择您的公众号。 link打开微信公众号官网:https://mp.weixin.qq.com +只支持通过验证的公众号,未通过验证的公众号暂不支持。 +开发者可以从这个链接申请微信公众号的测试号进行测试,测试号可以正常使用,但不能配置 AES Key +2. 把3个参数填入 FastGPT 配置弹窗中。 link 3. 在 IP 白名单中加入 FastGPT 的 IP link 私有部署的用户可自行查阅自己的 IP 地址。 +海外版用户(cloud.tryfastgpt.ai)可以填写下面的 IP 白名单: +35.240.227.100 34.124.237.188 34.143.240.160 34.87.51.146 34.87.79.202 35.247.163.68 34.87.102.86 35.198.192.104 34.126.163.205 34.124.189.116 34.143.149.171 34.87.173.252 34.142.157.52 34.87.180.104 34.87.20.189 34.87.110.152 34.87.44.74 34.87.152.33 35.197.149.75 35.247.161.35 国内版用户(fastgpt.cn)可以填写下面的 IP 白名单:对接 chatgpt-on-wechathttps://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/1 分钟对接 chatgpt-on-wechat linkchatgpt-on-wechat GitHub 地址 +由于 FastGPT 的 API 接口和 OpenAI 的规范一致,可以无需变更原来的应用即可使用 FastGPT 上编排好的应用。API 使用可参考 这篇文章。编排示例,可参考 高级编排介绍 +1. 获取 OpenAPI 密钥 link依次选择应用 -&gt; 「API访问」,然后点击「API 密钥」来创建密钥。 +warning 密钥需要自己保管好,一旦关闭就无法再复制密钥,只能创建新密钥再复制。 +3. 创建 docker-compose.yml 文件 link只需要修改 OPEN_AI_API_KEY 和 OPEN_AI_API_BASE 两个环境变量即可。其中 OPEN_AI_API_KEY 为第一步获取的密钥,OPEN_AI_API_BASE 为 FastGPT 的 OpenAPI 地址,例如:https://api.fastgpt.in/api/v1。 +随便找一个目录,创建一个 docker-compose.yml 文件,将下面的代码复制进去。 +version: &#39;2.0&#39; services: chatgpt-on-wechat: image: zhayujie/chatgpt-on-wechat container_name: chatgpt-on-wechat security_opt: - seccomp:unconfined environment: OPEN_AI_API_KEY: &#39;fastgpt-z51pkjqm9nrk03a1rx2funoy&#39; OPEN_AI_API_BASE: &#39;https://api.fastgpt.in/api/v1&#39; MODEL: &#39;gpt-3.5-turbo&#39; CHANNEL_TYPE: &#39;wx&#39; PROXY: &#39;&#39; HOT_RELOAD: &#39;False&#39; SINGLE_CHAT_PREFIX: &#39;[&#34;bot&#34;, &#34;@bot&#34;]&#39; SINGLE_CHAT_REPLY_PREFIX: &#39;&#34;[bot] &#34;&#39; GROUP_CHAT_PREFIX: &#39;[&#34;@bot&#34;]&#39; GROUP_NAME_WHITE_LIST: &#39;[&#34;ChatGPT测试群&#34;, &#34;ChatGPT测试群2&#34;]&#39; IMAGE_CREATE_PREFIX: &#39;[&#34;画&#34;, &#34;看&#34;, &#34;找&#34;]&#39; CONVERSATION_MAX_TOKENS: 1000 SPEECH_RECOGNITION: &#39;False&#39; CHARACTER_DESC: &#39;你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。&#39; SUBSCRIBE_MSG: &#39;感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输入。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持tool、角色扮演和文字冒险等丰富的插件。\n输入{trigger_prefix}#help 查看详细指令。&#39; EXPIRES_IN_SECONDS: 3600 USE_GLOBAL_PLUGIN_CONFIG: &#39;True&#39; USE_LINKAI: &#39;False&#39; LINKAI_API_KEY: &#39;&#39; LINKAI_APP_CODE: &#39;&#39; 4.接入微信和企业微信https://doc.tryfastgpt.ai/docs/use-cases/external-integration/wechat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/wechat/FastGPT 三分钟接入微信/企业微信 link私人微信和企业微信接入的方式基本一样,不同的地方会刻意指出。 +查看视频教程 +创建APIKey link首先找到我们需要接入的应用,然后点击「外部使用」-&gt;「API访问」创建一个APIKey并保存。 +配置微秘书 link打开微秘书 注册登录后找到菜单栏「基础配置」-&gt;「智能配置」,按照下图配置。 +继续往下看到 apikey 和服务器根地址,这里apikey填写我们在 FastGPT 应用外部访问中创建的 APIkey,服务器根地址填写官方地址或者私有化部署的地址,这里用官方地址示例,注意要添加/v1后缀,填写完毕后保存。 +sealos部署服务 link访问sealos 登录进来之后打开「应用管理」-&gt; 「新建应用」。 +应用名:称随便填写 镜像名:私人微信填写 aibotk/wechat-assistant 企业微信填写 aibotk/worker-assistant cpu和内存建议 1c1g 往下翻页找到「高级配置」-&gt; 「编辑环境变量」 +这里需要填写三个环境变量: +AIBOTK_KEY=微秘书 APIKEY AIBOTK_SECRET=微秘书 APISECRET WORK_PRO_TOKEN=你申请的企微 token (企业微信需要填写,私人微信不需要) 这里最后的企业微信 Token 在微秘书的-&gt;会员开通栏目中自行购买。 +这里环境变量我们介绍下如何填写: +AIBOTK_KEY 和 AIBOTK_SECRET 我们需要回到微秘书找到「个人中心」,这里的 APIKEY 对应 AIBOTK_KEY ,APISECRET 对应 AIBOTK_SECRET。 +WORK_PRO_TOKEN 微秘书的会员中心中自行购买即可。 +填写完毕后点右上角「部署」,等待应用状态变为运行中。 +返回微秘书 找到「首页」,扫码登录需要接入的微信号。 +测试 link只需要发送信息,或者拉入群聊@登录的微信就会回复信息啦。iframe 接入https://doc.tryfastgpt.ai/docs/use-cases/external-integration/iframe_integration/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/external-integration/iframe_integration/如何提交应用模板https://doc.tryfastgpt.ai/docs/use-cases/app-cases/submit_application_template/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/submit_application_template/什么模板可以合并 link目前合并进仓库的应用模板,会在「模板市场」中全部展示给用户。 +为了控制模板的质量以及避免数量过多带来的繁琐,并不是所有的模板都会被合并到开源仓库中,你可以提前 PR 与我们沟通模板的内容。 +预估最后总体的数量不会很多,控制在 50 个左右,一半来自 FastGPT Team,一半来自社区用户。 +如何写一个应用模板 link 跑通 FastGPT dev 环境 link 需要在 dev 环境下执行下面的操作。 +可参照 FastGPT|快速开始本地开发 +在 FastGPT 工作台中,创建一个应用 link 创建空白工作流即可。 +创建应用模板 link 应用模板配置以及相关资源,都会在 packages/templates/src 目录下。 +在packages/templates/src 目录下,创建一个文件夹,名称为模板对应的 id。 在刚刚创建的文件夹中,再创建一个 template.json 文件,复制粘贴并填写如下配置: { &#34;name&#34;: &#34;模板名&#34;, &#34;intro&#34;: &#34;模板描述,会展示在模板市场的展示页&#34;, &#34;author&#34;: &#34;填写你的名字&#34;, &#34;avatar&#34;: &#34;模板头像,可以将图片文件放在同一个文件夹中,然后填写相应路径&#34;, &#34;tags&#34;: [&#34;模板标签&#34;], // writing(文本创作),image-generation(图片生成),web-search(联网搜索), // roleplay(角色扮演), office-services(办公服务) 暂时分为 5 类,从中选择相应的标签 &#34;type&#34;: &#34;模板类别&#34;, // simple(简易应用), advanced(工作流), plugin(插件) &#34;workflow&#34;: { // 这个对象先不管,待会直接粘贴导出的工作流即可 &#34;nodes&#34;: [], &#34;edges&#34;: [], &#34;chatConfig&#34;: {} } } 完成应用编排并测试 link 完成应用编排后,可以点击右上角的发布。长字幕翻译https://doc.tryfastgpt.ai/docs/use-cases/app-cases/translate-subtitle-using-gpt/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/translate-subtitle-using-gpt/直接使用 LLM 来翻译长字幕会遇到很多难点,这些难点也正是直接使用 AI 无法有效处理的问题: +Tokens 限制:这是最明显的障碍。大语言模型 (LLM) 通常有输出 tokens 的限制,这意味着对于长文本,如果不使用特殊的工作流,可能需要手动将文本分段,逐段输入 AI 进行翻译,然后再手动拼接结果。这个过程不仅繁琐,还容易出错。 +字幕格式的保持:对于字幕来说,时间轴信息至关重要。然而,AI 模型有时会产生 “幻觉”,即无中生有地修改或生成不存在的信息。在字幕翻译中,这可能导致 AI 错误地修改时间轴,使字幕与音频不同步。 +翻译质量:简单的机器翻译往往无法满足观众的需求。即使是大语言模型,单轮翻译的质量也常常不尽如人意。对于字幕来说,翻译质量直接影响观看体验,糟糕的翻译会严重影响观众的沉浸感。 +本案例将展示如何利用 FastGPT 工作流代码结合 LLM 来有效解决这些问题。我们的方法不仅能克服技术限制,还能显著提升翻译质量。 +提取字幕信息 link工作流的一大优势在于可以结合额外的操作,使 AI 能更精准地处理信息。在字幕翻译中,我们可以先分离 SRT 字幕文件的各个组成部分,然后只让 LLM 翻译文本部分。这种方法既节约了 token 使用,又确保了时间轴信息不被误改。 +具体实现如下: +使用代码执行模块,对输入的原始字幕文本进行解析。 将字幕信息分类为三部分:时间信息、序号信息和文本信息。 只保留文本信息用于后续的 AI 翻译。 这种预处理步骤大大提高了整个翻译过程的效率和准确性。 +切分文本 link为了进一步优化翻译过程,我们需要将提取出的文本信息重新组织。这一步的目的是将文本分割成适合 LLM 处理的大小,同时保持上下文的连贯性。 +在本例中,我们采用以下策略: +将文本按照每 40 句为一组进行切分。这个数字是经过多次测试后得出的平衡点,既能保证翻译质量,又不会超出 LLM 的处理能力。 使用 标签分割每句文本。这种标记方法便于后续的重新组装,同时也为 AI 模型提供了清晰的句子边界。 这种切分方法既考虑了 AI 模型的能力限制,又保证了翻译的连贯性。通过保持适当的上下文,我们可以得到更加准确和自然的翻译结果。 +格式化原文本 link在这一步,我们构建了最终输入给 LLM 的原文本。这个步骤的关键在于如何在控制 tokens 数量的同时,为 AI 提供足够的上下文信息。我们采用了以下策略: +传入所有文本作为背景上下文。这确保 AI 能理解整段对话的语境。 使用&lt;TRANSLATE_THIS&gt;标签明确指出当前需要翻译的片段。这种方法既能控制 AI 的输出范围,又不会丢失整体语境。 这种格式化方法使得 AI 能在理解全局的基础上,专注于翻译特定部分,从而提高翻译的准确性和连贯性。多轮翻译机器人https://doc.tryfastgpt.ai/docs/use-cases/app-cases/multi_turn_translation_bot/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/multi_turn_translation_bot/吴恩达老师提出了一种反思翻译的大语言模型(LLM)翻译工作流程——GitHub - andrewyng/translation-agent,具体工作流程如下: +提示一个 LLM 将文本从 source_language 翻译到 target_language; 让 LLM 反思翻译结果并提出建设性的改进建议; 使用这些建议来改进翻译。 这个翻译流程应该是目前比较新的一种翻译方式,利用 LLM 对自己的翻译结果进行改进来获得较好的翻译效果 +项目中展示了可以利用对长文本进行分片,然后分别进行反思翻译处理,以突破 LLM 对 tokens 数量的限制,真正实现长文本一键高效率高质量翻译。 +项目还通过给大模型限定国家地区,已实现更精确的翻译,如美式英语、英式英语之分;同时提出一些可能能带来更好效果的优化,如对于一些 LLM 未曾训练到的术语(或有多种翻译方式的术语)建立术语表,进一步提升翻译的精确度等等 +而这一切都能通过 Fastgpt 工作流轻松实现,本文将手把手教你如何复刻吴恩达老师的 translation-agent +单文本块反思翻译 link先从简单的开始,即不超出 LLM tokens 数量限制的单文本块翻译 +初始翻译 link第一步先让 LLM 对源文本块进行初始翻译(翻译的提示词在源项目中都有) +通过文本拼接模块引用 源语言、目标语言、源文本这三个参数,生成提示词,传给 LLM,让它给出第一版的翻译 +反思 link然后让 LLM 对第一步生成的初始翻译给出修改建议,称之为 反思 +这时的提示词接收 5 个参数,源文本、初始翻译、源语言、目标语言 以及限定词地区国家,这样 LLM 会对前面生成的翻译提出相当多的修改建议,为后续的提升翻译作准备 +提升翻译 link 在前文生成了初始翻译以及相应的反思后,将这二者输入给第三次 LLM 翻译,这样我们就能获得一个比较高质量的翻译结果 +完整的工作流如下 +运行效果 link由于考虑之后对这个反思翻译的复用,所以创建了一个插件,那么在下面我直接调用这个插件就能使用反思翻译,效果如下 +随机挑选了一段哈利波特的文段 +可以看到反思翻译后的效果还是好上不少的,其中反思的输出如下 +长文反思翻译 link在掌握了对短文本块的反思翻译后,我们能轻松的通过分片和循环,实现对长文本也即多文本块的反思翻译 +整体的逻辑是,首先对传入文本的 tokens数量做判断,如果不超过设置的 tokens 限制,那么直接调用单文本块反思翻译,如果超过设置的 tokens限制,那么切割为合理的大小,再分别进行对应的反思翻译处理 +计算 tokens link 首先,我使用了 Laf函数 模块来实现对输入文本的 tokens 的计算英语作文纠错机器人https://doc.tryfastgpt.ai/docs/use-cases/app-cases/english_essay_correction_bot/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/english_essay_correction_bot/FastGPT 提供了一种基于 LLM Model 搭建应用的简便方式。 +本文通过搭建一个英语作文纠错机器人,介绍一下如何使用 工作流 +搭建过程 link1. 创建工作流 link 可以从 多轮翻译机器人 开始创建。 +多轮翻译机器人是 @米开朗基杨 同学创建的,同样也是一个值得学习的工作流。 +2. 获取输入,使用大模型进行分析 link我们期望让大模型处理文字,返回一个结构化的数据,由我们自己处理。 +提示词 是最重要的一个参数,这里提供的提示词仅供参考: +## 角色 资深英语写作专家 ## 任务 对输入的原文进行分析。 找出其中的各种错误, 包括但不限于单词拼写错误、 语法错误等。 注意: 忽略标点符号前后空格的问题。 注意: 对于存在错误的句子, 提出修改建议是指指出这个句子中的具体部分, 然后提出将这一个部分修改替换为什么。 ## 输出格式 不要使用 Markdown 语法, 输入 JSON 格式的内容。 输出的&#34;reason&#34;的内容使用中文。 直接输出一个列表, 其成员为一个相同类型的对象, 定义如下 您正在找回 FastGPT 账号 ``` { “raw”: string; // 表示原文 “reason”: string; // 表示原因 “suggestion”: string; // 修改建议 } ``` 可以在模型选择的窗口中设置禁用 AI 回复。固定开头和结尾内容https://doc.tryfastgpt.ai/docs/use-cases/app-cases/fixingevidence/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/fixingevidence/如上图,可以通过指定回复编排一个固定的开头和结尾内容。 +模块编排 link复制下面配置,点击「高级编排」右上角的导入按键,导入该配置。 +编排配置 { &#34;nodes&#34;: [ { &#34;nodeId&#34;: &#34;7z5g5h&#34;, &#34;name&#34;: &#34;流程开始&#34;, &#34;intro&#34;: &#34;&#34;, &#34;avatar&#34;: &#34;/imgs/workflow/userChatInput.svg&#34;, &#34;flowNodeType&#34;: &#34;workflowStart&#34;, &#34;position&#34;: { &#34;x&#34;: -269.50851681351924, &#34;y&#34;: 1657.6123698022448 }, &#34;inputs&#34;: [ { &#34;key&#34;: &#34;userChatInput&#34;, &#34;renderTypeList&#34;: [ &#34;reference&#34;, &#34;textarea&#34; ], &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;问题输入&#34;, &#34;required&#34;: true, &#34;toolDescription&#34;: &#34;用户问题&#34;, &#34;type&#34;: &#34;systemInput&#34;, &#34;showTargetInApp&#34;: false, &#34;showTargetInPlugin&#34;: false, &#34;connected&#34;: false, &#34;selectedTypeIndex&#34;: 0, &#34;value&#34;: [ &#34;7z5g5h&#34;, &#34;userChatInput&#34; ] } ], &#34;outputs&#34;: [ { &#34;id&#34;: &#34;userChatInput&#34;, &#34;type&#34;: &#34;static&#34;, &#34;key&#34;: &#34;userChatInput&#34;, &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;core.实验室预约https://doc.tryfastgpt.ai/docs/use-cases/app-cases/lab_appointment/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/lab_appointment/本示例演示了利用工具调用,自动选择调用知识库搜索实验室相关内容,或调用 HTTP 模块实现数据库的 CRUD 操作。 +以一个实验室预约为例,用户可以通过对话系统预约、取消、修改预约和查询预约记录。 +1. 全局变量使用 link通过设计一个全局变量,让用户输入姓名,模拟用户身份信息。实际使用过程中,通常是直接通过嵌入 Token 来标记用户身份。 +2. 工具调用 link 背景知识中,引导模型调用工具去执行不通的操作。 +🤗 +Tips: 这里需要增加适当的上下文,方便模型结合历史纪录进行判断和决策~ +3. HTTP 模块 link HTTP模块中,需要设置 3 个工具参数: +预约行为:可取 get, put, post, delete 四个值,分别对应查询、修改、新增、删除操作。当然,你也可以写4个HTTP模块,来分别处理。 labname: 实验室名。非必填,因为查询和删除时候,不需要。 time: 预约时间。 总结 link 工具调用模块是非常强大的功能,可以在一定程度上替代问题分类和内容提取。 通过工具模块,动态的调用不同的工具,可以将复杂业务解耦。 附件 link编排配置 link可直接复制,导入到 FastGPT 中。 +编排配置 { &#34;nodes&#34;: [ { &#34;nodeId&#34;: &#34;userChatInput&#34;, &#34;name&#34;: &#34;流程开始&#34;, &#34;intro&#34;: &#34;当用户发送一个内容后,流程将会从这个模块开始执行。&#34;, &#34;avatar&#34;: &#34;/imgs/workflow/userChatInput.svg&#34;, &#34;flowNodeType&#34;: &#34;workflowStart&#34;, &#34;position&#34;: { &#34;x&#34;: 309.7143912167367, &#34;y&#34;: 1501.2761754220846 }, &#34;inputs&#34;: [ { &#34;key&#34;: &#34;userChatInput&#34;, &#34;renderTypeList&#34;: [ &#34;reference&#34;, &#34;textarea&#34; ], &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;问题输入&#34;, &#34;required&#34;: true, &#34;toolDescription&#34;: &#34;用户问题&#34;, &#34;type&#34;: &#34;systemInput&#34;, &#34;showTargetInApp&#34;: false, &#34;showTargetInPlugin&#34;: false, &#34;connected&#34;: false, &#34;selectedTypeIndex&#34;: 0, &#34;value&#34;: [ &#34;userChatInput&#34;, &#34;userChatInput&#34; ] } ], &#34;outputs&#34;: [ { &#34;id&#34;: &#34;userChatInput&#34;, &#34;type&#34;: &#34;static&#34;, &#34;key&#34;: &#34;userChatInput&#34;, &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;core.Dalle3 绘图https://doc.tryfastgpt.ai/docs/use-cases/app-cases/dalle3/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/dalle3/OpenAI Dalle3 接口 link先来看下官方接口的参数和响应值: +Body +{ &#34;model&#34;: &#34;dall-e-3&#34;, &#34;prompt&#34;: &#34;A cute baby sea otter&#34;, &#34;n&#34;: 1, &#34;size&#34;: &#34;1024x1024&#34; } Response +{ &#34;created&#34;: 1589478378, &#34;data&#34;: [ { &#34;url&#34;: &#34;https://...&#34; }, { &#34;url&#34;: &#34;https://...&#34; } ] } 编排思路 link 通过 AI 来优化图片绘制的提示词(这步省略了,自己找提示词即可) 通过 【HTTP 请求】模块 调用 Dalle3 接口,获取图片的 URL。 通过 【文本加工】模块 来构建 Markdown 的图片格式。 通过 【指定回复】模块 来直接输出图片链接。 1. 构建 HTTP 模块 link请求参数直接复制 Dalle3 接口的即可,并求改 prompt 为变量。需要增加一个 Headers.Authorization 。 +Body: +{ &#34;model&#34;: &#34;dall-e-3&#34;, &#34;prompt&#34;: &#34;{{prompt}}&#34;, &#34;n&#34;: 1, &#34;size&#34;: &#34;1024x1024&#34; } Headers:接入谷歌搜索https://doc.tryfastgpt.ai/docs/use-cases/app-cases/google_search/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/google_search/工具调用模式 工具调用模式 非工具调用模式 非工具调用模式 如上图,利用「HTTP请求」模块,你可以外接一个搜索引擎作为 AI 回复的参考资料。这里以调用 Google Search API 为例。注意:本文主要是为了介绍 「HTTP请求」模块,具体的搜索效果需要依赖提示词和搜索引擎,尤其是【搜索引擎】,简单的搜索引擎无法获取更详细的内容,这部分可能需要更多的调试。 +注册 Google Search API link参考这篇文章,每天可以免费使用 100 次。 +写一个 Google Search 接口 link这里用 Laf 快速实现一个接口,即写即发布,无需部署。务必打开 POST 请求方式。 +Laf 谷歌搜索Demo import cloud from &#39;@lafjs/cloud&#39; const googleSearchKey = &#34;xxx&#34; const googleCxId = &#34;3740cxxx&#34; const baseurl = &#34;https://www.googleapis.com/customsearch/v1&#34; type RequestType = { searchKey: string } export default async function (ctx: FunctionContext) { const { searchKey } = ctx.body as RequestType console.log(ctx.body) if (!发送飞书webhook通知https://doc.tryfastgpt.ai/docs/use-cases/app-cases/feishu_webhook/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/use-cases/app-cases/feishu_webhook/该文章展示如何发送一个简单的飞书webhook通知,以此类推,发送其他类型的通知也可以这么操作。 +1. 准备飞书机器人 link 2. 导入编排代码 link复制下面配置,点击「高级编排」右上角的导入按键,导入该配置,导入后将飞书提供的接口地址复制到「HTTP 模块」。 +编排配置 { &#34;nodes&#34;: [ { &#34;nodeId&#34;: &#34;userGuide&#34;, &#34;name&#34;: &#34;系统配置&#34;, &#34;intro&#34;: &#34;可以配置应用的系统参数&#34;, &#34;avatar&#34;: &#34;/imgs/workflow/userGuide.png&#34;, &#34;flowNodeType&#34;: &#34;userGuide&#34;, &#34;position&#34;: { &#34;x&#34;: 303.41163758039283, &#34;y&#34;: -552.297639861266 }, &#34;version&#34;: &#34;481&#34;, &#34;inputs&#34;: [], &#34;outputs&#34;: [] }, { &#34;nodeId&#34;: &#34;workflowStartNodeId&#34;, &#34;name&#34;: &#34;流程开始&#34;, &#34;intro&#34;: &#34;&#34;, &#34;avatar&#34;: &#34;/imgs/workflow/userChatInput.svg&#34;, &#34;flowNodeType&#34;: &#34;workflowStart&#34;, &#34;position&#34;: { &#34;x&#34;: 529.3935295017156, &#34;y&#34;: 197.114018410347 }, &#34;version&#34;: &#34;481&#34;, &#34;inputs&#34;: [ { &#34;key&#34;: &#34;userChatInput&#34;, &#34;renderTypeList&#34;: [ &#34;reference&#34;, &#34;textarea&#34; ], &#34;valueType&#34;: &#34;string&#34;, &#34;label&#34;: &#34;用户问题&#34;, &#34;required&#34;: true, &#34;toolDescription&#34;: &#34;用户问题&#34; } ], &#34;outputs&#34;: [ { &#34;id&#34;: &#34;userChatInput&#34;, &#34;key&#34;: &#34;userChatInput&#34;, &#34;label&#34;: &#34;core.快速开始本地开发https://doc.tryfastgpt.ai/docs/development/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/intro/本文档介绍了如何设置开发环境以构建和测试 FastGPT,。 +前置依赖项 link您需要在计算机上安装和配置以下依赖项才能构建 FastGPT: +Git Docker(构建镜像) Node.js v18.17 / v20.x(版本尽量一样,可以使用nvm管理node版本) pnpm 版本 8.6.0 (目前官方的开发环境) make命令: 根据不同平台,百度安装 (官方是GNU Make 4.3) 开始本地开发 link check_circle 用户默认的时区为 Asia/Shanghai,非 linux 环境时候,获取系统时间会异常,本地开发时候,可以将用户的时区调整成 UTC(+0)。 建议先服务器装好数据库,再进行本地开发。 1. Fork 存储库 link您需要 Fork 存储库。 +2. 克隆存储库 link克隆您在 GitHub 上 Fork 的存储库: +git clone git@github.com:&lt;github_username&gt;/FastGPT.git 目录简要说明 +projects 目录下为 FastGPT 应用代码。其中 app 为 FastGPT 核心应用。(后续可能会引入其他应用) NextJS 框架前后端放在一起,API 服务位于 src/pages/api 目录内。 packages 目录为共用代码,通过 workspace 被注入到 projects 中,已配置 monorepo 自动注入,无需额外打包。 3. 安装数据库 link第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践,或者新建文件夹并配置相关文件用以运行docker。数据库部署教程:Docker 快速部署。部署完了,可以本地访问其数据库。Sealos 一键部署https://doc.tryfastgpt.ai/docs/development/sealos/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/sealos/部署架构图 link 多模型支持 linkFastGPT 使用了 one-api 项目来管理模型池,其可以兼容 OpenAI 、Azure 、国内主流模型和本地模型等。 +可参考:Sealos 快速部署 OneAPI +一键部署 link使用 Sealos 服务,无需采购服务器、无需域名,支持高并发 &amp; 动态伸缩,并且数据库应用采用 kubeblocks 的数据库,在 IO 性能方面,远超于简单的 Docker 容器部署。可以根据需求,再下面两个区域选择部署。 +新加坡区 link新加披区的服务器在国外,可以直接访问 OpenAI,但国内用户需要梯子才可以正常访问新加坡区。国际区价格稍贵,点击下面按键即可部署👇 +北京区 link北京区服务提供商为火山云,国内用户可以稳定访问,但无法访问 OpenAI 等境外服务,价格约为新加坡区的 1/4。点击下面按键即可部署👇 +开始部署 link由于需要部署数据库,部署完后需要等待 2~4 分钟才能正常访问。默认用了最低配置,首次访问时会有些慢。 +根据提示,输入root_password,和 openai/oneapi 的地址和密钥。 +点击部署后,会跳转到应用管理页面。可以点击fastgpt主应用右侧的详情按键(名字为 fastgpt-xxxx), 如下图所示。 +点击详情后,会跳转到 fastgpt 的部署管理页面,点击外网访问地址中的链接,即可打开 fastgpt 服务。 +如需绑定自定义域名、修改部署参数,可以点击右上角变更,根据 sealos 的指引完成。 +登录 link用户名:root +密码是刚刚一键部署时设置的root_password +修改配置文件和环境变量 link在 Sealos 中,你可以打开应用管理(App Launchpad)看到部署的 FastGPT,可以打开数据库(Database)看到对应的数据库。 +在应用管理中,选中 FastGPT,点击变更,可以看到对应的环境变量和配置文件。 +🤖 +在 Sealos 上,FastGPT 一共运行了 1 个服务和 2 个数据库,如暂停和删除请注意数据库一同操作。(你可以白天启动,晚上暂停它们,省钱大法)Docker Compose 快速部署https://doc.tryfastgpt.ai/docs/development/docker/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/docker/部署架构图 link 🤖 +MongoDB:用于存储除了向量外的各类数据 +PostgreSQL/Milvus:存储向量数据 +OneAPI: 聚合各类 AI API,支持多模型调用 (任何模型问题,先自行通过 OneAPI 测试校验) +推荐配置 linkPgVector版本 link体验测试首选 +环境 最低配置(单节点) 推荐配置 测试 2c2g 2c4g 100w 组向量 4c8g 50GB 4c16g 50GB 500w 组向量 8c32g 200GB 16c64g 200GB Milvus版本 link生产部署首选,对于千万级以上向量性能更优秀。 +点击查看 Milvus 官方推荐配置 +环境 最低配置(单节点) 推荐配置 测试 2c8g 4c16g 100w 组向量 未测试 500w 组向量 zilliz cloud版本 linkMilvus 的全托管服务,性能优于 Milvus 并提供 SLA,点击使用 Zilliz Cloud。 +由于向量库使用了 Cloud,无需占用本地资源,无需太关注。 +前置工作 link1. 确保网络环境 link如果使用OpenAI等国外模型接口,请确保可以正常访问,否则会报错:Connection error 等。 方案可以参考:代理方案 +2. 准备 Docker 环境 link Linux MacOS Windows # 安装 Docker curl -fsSL https://get.配置文件介绍https://doc.tryfastgpt.ai/docs/development/configuration/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/configuration/由于环境变量不利于配置复杂的内容,新版 FastGPT 采用了 ConfigMap 的形式挂载配置文件,你可以在 projects/app/data/config.json 看到默认的配置文件。可以参考 docker-compose 快速部署 来挂载配置文件。 +开发环境下,你需要将示例配置文件 config.json 复制成 config.local.json 文件才会生效。 +这个配置文件中包含了系统参数和各个模型配置: +4.6.8+ 版本新配置文件示例 link { &#34;feConfigs&#34;: { &#34;lafEnv&#34;: &#34;https://laf.dev&#34; // laf环境。 https://laf.run (杭州阿里云) ,或者私有化的laf环境。如果使用 Laf openapi 功能,需要最新版的 laf 。 }, &#34;systemEnv&#34;: { &#34;vectorMaxProcess&#34;: 15, // 向量处理线程数量 &#34;qaMaxProcess&#34;: 15, // 问答拆分线程数量 &#34;tokenWorkers&#34;: 50, // Token 计算线程保持数,会持续占用内存,不能设置太大。 &#34;pgHNSWEfSearch&#34;: 100 // 向量搜索参数。越大,搜索越精确,但是速度越慢。设置为100,有99%&#43;精度。 }, &#34;llmModels&#34;: [ { &#34;provider&#34;: &#34;OpenAI&#34;, // 模型提供商,主要用于分类展示,目前已经内置提供商包括:https://github.com/labring/FastGPT/blob/main/packages/global/core/ai/provider.ts, 可 pr 提供新的提供商,或直接填写 Other &#34;model&#34;: &#34;gpt-4o-mini&#34;, // 模型名(对应OneAPI中渠道的模型名) &#34;name&#34;: &#34;gpt-4o-mini&#34;, // 模型别名 &#34;maxContext&#34;: 125000, // 最大上下文 &#34;maxResponse&#34;: 16000, // 最大回复 &#34;quoteMaxToken&#34;: 120000, // 最大引用内容 &#34;maxTemperature&#34;: 1.私有部署常见问题https://doc.tryfastgpt.ai/docs/development/faq/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/faq/一、错误排查方式 link遇到问题先按下面方式排查。 +docker ps -a 查看所有容器运行状态,检查是否全部 running,如有异常,尝试docker logs 容器名查看对应日志。 容器都运行正常的,docker logs 容器名 查看报错日志 带有requestId的,都是 OneAPI 提示错误,大部分都是因为模型接口报错。 无法解决时,可以找找Issue,或新提 Issue,私有部署错误,务必提供详细的日志,否则很难排查。 二、通用问题 link本地部署的限制 link具体内容参考https://fael3z0zfze.feishu.cn/wiki/OFpAw8XzAi36Guk8dfucrCKUnjg。 +能否纯本地运行 link可以。需要准备好向量模型和LLM模型。 +其他模型没法进行问题分类/内容提取 link 看日志。如果提示 JSON invalid,not support tool 之类的,说明该模型不支持工具调用或函数调用,需要设置toolChoice=false和functionCall=false,就会默认走提示词模式。目前内置提示词仅针对了商业模型API进行测试。问题分类基本可用,内容提取不太行。 如果已经配置正常,并且没有错误日志,则说明可能提示词不太适合该模型,可以通过修改customCQPrompt来自定义提示词。 页面崩溃 link 关闭翻译 检查配置文件是否正常加载,如果没有正常加载会导致缺失系统信息,在某些操作下会导致空指针。 95%情况是配置文件不对。会提示 xxx undefined 提示URI malformed,请 Issue 反馈具体操作和页面,这是由于特殊字符串编码解析报错。 某些api不兼容问题(较少) 开启内容补全后,响应速度变慢 link 问题补全需要经过一轮AI生成。 会进行3~5轮的查询,如果数据库性能不足,会有明显影响。 对话接口报错或返回为空(core.chat.Chat API is error or undefined) link 检查 AI 的 key 问题:通过 curl 请求看是否正常。务必用 stream=true 模式。并且 maxToken 等相关参数尽量一致。 如果是国内模型,可能是命中风控了。 查看模型请求日志,检查出入参数是否异常。 # curl 例子。 curl --location --request POST &#39;https://xxx.通过 OneAPI 接入模型https://doc.tryfastgpt.ai/docs/development/modelconfig/one-api/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/modelconfig/one-api/FastGPT 目前采用模型分离的部署方案,FastGPT 中只兼容 OpenAI 的模型规范(OpenAI 不存在的模型采用一个较为通用的规范),并通过 One API 来实现对不同模型接口的统一。 +One API 是一个 OpenAI 接口管理 &amp; 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。 +FastGPT 与 One API 关系 link可以把 One API 当做一个网关,FastGPT 与 One API 关系: +部署 linkDocker 版本 linkdocker-compose.yml 文件已加入了 OneAPI 配置,可直接使用。默认暴露在 3001 端口。 +Sealos 版本 link 北京区: 点击部署 OneAPI 新加坡区(可用 GPT) 点击部署 OneAPI 部署完后,可以打开 OneAPI 访问链接,进行下一步操作。 +OneAPI 基础教程 link概念 link 渠道: OneApi 中一个渠道对应一个 Api Key,这个 Api Key 可以是GPT、微软、ChatGLM、文心一言的。一个Api Key通常可以调用同一个厂商的多个模型。 One API 会根据请求传入的模型来决定使用哪一个渠道,如果一个模型对应了多个渠道,则会随机调用。 令牌:访问 One API 所需的凭证,只需要这1个凭证即可访问One API上配置的模型。因此FastGPT中,只需要配置One API的baseurl和令牌即可。令牌不要设置任何的模型范围权限,否则容易报错。 大致工作流程 link 客户端请求 One API 根据请求中的 model 参数,匹配对应的渠道(根据渠道里的模型进行匹配,必须完全一致)。如果匹配到多个渠道,则随机选择一个(同优先级)。 One API 向真正的地址发出请求。 One API 将结果返回给客户端。 1.通过 SiliconCloud 体验开源模型https://doc.tryfastgpt.ai/docs/development/modelconfig/siliconcloud/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/modelconfig/siliconcloud/SiliconCloud(硅基流动) 是一个以提供开源模型调用为主的平台,并拥有自己的加速引擎。帮助用户低成本、快速的进行开源模型的测试和使用。实际体验下来,他们家模型的速度和稳定性都非常不错,并且种类丰富,覆盖语言、向量、重排、TTS、STT、绘图、视频生成模型,可以满足 FastGPT 中所有模型需求。 +如果你想部分模型使用 SiliconCloud 的模型,可额外参考OneAPI接入硅基流动。 +本文会介绍完全使用 SiliconCloud 模型来部署 FastGPT 的方案。 +1. 注册 SiliconCloud 账号 link 点击注册硅基流动账号 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak 2. 修改 FastGPT 环境变量 link OPENAI_BASE_URL=https://api.siliconflow.cn/v1 # 填写 SiliconCloud 控制台提供的 Api Key CHAT_API_KEY=sk-xxxxxx 3. 修改 FastGPT 配置文件 link我们选取 SiliconCloud 中的模型作为 FastGPT 配置。这里配置了 Qwen2.5 72b 的纯语言和视觉模型;选择 bge-m3 作为向量模型;选择 bge-reranker-v2-m3 作为重排模型。选择 fish-speech-1.5 作为语音模型;选择 SenseVoiceSmall 作为语音输入模型。 +注意:ReRank 模型仍需配置一次 Api Key +{ &#34;llmModels&#34;: [ { &#34;provider&#34;: &#34;Other&#34;, // 模型提供商,主要用于分类展示,目前已经内置提供商包括:https://github.com/labring/FastGPT/blob/main/packages/global/core/ai/provider.ts, 可 pr 提供新的提供商,或直接填写 Other &#34;model&#34;: &#34;Qwen/Qwen2.升级说明https://doc.tryfastgpt.ai/docs/development/upgrading/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/intro/FastGPT 升级包括两个步骤: +镜像升级 执行升级初始化脚本 镜像名 linkgit版 +FastGPT 主镜像:ghcr.io/labring/fastgpt:latest 商业版镜像:ghcr.io/c121914yu/fastgpt-pro:latest Admin 镜像:ghcr.io/c121914yu/fastgpt-admin:latest 阿里云 +FastGPT 主镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt 商业版镜像:ghcr:registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-pro Admin 镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-admin 镜像由镜像名和Tag组成,例如: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.6.1 代表4.6.3版本镜像,具体可以看 docker hub, github 仓库。 +Sealos 修改镜像 link 打开 Sealos Cloud, 找到桌面上的应用管理 选择对应的应用 - 点击右边三个点 - 变更 修改镜像 - 确认变更 +如果要修改配置文件,可以拉到下面的配置文件进行修改。 +Docker-Compose 修改镜像 link直接修改yml文件中的image: 即可。随后执行: +docker-compose pull docker-compose up -d 执行升级初始化脚本 link镜像更新完后,可以查看文档中的版本介绍,通常需要执行升级脚本的版本都会标明包含升级脚本,打开对应的文档,参考说明执行升级脚本即可,大部分时候都是需要发送一个POST请求。 +QA link为什么需要执行升级脚本 link数据表出现大幅度变更,无法通过设置默认值,或复杂度较高时,会通过升级脚本来更新部分数据表字段。 严格按初始化步骤进行操作,不会造成旧数据丢失。但在初始化过程中,如果数据量大,需要初始化的时间较长,这段时间可能会造成服务无法正常使用。 +{{host}} 是什么 link{{}} 代表变量, {{host}}代表一个名为 host 的变量。指的是你服务器的域名或 IP。 +Sealos 中,你可以在下图中找到你的域名: +如何获取 rootkey link从docker-compose.yml中的environment中获取,对应的是ROOT_KEY的值。Docker Mongo迁移(dump模式)https://doc.tryfastgpt.ai/docs/development/migration/docker_mongo/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/migration/docker_mongo/作者 linkhttps://github.com/samqin123 +相关PR。有问题可打开这里与作者交流 +介绍 link如何使用Mongodump来完成从A环境到B环境的Fastgpt的mongodb迁移 +前提说明: +A环境:我在阿里云上部署的fastgpt,现在需要迁移到B环境。 B环境:是新环境比如腾讯云新部署的fastgpt,更特殊一点的是,NAS(群晖或者QNAP)部署了fastgpt,mongo必须改成4.2或者4.4版本(其实云端更方便,支持fastgpt mongo默认版本) C环境:妥善考虑,用本地电脑作为C环境过渡,保存相关文件并分离操作 ‍ +1. 环境准备:进入 docker mongo 【A环境】 link docker exec -it mongo sh mongo -u &#39;username&#39; -p &#39;password&#39; &gt;&gt; show dbs 看到fastgpt数据库,以及其它几个,确定下导出数据库名称 准备: 检查数据库,容器和宿主机都创建一下 backup 目录 【A环境 + C环境】 +准备: link检查数据库,容器和宿主机都创建一下“数据导出导入”临时目录 ,比如data/backup 【A环境建目录 + C环境建目录用于同步到容器中】 +先在【A环境】创建文件目录,用于dump导出操作 link容器:(先进入fastgpt docker容器) +docker exec -it fastgpt sh mkdir -p /data/backup 建好后,未来导出mongo的数据,会在A环境本地fastgpt的安装目录/Data/下看到自动同步好的目录,数据会在data\backup中,然后可以衔接后续的压缩和下载转移动作。如果没有同步到本地,也可以手动建一下,配合docker cp 把文件拷到本地用(基本不会发生) +然后,【C环境】宿主机目录类似操作,用于把上传的文件自动同步到C环境部署的fastgpt容器里。 link到fastgpt目录,进入mongo目录,有data目录,下面建backup +mkdir -p /fastgpt/data/backup 准备好后,后续上传 +### 新fastgpt环境【B】中也需要建一个,比如/fastgpt/mongobackup目录,注意不要在fastgpt/data目录下建立目录 mkdir -p /fastgpt/mongobackup +###2. 正题开始,从fastgpt老环境【A】中导出数据 进入A环境,使用mongodump 导出mongo数据库。 #### 2.Docker 数据库迁移(无脑操作)https://doc.tryfastgpt.ai/docs/development/migration/docker_db/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/migration/docker_db/Copy文件 linkDocker 部署数据库都会通过 volume 挂载本地的目录进入容器,如果要迁移,直接复制这些目录即可。 +PG 数据: pg/data Mongo 数据: mongo/dataV4.8.18(进行中)https://doc.tryfastgpt.ai/docs/development/upgrading/4818/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4818/更新指南 link2. 运行升级脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv4818&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会迁移全文检索表,时间较长,迁移期间全文检索会失效,日志中会打印已经迁移的数据长度。 +完整更新内容 link 新增 - 支持部门架构权限模式。 新增 - 支持配置自定跨域安全策略,默认全开。 优化 - 分享链接随机生成用户头像。 优化 - 图片上传安全校验。并增加头像图片唯一存储,确保不会累计存储。 优化 - Mongo 全文索引表分离。 优化 - 知识库检索查询语句合并,同时减少查库数量。 优化 - 文件编码检测,减少 CSV 文件乱码概率。 优化 - 异步读取文件内容,减少进程阻塞。 优化 - 文件阅读,HTML 直接下载,不允许在线阅读。 修复 - HTML 文件上传,base64 图片无法自动转图片链接。 修复 - 插件计费错误。V4.8.17(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/4817/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4817/更新指南 link1. 更新镜像: link 更新 fastgpt 镜像 tag: v4.8.17-fix-title 更新 fastgpt-pro 商业版镜像 tag: v4.8.17 Sandbox 镜像无需更新 2. 运行升级脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv4817&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会将用户绑定的 OpenAI 账号移动到团队中。 +调整 completions 接口返回值 link/api/v1/chat/completions 接口返回值调整,对话节点、工具节点等使用到模型的节点,将不再返回 tokens 字段,改为返回 inputTokens 和 outputTokens 字段,分别表示输入和输出的 Token 数量。 +完整更新内容 link 新增 - 简易模式工具调用支持数组类型插件。 新增 - 工作流增加异常离开自动保存,避免工作流丢失。 新增 - LLM 模型参数支持关闭 max_tokens 和 temperature。 新增 - 商业版支持后台配置模板市场。 新增 - 商业版支持后台配置自定义工作流变量,用于与业务系统鉴权打通。 新增 - 搜索测试接口支持问题优化。 新增 - 工作流中 Input Token 和 Output Token 分开记录展示。并修复部分请求未记录输出 Token 计费问题。 优化 - Markdown 大小测试,超出 20 万字符不使用 Markdown 组件,避免崩溃。 优化 - 知识库搜索参数,滑动条支持输入模式,可以更精准的控制。 优化 - 可用模型展示UI。 优化 - Mongo 查询语句,增加 virtual 字段。 修复 - 文件返回接口缺少 Content-Length 头,导致通过非同源文件上传时,阿里 vision 模型无法识别图片。 修复 - 去除判断器两端字符串隐藏换行符,避免判断器失效。 修复 - 变量更新节点,手动输入更新内容时候,非字符串类型数据类型无法自动转化。 修复 - 豆包模型无法工具调用。V4.8.16(更新配置文件)https://doc.tryfastgpt.ai/docs/development/upgrading/4816/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4816/更新指南 link1. 更新镜像: link 更新 fastgpt 镜像 tag: v4.8.16 更新 fastgpt-pro 商业版镜像 tag: v4.8.16 Sandbox 镜像 tag: v4.8.16 2. 更新配置文件 link参考最新的配置文件,更新 config.json 或 admin 中模型文件配置。给 LLMModel 和 VectorModel 增加 provider 字段,以便进行模型分类。例如: +{ &#34;provider&#34;: &#34;OpenAI&#34;, // 这是新增的 &#34;model&#34;: &#34;gpt-4o&#34;, &#34;name&#34;: &#34;gpt-4o&#34;, &#34;maxContext&#34;: 125000, &#34;maxResponse&#34;: 4000, &#34;quoteMaxToken&#34;: 120000, &#34;maxTemperature&#34;: 1.2, &#34;charsPointsPrice&#34;: 0, &#34;censor&#34;: false, &#34;vision&#34;: true, &#34;datasetProcess&#34;: true, &#34;usedInClassify&#34;: true, &#34;usedInExtractFields&#34;: true, &#34;usedInToolCall&#34;: true, &#34;usedInQueryExtension&#34;: true, &#34;toolChoice&#34;: true, &#34;functionCall&#34;: false, &#34;customCQPrompt&#34;: &#34;&#34;, &#34;customExtractPrompt&#34;: &#34;&#34;, &#34;defaultSystemChatPrompt&#34;: &#34;&#34;, &#34;defaultConfig&#34;: {}, &#34;fieldMap&#34;: {} } 完整更新内容 link 新增 - SearXNG 搜索插件点击查看教程 新增 - 商业版支持 API 知识库和链接集合定时同步。 新增 - 猜你想问支持选择模型和自定义提示词。 新增 - 钉钉和企微机器人 webhook 插件。 新增 - 商业版支持钉钉 SSO 登录配置。点击查看教程 新增 - 商业版支持飞书和语雀知识库导入。点击查看教程 新增 - sandbox 新增 createHmac 加密全局方法。 新增 - 工作流右键支持全部折叠。 优化 - 模型选择器。 优化 - SSR 渲染,预判断是移动端还是 pc 端,减少页面抖动。 优化 - 工作流/简易模式变量初始化代码,去除监听初始化,避免因渲染顺序不一致导致的失败。 优化 - 工作流获取数据类型不一致数据时,增加类型转化,避免 undefined。 修复 - 无法自动切换默认语言。增加分享链接,强制执行一次切换默认语言。 修复 - 数组选择器自动兼容 4.V4.8.15(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/4815/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4815/新功能预览 linkAPI 知识库 link HTML 渲染 link 源码模式 预览模式 全屏模式 升级指南 link 更新 fastgpt 镜像 tag: v4.8.15-fix3 更新 fastgpt-pro 商业版镜像 tag: v4.8.15 Sandbox 镜像,可以不更新 运行升级脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv4815&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会重置应用定时执行的字段,把 null 去掉,减少索引大小。 +从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成fastgpt-pro域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/init/refreshFreeUser&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 重新计算一次免费版用户的时长,之前有版本升级时没有重新计算时间,导致会误发通知。V4.8.14https://doc.tryfastgpt.ai/docs/development/upgrading/4814/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4814/更新指南 link1. 做好数据备份 link2. 修改镜像 link 更新 FastGPT 镜像 tag: v4.8.14-fix 更新 FastGPT 商业版镜像 tag: v4.8.14 (fastgpt-pro镜像) Sandbox 镜像,可以不更新 milvus版本使用:v4.8.14-milvus-fix 镜像。 +新功能预览 link自动触发工作流 link可以允许你配置用户加载对话时,自动触发一次工作流。可以用于一些 CRM 系统,可以快速的引导用户使用,无需等待用户主动触发。 +完整更新内容 link 新增 - 工作流支持进入聊天框/点击开始对话后,自动触发一轮对话。 新增 - 重写 chatContext,对话测试也会有日志,并且刷新后不会丢失对话。 新增 - 分享链接支持配置是否允许查看原文。 新增 - 新的 doc2x 插件。 新增 - 繁体中文。 新增 - 分析链接和 chat api 支持传入自定义 uid。 商业版新增 - 微软 oauth 登录 优化 - 工作流 ui 细节。 优化 - 应用编辑记录采用 diff 存储,避免浏览器溢出。 优化 - 代码入口,增加 register 入口,无需等待首次访问才执行。 优化 - 工作流检查,增加更多缺失值检查。 优化 - 增加知识库训练最大重试次数限制。 优化 - 图片路径问题和示意图任务 优化 - Milvus description 修复 - 分块策略,四级标题会被丢失。 同时新增了五级标题的支持。 修复 - MongoDB 知识库集合唯一索引。 修复 - 反选知识库引用后可能会报错。 修复 - 简易模式转工作流,不是使用最新编辑记录进行转移。 修复 - 表单输入的说明文字不显示。 修复 - API 无法使用 base64 图片。V4.8.13https://doc.tryfastgpt.ai/docs/development/upgrading/4813/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4813/更新指南 link1. 做好数据备份 link2. 修改镜像 link 更新 FastGPT 镜像 tag: v4.8.13-fix 更新 FastGPT 商业版镜像 tag: v4.8.13-fix (fastgpt-pro镜像) Sandbox 镜像,可以不更新 3. 添加环境变量 link 给 fastgpt 和 fastgpt-pro 镜像添加环境变量:FE_DOMAIN=http://xx.com,值为 fastgpt 前端访问地址,注意后面不要加/。可以自动补齐相对文件地址的前缀。 4. 调整文件上传编排 link虽然依然兼容旧版的文件上传编排,但是未来两个版本内将会去除兼容代码,请尽快调整编排,以适应最新的文件上传逻辑。尤其是嵌套应用的文件传递,未来将不会自动传递,必须手动指定传递的文件。具体内容可参考: 文件上传变更 +更新说明 link 新增 - 数组变量选择支持多选,可以选多个数组或对应的单一数据类型,会自动按选择顺序进行合并。 新增 - 文件上传方案调整,AI对话和工具调用节点直接支持接收文件链接,并且会强制加入提示词,无需由模型决策调用。插件自定义变量支持文件上传类型,取代全局文件。 新增 - 对话记录增加时间显示。 新增 - 工作流校验错误时,跳转至错误节点。 新增 - 循环节点增加下标值。 新增 - 部分对话错误提醒增加翻译。 新增 - 对话输入框支持拖拽文件上传,可直接拖文件到输入框中。 新增 - 对话日志,来源可显示分享链接/API具体名称 新增 - 分享链接支持配置是否展示实时运行状态。 优化 - 合并多个 system 提示词成 1 个,避免部分模型不支持多个 system 提示词。 优化 - 知识库上传文件,优化报错提示。 优化 - 全文检索语句,减少一轮子查询。 优化 - 修改 findLast 为 [&hellip;array].V4.8.12(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/4812/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4812/更新指南 link1. 做好数据备份 link2. 修改镜像 link 更新 FastGPT 镜像 tag: v4.8.12-fix 更新 FastGPT 管理端镜像 tag: v4.8.12 (fastgpt-pro镜像) Sandbox 镜像,可以不更新 3. 商业版执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 管理端域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/init/4812&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会初始化应用和知识库的成员组数据。 +4. 重构 Milvus 数据 link由于 js int64 精度丢失问题,之前私有化使用 milvus 或者 zilliz 的用户,如果存在数据精度丢失的问题,需要重构 Milvus 数据。(可以查看 dataset_datas 表中,indexes 中的 dataId 是否末尾精度丢失)。使用 PG 的用户不需要操作。 +从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 主域名。V4.8.11(商业版初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/4811/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4811/更新指南 link1. 做好数据备份 link2. 修改配置文件 link如需增加 openai o1 模型,可添加如下配置: +{ &#34;model&#34;: &#34;o1-mini&#34;, &#34;name&#34;: &#34;o1-mini&#34;, &#34;avatar&#34;: &#34;/imgs/model/openai.svg&#34;, &#34;maxContext&#34;: 125000, &#34;maxResponse&#34;: 65000, &#34;quoteMaxToken&#34;: 120000, &#34;maxTemperature&#34;: 1.2, &#34;charsPointsPrice&#34;: 0, &#34;censor&#34;: false, &#34;vision&#34;: false, &#34;datasetProcess&#34;: true, &#34;usedInClassify&#34;: true, &#34;usedInExtractFields&#34;: true, &#34;usedInToolCall&#34;: true, &#34;usedInQueryExtension&#34;: true, &#34;toolChoice&#34;: false, &#34;functionCall&#34;: false, &#34;customCQPrompt&#34;: &#34;&#34;, &#34;customExtractPrompt&#34;: &#34;&#34;, &#34;defaultSystemChatPrompt&#34;: &#34;&#34;, &#34;defaultConfig&#34;: { &#34;temperature&#34;: 1 } }, { &#34;model&#34;: &#34;o1-preview&#34;, &#34;name&#34;: &#34;o1-preview&#34;, &#34;avatar&#34;: &#34;/imgs/model/openai.svg&#34;, &#34;maxContext&#34;: 125000, &#34;maxResponse&#34;: 32000, &#34;quoteMaxToken&#34;: 120000, &#34;maxTemperature&#34;: 1.V4.8.10(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/4810/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/4810/更新指南 link1. 做好数据备份 link2. 商业版 —— 修改环境变量 link 需要给fastgpt-pro镜像,增加沙盒的环境变量:SANDBOX_URL=http://xxxxx:3000 给fastgpt-pro镜像和fastgpt镜像增加环境变量,以便更好的存储系统日志: LOG_LEVEL=debug STORE_LOG_LEVEL=warn 3. 修改镜像tag link 更新 FastGPT 镜像 tag: v4.8.10 更新 FastGPT 商业版镜像 tag: v4.8.10 Sandbox 镜像,可以不更新 4. 执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv4810&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化发布记录版本标记 初始化开票记录 V4.8.10 更新说明 link完整内容请见:4.8.10 release +新增 - 模板市场。 新增 - 工作流节点拖动自动对齐吸附。 新增 - 用户选择节点(Debug 模式暂未支持)。 新增 - 工作流增加 uid 全局变量。 新增 - 工作流撤销和重做。 新增 - 工作流本次编辑记录,取代自动保存。 新增 - 工作流版本支持重命名。 新增 - 工作流的“应用调用”节点弃用,迁移成单独节点,与插件使用方式相同,同时可以传递全局变量和用户上传的文件。 新增 - 插件增加使用说明配置。 新增 - 插件自定义输入支持单选框。 新增 - HTTP 节点支持 text/plain 模式。 新增 - HTTP模块支持超时配置、支持更多的 Body 类型,params 和 headers 支持新的变量选择模式。 新增 - 工作流导出导入,支持直接导出和导入 JSON 文件,便于交流。 新增 - 发送验证码安全校验。 商业版新增 - 飞书机器人接入。 商业版新增 - 公众号接入接入。 商业版新增 - 自助开票申请。 商业版新增 - SSO 定制。 优化 - 工作流循环校验,避免 skip 循环空转。同时支持分支完全并发执行。 优化 - 工作流嵌套执行,参数可能存在的污染问题。 优化 - 部分全局变量,增加数据类型约束。 优化 - 节点选择,避免切换 tab 时候,path 加载报错。 优化 - 最新 React Markdown 组件,支持 Base64 图片。 优化 - 对话框性能问题。 优化 - 单选框打开后自动滚动到选中的位置。 优化 - 知识库集合禁用,目录禁用会递归修改其下所有 children 的禁用状态。 优化 - SSE 响应代码优化。 优化 - 无 SSL 证书情况下,优化复制。 优化 - 知识库列表 UI。 优化 - 知识库详情页 UI。 优化 - 支持无网络配置情况下运行。 优化 - 调整.V4.8.9(需要初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/489/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/489/升级指南 link1. 做好数据库备份 link2. 修改镜像 link 更新 FastGPT 镜像 tag: v4.8.9 更新 FastGPT 商业版镜像 tag: v4.8.9 Sandbox 镜像,可以不更新 3. 商业版执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/init/489&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会初始化多租户的通知方式,仅内部使用的,无需执行。 +V4.8.9 更新说明 link 新增 - 文件上传配置,不再依赖视觉模型决定是否可上传图片,而是通过系统配置决定。 新增 - AI 对话节点和工具调用支持选择“是否开启图片识别”,开启后会自动获取对话框上传的图片和“用户问题”中的图片链接。 新增 - 文档解析节点。 商业版新增 - 团队通知账号绑定,用于接收重要信息。 商业版新增 - 知识库集合标签功能,可以对知识库进行标签管理。 商业版新增 - 知识库搜索节点支持标签过滤和创建时间过滤。 商业版新增 - 转移 App owner 权限。 新增 - 删除所有对话引导内容。 新增 - QA 拆分支持自定义 chunk 大小,并优化 gpt4o-mini 拆分时,chunk 太大导致生成内容很少的问题。 优化 - 对话框信息懒加载,减少网络传输。 优化 - 清除选文件缓存,支持重复选择同一个文件。 修复 - 知识库上传文件,网络不稳定或文件较多情况下,进度无法到 100%。 修复 - 删除应用后回到聊天选择最后一次对话的应用为删除的应用时提示无该应用问题。 修复 - 插件动态变量配置默认值时,无法正常显示默认值。 修复 - 工具调用温度和最大回复值未生效。 修复 - 函数调用模式,assistant role 中,GPT 模型必须传入 content 参数。(不影响大部分模型,目前基本都改用用 ToolChoice 模式,FC 模式已弃用)。 修复 - 知识库文件上传进度更新可能异常。 修复 - 知识库 rebuilding 时候,页面总是刷新到第一页。 修复 - 知识库 list openapi 鉴权问题。 修复 - 分享链接,新对话无法反馈。V4.8.8(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/488/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/488/升级指南 link1. 做好数据库备份 link2. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.8-fix2 商业版镜像 tag 修改成 v4.8.8 3. 执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv488&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会初始化知识库的继承权限 +V4.8.8 更新说明 link点击查看完整更新 +新增 - 重构系统插件的结构。允许向开源社区 PR 系统插件,具体可见: 如何向 FastGPT 社区提交系统插件。 新增 - DuckDuckGo 系统插件。 新增 - 飞书 webhook 系统插件。 新增 - 修改变量填写方式。提示词输入框以以及工作流中所有 Textarea 输入框,支持输入 / 唤起变量选择,可直接选择所有上游输出值,无需动态引入。 商业版新增 - 知识库权限继承。 优化 - 移动端快速切换应用交互。 优化 - 节点图标。 优化 - 对话框引用增加额外复制案件,便于复制。增加引用内容折叠。 优化 - OpenAI sdk 升级,并自定义了 whisper 模型接口(未仔细查看 sdk 实现,但 sdk 中 whisper 接口,似乎无法适配一般 fastapi 接口) 修复 - Permission 表声明问题。 修复 - 并行执行节点,运行时间未正确记录。 修复 - 运行详情未正确展示嵌套节点信息。 修复 - 简易模式,首次进入,无法正确获取知识库配置。 修复 - Log debug level 配置无效。 修复 - 插件独立运行时,会将插件输入的值进行变量替换,可能导致后续节点变量异常。V4.8.7https://doc.tryfastgpt.ai/docs/development/upgrading/487/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/487/升级指南 link1. 做好数据库备份 link2. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.7 商业版镜像 tag 修改成 v4.8.7 V4.8.7 更新说明 link 新增 - 插件支持独立运行,发布和日志查看 新增 - 应用搜索 优化 - 对话框代码 优化 - 升级 Dockerfile node 和 pnpm 版本 优化 - local 域名部署,也可以正常使用 vision 模式 修复 - 简易模式无法变更全局变量 修复 - gpt4o 无法同时使用工具和图片V4.8.6(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/486/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/486/升级指南 link1. 做好数据库备份 link2. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.6 fastgpt-sandbox 镜像 tag 修改成 v4.8.6 商业版镜像 tag 修改成 v4.8.6 3. 执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv486&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会初始化应用的继承权限 +V4.8.6 更新说明 link 新增 - 应用权限继承 新增 - 知识库支持单个集合禁用功能 新增 - 系统插件模式变更,新增链接读取和数学计算器插件,正式版会更新如何自定义系统插件 新增 - 代码沙盒运行参数 新增 - AI对话时隐藏头部的功能,主要是适配移动端 优化 - 文件读取,Mongo 默认使用从节点,减轻主节点压力 优化 - 提示词模板 优化 - Mongo model 重复加载 修复 - 创建链接集合未返回 id 修复 - 文档接口说明 修复 - api system 提示合并 修复 - 团队插件目录内的内容无法加载 修复 - 知识库集合目录面包屑无法加载 修复 - Markdown 导出对话异常 修复 - 提示模板结束标签错误 修复 - 文档描述V4.8.5(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/485/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/485/升级指南 link1. 做好数据库备份 link2. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.5 商业版镜像 tag 修改成 v4.8.5 3. 执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv485&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会把插件的数据表合并到应用中,插件表不会删除。 +商业版用户执行额外的初始化 +从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版的域名: +curl --location --request POST &#39;https://{{host}}/api/admin/init/485&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会重置知识库权限系统。 +V4.8.5 更新说明 link 新增 - 合并插件和应用,统一成工作台 新增 - 应用创建副本功能 新增 - 应用创建模板 新增 - 支持代码运行结果作为工具输出。 新增 - Markdown 图片输出,支持移动端放大缩放。 优化 - 原文件编码存取 优化 - 知识库删除后,简易模式会过滤掉删除的知识库,避免错误判断。 优化 - 文件夹读取,支持单个文件夹超出 100 个文件 优化 - 问答拆分/手动录入,当有a字段时,自动将q作为补充索引。 优化 - 对话框页面代码 优化 - 工作流新节点自动增加序号名 修复 - 定时任务无法实际关闭 修复 - 输入引导特殊字符导致正则报错 修复 - 文件包含特殊字符%,且为转义时会导致页面崩溃 修复 - 自定义输入选择知识库引用时页面崩溃V4.8.4(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/484/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/484/升级指南 link1. 修改镜像 link fastgpt 镜像 tag 修改成 v4.8.4 fastgpt-sandbox 镜像 tag 修改成 v4.8.4 (选择性,无变更) 商业版镜像 tag 修改成 v4.8.4 2. 商业版用户执行初始化 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT 商业版的域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/init/484&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; V4.8.4 更新说明 link 新增 - 应用使用新权限系统。 新增 - 应用支持文件夹。 优化 - 文本分割增加连续换行、制表符清除,避免大文本性能问题。 重要修复 - 修复系统插件运行池数据污染问题,由于从内存获取,会导致全局污染。 修复 - Debug 模式下,相同 source 和 target 内容,导致连线显示异常。 修复 - 定时执行初始化错误。 修复 - 应用调用传参异常。 修复 - ctrl + cv 复杂节点时,nodeId错误。 调整组件库全局theme。V4.8.3https://doc.tryfastgpt.ai/docs/development/upgrading/483/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/483/升级指南 link fastgpt 镜像 tag 修改成 v4.8.3 fastgpt-sandbox 镜像 tag 修改成 v4.8.3 商业版镜像 tag 修改成 v4.8.3 V4.8.3 更新说明 link 新增 - 支持 Milvus 数据库, 可参考最新的 docker-compose-milvus.yml. 新增 - 给 chat 接口 empty answer 增加 log,便于排查模型问题。 新增 - ifelse判断器,字符串支持正则。 新增 - 代码运行支持 console.log 输出调试。 修复 - 变量更新在 Debug 模式下出错。V4.8.2https://doc.tryfastgpt.ai/docs/development/upgrading/482/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/482/Sealos 升级说明 link 在应用管理中新建一个应用,镜像为:registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.1 无需外网访问地址,端口号为3000 部署完后,复制应用的内网地址 点击变更`FastGPT - 修改环境变量,增加下面的环境变量即可 SANDBOX_URL=内网地址 Docker 部署 link可以拉取最新 docker-compose.yml 文件参考 +新增一个容器 sandbox fastgpt 和 fastgpt-pro(商业版) 容器新增环境变量: SANDBOX_URL sandbox 简易不要开启外网访问,未做凭证校验。 V4.8.2 更新说明 link 新增 - js代码运行节点(更完整的type提醒,后续继续完善) 新增 - 内容提取节点支持数据类型选择 修复 - 新增的站点同步无法使用 修复 - 定时任务无法输入内容V4.8.1(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/481/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/481/初始化脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT的域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/initv481&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 由于之前集合名不规范,该初始化会重置表名。请在初始化前,确保 dataset.trainings 表没有数据。 最好更新该版本时,暂停所有进行中业务,再进行初始化,避免数据冲突。 +执行脏数据清理 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT的域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/clearInvalidData&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化完后,可以执行这个命令。之前定时清理的定时器有些问题,部分数据没被清理,可以手动执行清理。 +V4.8.1 更新说明 link使用 Chat api 接口需要注意,增加了 event: updateVariables 事件,用于更新变量。 +点击查看升级说明V4.8https://doc.tryfastgpt.ai/docs/development/upgrading/48/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/48/新工作流 linkFastGPT workflow V2上线,支持更加简洁的工作流模式。 +🤖 +由于工作流差异较大,不少地方需要手动重新构建。请依次重建插件和应用 +简易尽快更新工作流,避免未来持续迭代后导致无法兼容。 +给应用和插件增加了 version 的字段,用于标识是旧工作流还是新工作流。当你更新 4.8 后,保存和新建的工作流均为新版,旧版工作流会有一个重置的弹窗提示。并且,如果是通过 API 和 分享链接 调用的工作流,仍可以正常使用,直到你下次保存它们。 +商业版配置更新 link商业版用户如果配置了邮件验证码,需要在管理端 -&gt; 项目配置 -&gt; 登录配置 -&gt; 邮箱登录配置 -&gt; 修改 邮箱服务SMTP地址,之前只能配置别名,现在可以配置自定义的地址。下面是一组别名和实际地址关系: +qq: smtp.qq.com gmail: smtp.gmail.com +V4.8 更新说明 link 重构 - 工作流 新增 - 判断器。支持 if elseIf else 判断。 @newfish-cmyk (preview版本的if else节点需要删除重建) 新增 - 变量更新节点。支持更新运行中工作流输出变量,或更新全局变量。@newfish-cmyk 新增 - 工作流自动保存和版本管理。 新增 - 工作流 Debug 模式,可以调试单个节点或者逐步调试工作流。 新增 - 定时执行应用。可轻松实现定时任务。 新增 - 插件自定义输入优化,可以渲染输入组件。 新增 - 分享链接发送对话前 hook https://github.com/labring/FastGPT/pull/1252 @gaord 优化 - 工作流连线,可以四向连接,方便构建循环工作流。 优化 - 工作流上下文传递,性能🚀。 优化 - ctrl和alt+enter换行,换行符位置不正确。 优化 - chat中存储变量配置。避免修改变量后,影响旧的对话。 优化 - 简易模式,更新配置后自动更新调试框内容,无需保存。 优化 - worker进程管理,并将计算 Token 任务分配给 worker 进程。 优化 - 工具调用支持指定字段数据类型(string, boolean, number) https://github.V4.7.1(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/471/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/471/初始化脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成FastGPT的域名。 +curl --location --request POST &#39;https://{{host}}/api/admin/clearInvalidData&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 该请求会执行脏数据清理(清理无效的文件、清理无效的图片、清理无效的知识库集合、清理无效的向量) +修改配置文件 link增加了Laf环境配置:点击查看最新的配置文件 +V4.7.1 更新说明 link 新增 - 语音输入完整配置。支持选择是否打开语音输入(包括分享页面),支持语音输入后自动发送,支持语音输入后自动语音播放(流式)。 新增 - pptx 和 xlsx 文件读取。但所有文件读取都放服务端,会消耗更多的服务器资源,以及无法在上传时预览更多内容。 新增 - 集成 Laf 云函数,可以读取 Laf 账号中的云函数作为 HTTP 模块。 新增 - 定时器,清理垃圾数据。(采用小范围清理,会清理最近n个小时的,所以请保证服务持续运行,长时间不允许,可以继续执行 clearInvalidData 的接口进行全量清理。) 商业版新增 - 后台配置系统通知。 优化 - 支持ip模式导出知识库。 修改 - csv导入模板,取消 header 校验,自动获取前两列。 修复 - 工具调用模块连线数据类型校验错误。 修复 - 自定义索引输入时,解构数据失败。 修复 - rerank 模型数据格式。 修复 - 问题补全历史记录BUG 修复 - 分享页面特殊情况下加载缓慢问题(由于ssr时候数据库不会触发连接)V4.7(需要初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/47/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/47/1. 修改配置文件 link增加一些 Boolean 值,用于决定不同功能块可以使用哪些模型,同时增加了模型的 logo:点击查看最新的配置文件 +2. 初始化脚本 link升级完镜像后。从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成自己域名 +curl --location --request POST &#39;https://{{host}}/api/admin/initv47&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 脚本功能: +初始化插件的 parentId 3. 升级 ReRank 模型 link4.7对ReRank模型进行了格式变动,兼容 cohere 的格式,可以直接使用 cohere 提供的 API。如果是本地的 ReRank 模型,需要修改镜像为:registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1 。 +cohere的重排模型对中文不是很好,感觉不如 bge 的好用,接入教程如下: +申请 Cohere 官方 Key: https://dashboard.cohere.com/api-keys 修改 FastGPT 配置文件 { &#34;reRankModels&#34;: [ { &#34;model&#34;: &#34;rerank-multilingual-v2.0&#34;, // 这里的 model 需要对应 cohere 的模型名 &#34;name&#34;: &#34;检索重排&#34;, // 随意 &#34;requestUrl&#34;: &#34;https://api.V4.6.9(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/469/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/469/修改商业版环境变量 link增加 oneapi 地址和令牌。 +OPENAI_BASE_URL=http://oneapi:3000/v1 CHAT_API_KEY=sk-fastgpt 初始化脚本 link从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 rootkey;{{host}} 替换成自己域名 +curl --location --request POST &#39;https://{{host}}/api/admin/initv469&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 重置计量表。 执行脏数据清理(清理无效的文件、清理无效的图片、清理无效的知识库集合、清理无效的向量) 外部接口更新 link 由于计费系统变更,分享链接对话上报接口需要做一些调整,price字段被totalPoints字段取代。inputToken和outputToken不再提供,只提供token字段(总token数量)。 V4.6.9 更新说明 link 商业版新增 - 知识库新增“增强处理”训练模式,可生成更多类型索引。 新增 - 完善了HTTP模块的变量提示。 新增 - HTTP模块支持OpenAI单接口导入。 新增 - 全局变量支持增加外部变量。可通过分享链接的Query或 API 的 variables 参数传入。 新增 - 内容提取模块增加默认值。 优化 - 问题补全。增加英文类型。同时可以设置为单独模块,方便复用。 优化 - 重写了计量模式 优化 - Token 过滤历史记录,保持偶数条,防止部分模型报错。 优化 - 分享链接SEO,可直接展示应用名和头像。 修复 - 标注功能。 修复 - qa生成线程计数错误。 修复 - 问题分类连线类型错误V4.6.8(需要初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/468/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/468/docker 部署 - 手动更新 Mongo link 修改 docker-compose.yml 的mongo部分,补上command和entrypoint mongo: image: mongo:5.0.18 # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云 container_name: mongo ports: - 27017:27017 networks: - fastgpt command: mongod --keyFile /data/mongodb.key --replSet rs0 environment: # 这里密码注意要和以前的一致 - MONGO_INITDB_ROOT_USERNAME=username - MONGO_INITDB_ROOT_PASSWORD=password volumes: - ./mongo/data:/data/db entrypoint: - bash - -c - | openssl rand -base64 128 &gt; /data/mongodb.key chmod 400 /data/mongodb.key chown 999:999 /data/mongodb.key echo &#39;const isInited = rs.status().ok === 1 if(!isInited){ rs.initiate({ _id: &#34;rs0&#34;, members: [ { _id: 0, host: &#34;mongo:27017&#34; } ] }) }&#39; &gt; /data/initReplicaSet.V4.6.7(需要初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/467/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/467/1。执行初始化 API link发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +https://xxxxx/api/admin/initv467 curl --location --request POST &#39;https://{{host}}/api/admin/initv467&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化说明: +将 images 重新关联到数据集 设置 pg 表的 null 值。 V4.6.7 更新说明 link 修改了知识库UI及新的导入交互方式。 优化知识库和对话的数据索引。 知识库 openAPI,支持通过 API 操作知识库。 新增 - 输入框变量提示。输入 { 号后将会获得可用变量提示。根据社区针对高级编排的反馈,我们计划于 2 月份的版本中,优化变量内容,支持模块的局部变量以及更多全局变量写入。 优化 - 切换团队后会保存记录,下次登录时优先登录该团队。 修复 - API 对话时,chatId 冲突问题。 修复 - Iframe 嵌入网页可能导致的 window.onLoad 冲突。V4.6.6(需要改配置文件)https://doc.tryfastgpt.ai/docs/development/upgrading/466/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/466/配置文件变更 link为了减少代码重复度,我们对配置文件做了一些修改:点击查看最新的配置文件 +商业版变更 link 更新商业版镜像到 4.6.6 版本。 +将旧版配置文件中的 SystemParams.pluginBaseUrl 放置到环境变量中: +PRO_URL=商业版镜像地址(此处不再需要以 /api 结尾),例如: +PRO_URL=http://fastgpt-plugin.ns-hsss5d.svc.cluster.local:3000 +原本在配置文件中的 FeConfig 已被移除,可以直接打开新的商业版镜像外网地址进行配置。包括 FastGPT 的各个参数和模型都可以直接在商业版镜像中配置,无需再变更 config.json 文件。 +V4.6.6 更新说明 link 查看 FastGPT 2024 RoadMap 新增 - Http 模块请求头支持 Json 编辑器。 新增 - ReRank模型部署 新增 - 搜索方式:分离向量语义检索,全文检索和重排,通过 RRF 进行排序合并。 优化 - 问题分类提示词,id引导。测试国产商用 api 模型(百度阿里智谱讯飞)使用 Prompt 模式均可分类。 UI 优化,未来将逐步替换新的UI设计。 优化代码:Icon 抽离和自动化获取。 修复 - 链接读取的数据集,未保存选择器,导致同步时不使用选择器。V4.6.5(需要改配置文件)https://doc.tryfastgpt.ai/docs/development/upgrading/465/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/465/配置文件变更 link由于 openai 已开始弃用 function call,改为 toolChoice。FastGPT 同步的修改了对于的配置和调用方式,需要对配置文件做一些修改: +点击查看最新的配置文件 +主要是修改模型的functionCall字段,改成toolChoice即可。设置为true的模型,会默认走 openai 的 tools 模式;未设置或设置为false的,会走提示词生成模式。 问题优化模型与内容提取模型使用同一组配置。 +增加 &quot;ReRankModels&quot;: [] V4.6.5 功能介绍 link 新增 - 问题优化模块 新增 - 文本编辑模块 新增 - 判断器模块 新增 - 自定义反馈模块 新增 - 【内容提取】模块支持选择模型,以及字段枚举 优化 - docx读取,兼容表格(表格转markdown) 优化 - 高级编排连接线交互 优化 - 由于 html2md 导致的 cpu密集计算,阻断线程问题 修复 - 高级编排提示词提取描述V4.6.4(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/464/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/464/1。执行初始化 API link发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +https://xxxxx/api/admin/initv464 curl --location --request POST &#39;https://{{host}}/api/admin/initv464&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化说明: +初始化 PG 的createTime字段 初始化 Mongo 中 chat 的 feedback 字段 V4.6.4 功能介绍 link 重写 - 分享链接身份逻辑,采用 localID 记录用户的ID。 商业版新增 - 分享链接 SSO 方案,通过身份鉴权地址,仅需3个接口即可完全接入已有用户系统。具体参考分享链接身份鉴权 新增 - 分享链接更多嵌入方式提示,更多DIY方式。 优化 - 历史记录模块。弃用旧的历史记录模块,直接在对应地方填写数值即可。 调整 - 知识库搜索模块 topk 逻辑,采用 MaxToken 计算,兼容不同长度的文本块 调整鉴权顺序,提高 apikey 的优先级,避免cookie抢占 apikey 的鉴权。 链接读取支持多选择器。参考Web 站点同步用法 修复 - 分享链接图片上传鉴权问题 修复 - Mongo 连接池未释放问题。 修复 - Dataset Intro 无法更新 修复 - md 代码块问题 修复 - root 权限问题 优化 docker fileV4.6.3(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/463/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/463/1。执行初始化 API link发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +https://xxxxx/api/admin/initv463 curl --location --request POST &#39;https://{{host}}/api/admin/initv463&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化说明: +初始化Mongo 中 dataset,collection 和 data 的部分字段 V4.6.3 功能介绍 link 商业版新增 - web站点同步 新增 - 集合元数据记录 优化 - url 读取内容 优化 - 流读取文件,防止内存溢出 优化 - 4v模型自动将 url 转 base64,本地也可调试 优化 - 图片压缩等级 修复 - 图片压缩失败报错,防止文件读取过程卡死。V4.6.2(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/462/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/462/1。执行初始化 API link发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +https://xxxxx/api/admin/initv462 curl --location --request POST &#39;https://{{host}}/api/admin/initv462&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化说明: +初始化全文索引 V4.6.2 功能介绍 link 新增 - 全文索引(需配合 Rerank 模型,在看怎么放到开源版,模型接口比较特殊) 新增 - 插件来源(预计4.7/4.8版本会正式使用) 优化 - PDF读取 优化 - docx文件读取,转成 markdown 并保留其图片内容 修复和优化 TextSplitter 函数V4.6.1https://doc.tryfastgpt.ai/docs/development/upgrading/461/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/461/V4.6.1 功能介绍 link 新增 - GPT4-v 模型支持 新增 - whisper 语音输入 优化 - TTS 流传输 优化 - TTS 缓存V4.6(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/46/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/46/V4.6 版本加入了简单的团队功能,可以邀请其他用户进来管理资源。该版本升级后无法执行旧的升级脚本,且无法回退。 +1。更新镜像并变更配置文件 link更新镜像至 latest 或者 v4.6 版本。商业版镜像更新至 V0.2.1 +最新配置可参考:V46 版本最新 config.json,商业镜像配置文件也更新,参考最新的飞书文档。 +2。执行初始化 API link发起 2 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 rootkey,{{host}} 替换成自己域名) +该初始化接口可能速度很慢,返回超时不用管,注意看日志即可,需要注意的是,需确保 initv46 成功后,在执行 initv46-2 +https://xxxxx/api/admin/initv46 curl --location --request POST &#39;https://{{host}}/api/admin/initv46&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; https://xxxxx/api/admin/initv46-2 curl --location --request POST &#39;https://{{host}}/api/admin/initv46-2&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化内容: 1。创建默认团队 2。初始化 Mongo 所有资源的团队字段 3。初始化 Pg 的字段 4。初始化 Mongo Data +V4.6 功能介绍 link 新增 - 团队空间 新增 - 多路向量 (多个向量映射一组数据) 新增 - tts 语音 新增 - 支持知识库配置文本预处理模型 线上环境新增 - ReRank 向量召回,提高召回精度 优化 - 知识库导出,可直接触发流下载,无需等待转圈圈 4.V4.5.2https://doc.tryfastgpt.ai/docs/development/upgrading/452/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/452/功能介绍 linkFast GPT V4.5.2 link 新增 - 模块插件,允许自行组装插件进行模块复用。 优化 - 知识库引用提示。V4.5.1(需进行初始化)https://doc.tryfastgpt.ai/docs/development/upgrading/451/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/451/执行初始化 API link发起 1 个 HTTP 请求({{rootkey}} 替换成环境变量里的rootkey,{{host}}替换成自己域名) +https://xxxxx/api/admin/initv451 curl --location --request POST &#39;https://{{host}}/api/admin/initv451&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化内容: +rename 数据库字段 初始化 Mongo APP 表中知识库的相关字段 初始化 PG 和 Mongo 的内容,为每个文件创建一个集合(存储 Mongo 中),并反馈赋值给 PG。 该初始化接口可能速度很慢,返回超时不用管,注意看日志即可 +功能介绍 linkFast GPT V4.5.1 link 新增知识库文件夹管理 修复了 openai4.x sdk 无法兼容 oneapi 的智谱和阿里的接口。 修复部分模块无法触发完成事件V4.5(需进行较为复杂更新)https://doc.tryfastgpt.ai/docs/development/upgrading/45/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/45/FastGPT V4.5 引入 PgVector0.5 版本的 HNSW 索引,极大的提高了知识库检索的速度,比起IVFFlat索引大致有3~10倍的性能提升,可轻松实现百万数据毫秒级搜索。缺点在于构建索引的速度非常慢,4c16g 500w 组数据使用并行构建大约花了 48 小时。具体参数配置可参考 PgVector官方 +下面需要对数据库进行一些操作升级: +PgVector升级:Sealos 部署方案 link 点击Sealos桌面的数据库应用。 点击【pg】数据库的详情。 点击右上角的重启,等待重启完成。 点击左侧的一键链接,等待打开 Terminal。 依次输入下方 sql 命令 -- 升级插件名 ALTER EXTENSION vector UPDATE; -- 插件是否升级成功,成功的话,vector插件版本为 0.5.0,旧版的为 0.4.1 \dx -- 下面两个语句会设置 pg 在构建索引时可用的内存大小,需根据自身的数据库规格来动态配置,可配置为 1/4 的内存大小 alter system set maintenance_work_mem = &#39;2400MB&#39;; select pg_reload_conf(); -- 重构数据库索引和排序 REINDEX DATABASE postgres; -- 开始构建索引,该索引构建时间非常久,直接点击右上角的叉,退出 Terminal 即可 CREATE INDEX CONCURRENTLY vector_index ON modeldata USING hnsw (vector vector_ip_ops) WITH (m = 16, ef_construction = 64); -- 可以再次点击一键链接,进入 Terminal,输入下方命令,如果看到 &#34;vector_index&#34; hnsw (vector vector_ip_ops) WITH (m=&#39;16&#39;, ef_construction=&#39;64&#39;) 则代表构建完成(注意,后面没有 INVALID) \d modeldata PgVector升级:Docker-compose.V4.4.7(需执行升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/447/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/447/执行初始化 API link发起 1 个 HTTP 请求({{rootkey}} 替换成环境变量里的rootkey,{{host}}替换成自己域名) +https://xxxxx/api/admin/initv447 curl --location --request POST &#39;https://{{host}}/api/admin/initv447&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化 pg 索引以及将 file_id 中空对象转成 manual 对象。如果数据多,可能需要较长时间,可以通过日志查看进度。 +功能介绍 linkFast GPT V4.4.7 link 优化了数据库文件 crud。 兼容链接读取,作为 source。 区分手动录入和标注,可追数据至某个文件。 升级 openai sdk。V4.4.6https://doc.tryfastgpt.ai/docs/development/upgrading/446/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/446/功能介绍 link 高级编排新增模块 - 应用调用,可调用其他应用。 新增 - 必要连接校验 修复 - 下一步指引在免登录中身份问题。V4.4.5(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/445/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/445/执行初始化 API link发起 1 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv445 curl --location --request POST &#39;https://{{host}}/api/admin/initv445&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 初始化了 variable 模块,将其合并到用户引导模块中。 +功能介绍 linkFast GPT V4.4.5 link 新增 - 下一步指引选项,可以通过模型生成 3 个预测问题。 商业版新增 - 分享链接限制及 hook 身份校验(可对接已有的用户系统)。 商业版新增 - Api Key 使用。增加别名、额度限制和过期时间。自带 appId,无需额外连接。 优化 - 全局变量与开场白合并成同一模块。升级到 V4.4.2(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/442/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/442/执行初始化 API link发起 1 个 HTTP 请求 (记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv442 curl --location --request POST &#39;https://{{host}}/api/admin/initv442&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会给初始化 Mongo 的 Bill 表的索引,之前过期时间有误。升级到 V4.4.1(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/441/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/441/执行初始化 API link发起 1 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv441 curl --location --request POST &#39;https://{{host}}/api/admin/initv441&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会给初始化 Mongo 的 dataset.files,将所有数据设置为可用。升级到 V4.4(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/44/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/44/执行初始化 API link发起 1 个 HTTP 请求 (记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv44 curl --location --request POST &#39;https://{{host}}/api/admin/initv44&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会给初始化 Mongo 的部分字段。升级到 V4.3(包含升级脚本)https://doc.tryfastgpt.ai/docs/development/upgrading/43/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/43/执行初始化 API link发起 1 个 HTTP 请求 (记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv43 curl --location --request POST &#39;https://{{host}}/api/admin/initv43&#39; \ --header &#39;rootkey: {{rootkey}}&#39; \ --header &#39;Content-Type: application/json&#39; 会给 PG 数据库的 modeldata 表插入一个新列 file_id,用于存储文件 ID。 +增加环境变量 link增加一个 FILE_TOKEN_KEY 环境变量,用于生成文件预览链接,过期时间为 30 分钟。 +FILE_TOKEN_KEY=filetokenkey升级到 V4.2.1https://doc.tryfastgpt.ai/docs/development/upgrading/421/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/421/私有部署,如果添加了配置文件,需要在配置文件中修改 VectorModels 字段。增加 defaultToken 和 maxToken,分别对应直接分段时的默认 token 数量和该模型支持的 token 上限 (通常不建议超过 3000) +&#34;VectorModels&#34;: [ { &#34;model&#34;: &#34;text-embedding-ada-002&#34;, &#34;name&#34;: &#34;Embedding-2&#34;, &#34;price&#34;: 0, &#34;defaultToken&#34;: 500, &#34;maxToken&#34;: 3000 } ] 改动目的是,我们认为不需要留有选择余地,选择一个最合适的模型去进行任务即可。升级到 V4.2https://doc.tryfastgpt.ai/docs/development/upgrading/42/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/42/99.9%用户不影响,升级 4.2 主要是修改了配置文件中 QAModel 的格式。从原先的数组改成对象: +&#34;QAModel&#34;: { &#34;model&#34;: &#34;gpt-3.5-turbo-16k&#34;, &#34;name&#34;: &#34;GPT35-16k&#34;, &#34;maxToken&#34;: 16000, &#34;price&#34;: 0 } 改动目的是,我们认为不需要留有选择余地,选择一个最合适的模型去进行任务即可。升级到 V4.1https://doc.tryfastgpt.ai/docs/development/upgrading/41/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/41/如果您是从旧版本升级到 V4.1,由于新版重新设置了对话存储结构,需要初始化原来的存储内容。 +更新环境变量 linkV4.1 优化了 PostgreSQL 和 MongoDB 的连接变量,只需要填 1 个 URL 即可: +注意:/fastgpt 和 /postgres 是指数据库名称,需要和旧版的变量对应。 +# mongo 配置,不需要改. 如果连不上,可能需要去掉 ?authSource=admin - MONGODB_URI=mongodb://username:password@mongo:27017/fastgpt?authSource=admin # pg配置. 不需要改 - PG_URL=postgresql://username:password@pg:5432/postgres 初始化 API link部署新版项目,并发起 1 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initChatItem升级到 V4.0https://doc.tryfastgpt.ai/docs/development/upgrading/40/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/upgrading/40/如果您是从旧版本升级到 V4,由于新版 MongoDB 表变更比较大,需要按照本文档的说明执行一些初始化脚本。 +重命名表名 link需要连接上 MongoDB 数据库,执行两条命令: +db.models.renameCollection(&#34;apps&#34;) db.sharechats.renameCollection(&#34;outlinks&#34;) warning 注意:从旧版更新到 V4, MongoDB 会自动创建空表,你需要先手动删除这两个空表,再执行上面的操作。 +初始化几个表中的字段 link依次执行下面 3 条命令,时间比较长,不成功可以重复执行(会跳过已经初始化的数据),直到所有数据更新完成。 +db.chats.find({appId: {$exists: false}}).forEach(function(item){ db.chats.updateOne( { _id: item._id, }, { &#34;$set&#34;: {&#34;appId&#34;:item.modelId}} ) }) db.collections.find({appId: {$exists: false}}).forEach(function(item){ db.collections.updateOne( { _id: item._id, }, { &#34;$set&#34;: {&#34;appId&#34;:item.modelId}} ) }) db.outlinks.find({shareId: {$exists: false}}).forEach(function(item){ db.outlinks.updateOne( { _id: item._id, }, { &#34;$set&#34;: {&#34;shareId&#34;:item._id.toString(),&#34;appId&#34;:item.modelId}} ) }) 初始化 API link部署新版项目,并发起 3 个 HTTP 请求(记得携带 headers.rootkey,这个值是环境变量里的) +https://xxxxx/api/admin/initv4 https://xxxxx/api/admin/initChat https://xxxxx/api/admin/initOutlink 1 和 2 有可能会因为内存不足挂掉,可以重复执行。Api Key 使用与鉴权https://doc.tryfastgpt.ai/docs/development/openapi/auth/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/openapi/auth/使用说明 linkFasGPT OpenAPI 接口允许你使用 Api Key 进行鉴权,从而操作 FastGPT 上的相关服务和资源,例如:调用应用对话接口、上传知识库数据、搜索测试等等。出于兼容性和安全考虑,并不是所有的接口都允许通过 Api Key 访问。 +如何查看 BaseURL link注意:BaseURL 不是接口地址,而是所有接口的根地址,直接请求 BaseURL 是没有用的。 +如何获取 Api Key linkFastGPT 的 API Key 有 2 类,一类是全局通用的 key (无法直接调用应用对话);一类是携带了 AppId 也就是有应用标记的 key (可直接调用应用对话)。 +我们建议,仅操作应用或者对话的相关接口使用 应用特定key,其他接口使用 通用key。 +通用key 应用特定 key 基本配置 linkOpenAPI 中,所有的接口都通过 Header.Authorization 进行鉴权。 +baseUrl: &#34;https://api.fastgpt.in/api&#34; headers: { Authorization: &#34;Bearer {{apikey}}&#34; } 发起应用对话示例 +curl --location --request POST &#39;https://api.fastgpt.in/api/v1/chat/completions&#39; \ --header &#39;Authorization: Bearer fastgpt-xxxxxx&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;chatId&#34;: &#34;111&#34;, &#34;stream&#34;: false, &#34;detail&#34;: false, &#34;messages&#34;: [ { &#34;content&#34;: &#34;导演是谁&#34;, &#34;role&#34;: &#34;user&#34; } ] }&#39;对话接口https://doc.tryfastgpt.ai/docs/development/openapi/chat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/openapi/chat/发起对话 link 🤖 +该接口的 API Key 需使用应用特定的 key,否则会报错。 +有些包调用时,BaseUrl需要添加v1路径,有些不需要,如果出现404情况,可补充v1重试。 +请求简易应用和工作流 link对话接口兼容GPT的接口!如果你的项目使用的是标准的GPT官方接口,可以直接通过修改BaseUrl和 Authorization来访问 FastGpt 应用,不过需要注意下面几个规则: +🤖 +传入的model,temperature等参数字段均无效,这些字段由编排决定,不会根据 API 参数改变。 +不会返回实际消耗Token值,如果需要,可以设置detail=true,并手动计算 responseData 里的tokens值。 +请求 link 基础请求示例 图片/文件请求示例 参数说明 curl --location --request POST &#39;http://localhost:3000/api/v1/chat/completions&#39; \ --header &#39;Authorization: Bearer fastgpt-xxxxxx&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;chatId&#34;: &#34;my_chatId&#34;, &#34;stream&#34;: false, &#34;detail&#34;: false, &#34;responseChatItemId&#34;: &#34;my_responseChatItemId&#34;, &#34;variables&#34;: { &#34;uid&#34;: &#34;asdfadsfasfd2323&#34;, &#34;name&#34;: &#34;张三&#34; }, &#34;messages&#34;: [ { &#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;导演是谁&#34; } ] }&#39; 仅messages有部分区别,其他参数一致。 目前不支持上次文件,需上传到自己的对象存储中,获取对应的文件链接。 curl --location --request POST &#39;http://localhost:3000/api/v1/chat/completions&#39; \ --header &#39;Authorization: Bearer fastgpt-xxxxxx&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;chatId&#34;: &#34;abcd&#34;, &#34;stream&#34;: false, &#34;messages&#34;: [ { &#34;role&#34;: &#34;user&#34;, &#34;content&#34;: [ { &#34;type&#34;: &#34;text&#34;, &#34;text&#34;: &#34;导演是谁&#34; }, { &#34;type&#34;: &#34;image_url&#34;, &#34;image_url&#34;: { &#34;url&#34;: &#34;图片链接&#34; } }, { &#34;type&#34;: &#34;file_url&#34;, &#34;name&#34;: &#34;文件名&#34;, &#34;url&#34;: &#34;文档链接,支持 txt md html word pdf ppt csv excel&#34; } ] } ] }&#39; info headers.知识库接口https://doc.tryfastgpt.ai/docs/development/openapi/dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/openapi/dataset/如何获取知识库ID(datasetId) 如何获取文件集合ID(collection_id) 创建训练订单 link 请求示例 响应示例 新例子 +curl --location --request POST &#39;http://localhost:3000/api/support/wallet/usage/createTrainingUsage&#39; \ --header &#39;Authorization: Bearer {{apikey}}&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;datasetId&#34;: &#34;知识库 ID&#34;, &#34;name&#34;: &#34;可选,自定义订单名称,例如:文档训练-fastgpt.docx&#34; }&#39; data 为 billId,可用于添加知识库数据时进行账单聚合。 +{ &#34;code&#34;: 200, &#34;statusText&#34;: &#34;&#34;, &#34;message&#34;: &#34;&#34;, &#34;data&#34;: &#34;65112ab717c32018f4156361&#34; } 知识库 link创建一个知识库 link 请求示例 参数说明 响应示例 curl --location --request POST &#39;http://localhost:3000/api/core/dataset/create&#39; \ --header &#39;Authorization: Bearer {{authorization}}&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;parentId&#34;: null, &#34;type&#34;: &#34;dataset&#34;, &#34;name&#34;:&#34;测试&#34;, &#34;intro&#34;:&#34;介绍&#34;, &#34;avatar&#34;: &#34;&#34;, &#34;vectorModel&#34;: &#34;text-embedding-ada-002&#34;, &#34;agentModel&#34;: &#34;gpt-3.分享链接身份鉴权https://doc.tryfastgpt.ai/docs/development/openapi/share/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/openapi/share/介绍 link在 FastGPT V4.6.4 中,我们修改了分享链接的数据读取方式,为每个用户生成一个 localId,用于标识用户,从云端拉取对话记录。但是这种方式仅能保障用户在同一设备同一浏览器中使用,如果切换设备或者清空浏览器缓存则会丢失这些记录。这种方式存在一定的风险,因此我们仅允许用户拉取近30天的20条记录。 +分享链接身份鉴权设计的目的在于,将 FastGPT 的对话框快速、安全的接入到你现有的系统中,仅需 2 个接口即可实现。 +使用说明 link免登录链接配置中,你可以选择填写身份验证栏。这是一个POST请求的根地址。在填写该地址后,分享链接的初始化、开始对话以及对话结束都会向该地址的特定接口发送一条请求。下面以host来表示凭身份验证根地址。服务器接口仅需返回是否校验成功即可,不需要返回其他数据,格式如下: +接口统一响应格式 link { &#34;success&#34;: true, &#34;message&#34;: &#34;错误提示&#34;, &#34;msg&#34;: &#34;同message, 错误提示&#34;, &#34;data&#34;: { &#34;uid&#34;: &#34;用户唯一凭证&#34; } } FastGPT 将会判断success是否为true决定是允许用户继续操作。message与msg是等同的,你可以选择返回其中一个,当success不为true时,将会提示这个错误。 +uid是用户的唯一凭证,将会用于拉取对话记录以及保存对话记录。可参考下方实践案例。 +触发流程 link 配置教程 link1. 配置身份校验地址 link 配置校验地址后,在每次分享链接使用时,都会向对应的地址发起校验和上报请求。 +🤖 +这里仅需配置根地址,无需具体到完整请求路径。 +2. 分享链接中增加额外 query link在分享链接的地址中,增加一个额外的参数: authToken。例如: +原始的链接:https://share.tryfastgpt.ai/chat/share?shareId=648aaf5ae121349a16d62192 +完整链接: https://share.tryfastgpt.ai/chat/share?shareId=648aaf5ae121349a16d62192&amp;authToken=userid12345 +这个authToken通常是你系统生成的用户唯一凭证(Token之类的)。FastGPT 会在鉴权接口的body中携带 token={{authToken}} 的参数。 +3. 编写聊天初始化校验接口 link 请求示例 鉴权成功 鉴权失败 curl --location --request POST &#39;{{host}}/shareAuth/init&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;token&#34;: &#34;{{authToken}}&#34; }&#39; { &#34;success&#34;: true, &#34;data&#34;: { &#34;uid&#34;: &#34;用户唯一凭证&#34; } } 系统会拉取该分享链接下,uid 为 username123 的对话记录。Docker 部署问题https://doc.tryfastgpt.ai/docs/faq/docker/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/docker/私有部署常见问题https://doc.tryfastgpt.ai/docs/faq/privatedeploy/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/privatedeploy/聊天框问题https://doc.tryfastgpt.ai/docs/faq/chat/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/chat/我修改了工作台的应用,为什么在“聊天”时没有更新配置? link应用需要点击发布后,聊天才会更新应用。 +浏览器不支持语音输入 link 首先需要确保浏览器、电脑本身麦克风权限的开启。 确认浏览器允许该站点使用麦克风,并且选择正确的麦克风来源。 需有 SSL 证书的站点才可以使用麦克风。应用使用问题https://doc.tryfastgpt.ai/docs/faq/app/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/app/工作流中多轮对话场景中如何使连续问题被问题分类节点正确的归类 link问题分类节点具有获取上下文信息的能力,当处理两个关联性较大的问题时,模型的判断准确性往往依赖于这两个问题之间的联系和模型的能力。例如,当用户先问“我该如何使用这个功能?”接着又询问“这个功能有什么限制?”时,模型借助上下文信息,就能够更精准地理解并响应。 +但是,当连续问题之间的关联性较小,模型判断的准确度可能会受到限制。在这种情况下,我们可以引入全局变量的概念来记录分类结果。在后续的问题分类阶段,首先检查全局变量是否存有分类结果。如果有,那么直接沿用该结果;若没有,则让模型自行判断。 +建议:构建批量运行脚本进行测试,评估问题分类的准确性。 +系统编排配置中的定时执行,如果用户打开分享的连接,停留在那个页面,定时执行触发问题 link发布后,后台生效。 +AI对话回答要求中的Markdown语法取消 link在针对知识库的回答要求里有, 要给它配置提示词,不然他就是默认的,默认的里面就有该语法。接入 Marker PDF 文档解析https://doc.tryfastgpt.ai/docs/development/custom-models/marker/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/marker/背景 linkPDF 是一个相对复杂的文件格式,在 FastGPT 内置的 pdf 解析器中,依赖的是 pdfjs 库解析,该库基于逻辑解析,无法有效的理解复杂的 pdf 文件。所以我们在解析 pdf 时候,如果遇到图片、表格、公式等非简单文本内容,会发现解析效果不佳。 +市面上目前有多种解析 PDF 的方法,比如使用 Marker,该项目使用了 Surya 模型,基于视觉解析,可以有效提取图片、表格、公式等复杂内容。为了可以让 Marker 快速接入 FastGPT,我们做了一个自定义解析的拓展 Demo。 +在 FastGPT 4.8.15 版本中,你可以通过增加一个环境变量,来替换掉 FastGPT 系统内置解析器,实现自定义的文档解析服务。该功能只是 Demo 阶段,后期配置模式和交互规则会发生改动。 +使用教程 link1. 按照 Marker link参考文档 Marker 安装教程,安装 Marker 模型。封装的 API 已经适配了 FastGPT 自定义解析服务。 +这里介绍快速 Docker 安装的方法: +docker pull crpi-h3snc261q1dosroc.cn-hangzhou.personal.cr.aliyuncs.com/marker11/marker_images:latest docker run --gpus all -itd -p 7231:7231 --name model_pdf_v1 crpi-h3snc261q1dosroc.cn-hangzhou.personal.cr.aliyuncs.com/marker11/marker_images:latest 2. 添加 FastGPT 环境变量 link CUSTOM_READ_FILE_URL=http://xxxx.com/v1/parse/file CUSTOM_READ_FILE_EXTENSION=pdf CUSTOM_READ_FILE_URL - 自定义解析服务的地址, host改成解析服务的访问地址,path 不能变动。 CUSTOM_READ_FILE_EXTENSION - 支持的文件后缀,多个文件类型,可用逗号隔开。 3.使用 Xinference 接入本地模型https://doc.tryfastgpt.ai/docs/development/custom-models/xinference/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/xinference/Xinference 是一款开源模型推理平台,除了支持 LLM,它还可以部署 Embedding 和 ReRank 模型,这在企业级 RAG 构建中非常关键。同时,Xinference 还提供 Function Calling 等高级功能。还支持分布式部署,也就是说,随着未来应用调用量的增长,它可以进行水平扩展。 +安装 Xinference linkXinference 支持多种推理引擎作为后端,以满足不同场景下部署大模型的需要,下面会分使用场景来介绍一下这三种推理后端,以及他们的使用方法。 +1. 服务器 link如果你的目标是在一台 Linux 或者 Window 服务器上部署大模型,可以选择 Transformers 或 vLLM 作为 Xinference 的推理后端: +Transformers:通过集成 Huggingface 的 Transformers 库作为后端,Xinference 可以最快地 集成当今自然语言处理(NLP)领域的最前沿模型(自然也包括 LLM)。 vLLM: vLLM 是由加州大学伯克利分校开发的一个开源库,专为高效服务大型语言模型(LLM)而设计。它引入了 PagedAttention 算法, 通过有效管理注意力键和值来改善内存管理,吞吐量能够达到 Transformers 的 24 倍,因此 vLLM 适合在生产环境中使用,应对高并发的用户访问。 假设你服务器配备 NVIDIA 显卡,可以参考这篇文章中的指令来安装 CUDA,从而让 Xinference 最大限度地利用显卡的加速功能。 +Docker 部署 link你可以使用 Xinference 官方的 Docker 镜像来一键安装和启动 Xinference 服务(确保你的机器上已经安装了 Docker),命令如下: +docker run -p 9997:9997 --gpus all xprobe/xinference:latest xinference-local -H 0.知识库使用问题https://doc.tryfastgpt.ai/docs/faq/dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/dataset/上传的文件内容出现中文乱码 link将文件另存为 UTF-8 编码格式。 +知识库配置里的文件处理模型是什么?与索引模型有什么区别? link 文件处理模型:用于数据处理的【增强处理】和【问答拆分】。在【增强处理】中,生成相关问题和摘要,在【问答拆分】中执行问答对生成。 索引模型:用于向量化,即通过对文本数据进行处理和组织,构建出一个能够快速查询的数据结构。 基于知识库的查询,但是问题相关的答案过多。ai回答到一半就不继续回答。 linkFastGPT回复长度计算公式: +最大回复=min(配置的最大回复(内置的限制),最大上下文(输入和输出的总和)-历史记录) +18K模型-&gt;输入与输出的和 +输出增多-&gt;输入减小 +所以可以: +检查配置的最大回复(回复上限) 减小输入来增大输出,即减小历史记录,在工作流其实也就是“聊天记录” 配置的最大回复: +私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出 受到模型上下文的限制,有时候达不到聊天记录的轮次,连续对话字数过多就会报上下文不够的错误。 linkFastGPT回复长度计算公式: +最大回复=min(配置的最大回复(内置的限制),最大上下文(输入和输出的总和)-历史记录) +18K模型-&gt;输入与输出的和 +输出增多-&gt;输入减小 +所以可以: +检查配置的最大回复(回复上限) 减小输入来增大输出,即减小历史记录,在工作流其实也就是“聊天记录” 配置的最大回复: +私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出接入外部渠道https://doc.tryfastgpt.ai/docs/faq/external_channel_integration/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/external_channel_integration/接入cow,图文对话无法直接显示图片 link 提示词给引导,不要以markdown格式输出。图片需要二开 cow 实现图片链接截取并发送。 +可以获取到用户发送问答的记录吗 link 在应用的对话日志里可以查看。报错https://doc.tryfastgpt.ai/docs/faq/error/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/error/当前分组上游负载已饱和,请稍后再试(request id:202407100753411462086782835521) link 是oneapi渠道的问题,可以换个模型用or换一家中转站 +使用API时在日志中报错Connection Error link 大概率是api-key填写了openapi,然后部署的服务器在国内,不能访问海外的api,可以使用中转或者反代的手段解决访问不到的问题积分消耗https://doc.tryfastgpt.ai/docs/faq/points_consumption/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/points_consumption/接入oneapi后,为什么还会消耗fastgpt的积分 link 矢量数据库检索会默认消耗。可以查看看绑定提示和使用记录。其他问题https://doc.tryfastgpt.ai/docs/faq/other/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/faq/other/oneapi 官网是哪个 link只有开源的 README,没官网,GitHub: https://github.com/songquanpeng/one-api接入 bge-rerank 重排模型https://doc.tryfastgpt.ai/docs/development/custom-models/bge-rerank/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/bge-rerank/不同模型推荐配置 link推荐配置如下: +模型名 内存 显存 硬盘空间 启动命令 bge-reranker-base &gt;=4GB &gt;=4GB &gt;=8GB python app.py bge-reranker-large &gt;=8GB &gt;=8GB &gt;=8GB python app.py bge-reranker-v2-m3 &gt;=8GB &gt;=8GB &gt;=8GB python app.py 源码部署 link1. 安装环境 link Python 3.9, 3.10 CUDA 11.7 科学上网环境 2. 下载代码 link3 个模型代码分别为: +https://github.com/labring/FastGPT/tree/main/python/bge-rerank/bge-reranker-base https://github.com/labring/FastGPT/tree/main/python/bge-rerank/bge-reranker-large https://github.com/labring/FastGPT/tree/main/python/bge-rerank/bge-reranker-v2-m3 3. 安装依赖 link pip install -r requirements.txt 4. 下载模型 link3个模型的 huggingface 仓库地址如下: +https://huggingface.co/BAAI/bge-reranker-base https://huggingface.co/BAAI/bge-reranker-large https://huggingface.co/BAAI/bge-reranker-v2-m3 在对应代码目录下 clone 模型。目录结构: +bge-reranker-base/ app.py Dockerfile requirements.txt 5. 运行代码 link python app.py 启动成功后应该会显示如下地址:接入 ChatGLM2-6Bhttps://doc.tryfastgpt.ai/docs/development/custom-models/chatglm2/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/chatglm2/前言 linkFastGPT 允许你使用自己的 OpenAI API KEY 来快速调用 OpenAI 接口,目前集成了 GPT-3.5, GPT-4 和 embedding,可构建自己的知识库。但考虑到数据安全的问题,我们并不能将所有的数据都交付给云端大模型。 +那么如何在 FastGPT 上接入私有化模型呢?本文就以清华的 ChatGLM2 为例,为各位讲解如何在 FastGPT 中接入私有化模型。 +ChatGLM2-6B 简介 linkChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,具体介绍可参阅 ChatGLM2-6B 项目主页。 +warning 注意,ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。本教程只是介绍了一种用法,无权给予任何授权! +推荐配置 link依据官方数据,同样是生成 8192 长度,量化等级为 FP16 要占用 12.8GB 显存、int8 为 8.1GB 显存、int4 为 5.1GB 显存,量化后会稍微影响性能,但不多。 +因此推荐配置如下: +类型 内存 显存 硬盘空间 启动命令 fp16 &gt;=16GB &gt;=16GB &gt;=25GB python openai_api.py 16 int8 &gt;=16GB &gt;=9GB &gt;=25GB python openai_api.py 8 int4 &gt;=16GB &gt;=6GB &gt;=25GB python openai_api.接入 M3E 向量模型https://doc.tryfastgpt.ai/docs/development/custom-models/m3e/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/m3e/前言 linkFastGPT 默认使用了 openai 的 embedding 向量模型,如果你想私有部署的话,可以使用 M3E 向量模型进行替换。M3E 向量模型属于小模型,资源使用不高,CPU 也可以运行。下面教程是基于 “睡大觉” 同学提供的一个的镜像。 +部署镜像 link镜像名: stawky/m3e-large-api:latest +国内镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api:latest 端口号: 6008 环境变量: +# 设置安全凭证(即oneapi中的渠道密钥) 默认值:sk-aaabbbcccdddeeefffggghhhiiijjjkkk 也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。 接入 One API link添加一个渠道,参数如下: +测试 linkcurl 例子: +curl --location --request POST &#39;https://domain/v1/embeddings&#39; \ --header &#39;Authorization: Bearer xxxx&#39; \ --header &#39;Content-Type: application/json&#39; \ --data-raw &#39;{ &#34;model&#34;: &#34;m3e&#34;, &#34;input&#34;: [&#34;laf是什么&#34;] }&#39; Authorization 为 sk-key。model 为刚刚在 One API 填写的自定义模型。 +接入 FastGPT link修改 config.json 配置文件,在 vectorModels 中加入 M3E 模型:接入 ChatGLM2-m3e 模型https://doc.tryfastgpt.ai/docs/development/custom-models/chatglm2-m3e/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/custom-models/chatglm2-m3e/前言 linkFastGPT 默认使用了 OpenAI 的 LLM 模型和向量模型,如果想要私有化部署的话,可以使用 ChatGLM2 和 m3e-large 模型。以下是由用户@不做了睡大觉 提供的接入方法。该镜像直接集成了 M3E-Large 和 ChatGLM2-6B 模型,可以直接使用。 +部署镜像 link 镜像名: stawky/chatglm2-m3e:latest 国内镜像名: registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/chatglm2-m3e:latest 端口号: 6006 # 设置安全凭证(即oneapi中的渠道密钥) +默认值:sk-aaabbbcccdddeeefffggghhhiiijjjkkk +也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。 接入 One API link为 chatglm2 和 m3e-large 各添加一个渠道,参数如下: +这里我填入 m3e 作为向量模型,chatglm2 作为语言模型 +测试 linkcurl 例子: +curl --location --request POST &#39;https://domain/v1/embeddings&#39; \ +--header &#39;Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk&#39; \ +--header &#39;Content-Type: application/json&#39; \ +--data-raw &#39;{ +&#34;model&#34;: &#34;m3e&#34;, +&#34;input&#34;: [&#34;laf是什么&#34;] +}&#39; curl --location --request POST &#39;https://domain/v1/chat/completions&#39; \ +--header &#39;Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk&#39; \ +--header &#39;Content-Type: application/json&#39; \ +--data-raw &#39;{ +&#34;model&#34;: &#34;chatglm2&#34;, +&#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;Hello!Nginx 中转https://doc.tryfastgpt.ai/docs/development/proxy/nginx/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/proxy/nginx/登录 Sealos linkSealos +创建应用 link打开 「应用管理」,点击「新建应用」: +填写基本配置 link务必开启外网访问,复制外网访问提供的地址。 +添加配置文件 link 复制下面这段配置文件,注意 server_name 后面的内容替换成第二步的外网访问地址。 +user nginx; worker_processes auto; worker_rlimit_nofile 51200; events { worker_connections 1024; } http { resolver 8.8.8.8; proxy_ssl_server_name on; access_log off; server_names_hash_bucket_size 512; client_header_buffer_size 64k; large_client_header_buffers 4 64k; client_max_body_size 50M; proxy_connect_timeout 240s; proxy_read_timeout 240s; proxy_buffer_size 128k; proxy_buffers 4 256k; server { listen 80; server_name tgohwtdlrmer.cloud.sealos.io; # 这个地方替换成 Sealos 提供的外网地址 location ~ /openai/(.*) { proxy_pass https://api.openai.com/$1$is_args$args; proxy_set_header Host api.openai.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 如果响应是流式的 proxy_set_header Connection &#39;&#39;; proxy_http_version 1.HTTP 代理中转https://doc.tryfastgpt.ai/docs/development/proxy/http_proxy/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/proxy/http_proxy/如果你有代理工具(例如 Clash 或者 sing-box),也可以使用 HTTP 代理来访问 OpenAI。只需要添加以下两个环境变量即可: +AXIOS_PROXY_HOST= AXIOS_PROXY_PORT= 以 Clash 为例,建议指定 api.openai.com 走代理,其他请求都直连。示例配置如下: +mixed-port: 7890 allow-lan: false bind-address: &#39;*&#39; mode: rule log-level: warning dns: enable: true ipv6: false nameserver: - 8.8.8.8 - 8.8.4.4 cache-size: 400 proxies: - proxy-groups: - { name: &#39;♻️ 自动选择&#39;, type: url-test, proxies: [香港V01×1.5], url: &#39;https://api.openai.com&#39;, interval: 3600} rules: - &#39;DOMAIN-SUFFIX,api.openai.com,♻️ 自动选择&#39; - &#39;MATCH,DIRECT&#39; 然后给 FastGPT 添加两个环境变量: +AXIOS_PROXY_HOST=127.0.0.1 AXIOS_PROXY_PORT=7890Cloudflare Worker 中转https://doc.tryfastgpt.ai/docs/development/proxy/cloudflare/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/proxy/cloudflare/参考 &ldquo;不做了睡觉&rdquo; 的教程 +workers 配置文件 +const TELEGRAPH_URL = &#39;https://api.openai.com&#39;; addEventListener(&#39;fetch&#39;, (event) =&gt; { event.respondWith(handleRequest(event.request)); }); async function handleRequest(request) { // 安全校验 if (request.headers.get(&#39;auth&#39;) !== &#39;auth_code&#39;) { return new Response(&#39;UnAuthorization&#39;, { status: 403 }); } const url = new URL(request.url); url.host = TELEGRAPH_URL.replace(/^https?:\/\//, &#39;&#39;); const modifiedRequest = new Request(url.toString(), { headers: request.headers, method: request.method, body: request.body, redirect: &#39;follow&#39; }); const response = await fetch(modifiedRequest); const modifiedResponse = new Response(response.body, response); // 添加允许跨域访问的响应头 modifiedResponse.数据集https://doc.tryfastgpt.ai/docs/development/design/dataset/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/development/design/dataset/文件与数据的关系 link在 FastGPT 中,文件会通过 MongoDB 的 FS 存储,而具体的数据会通过 PostgreSQL 存储,PG 中的数据会有一列 file_id,关联对应的文件。考虑到旧版本的兼容,以及手动输入、标注数据等,我们给 file_id 增加了一些特殊的值,如下: +manual: 手动输入 mark: 手动标注的数据 注意,file_id 仅在插入数据时会写入,变更时无法修改。 +文件导入流程 link 上传文件到 MongoDB 的 FS 中,获取 file_id,此时文件标记为 unused 状态 浏览器解析文件,获取对应的文本和 chunk 给每个 chunk 打上 file_id 点击上传数据:将文件的状态改为 used,并将数据推送到 mongo training 表中等待训练 由训练线程从 mongo 中取数据,并在获取向量后插入到 pg。线上版定价https://doc.tryfastgpt.ai/docs/shopping_cart/saas/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/shopping_cart/saas/线上版价格请查看:https://cloud.tryfastgpt.ai/price商业版https://doc.tryfastgpt.ai/docs/shopping_cart/intro/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/shopping_cart/intro/简介 linkFastGPT 商业版是基于 FastGPT 开源版的增强版本,增加了一些独有的功能。只需安装一个商业版镜像,并在开源版基础上填写对应的内网地址,即可快速使用商业版。 +功能差异 link 开源版 商业版 线上版 应用管理与高级编排 ✅ ✅ ✅ 文档知识库 ✅ ✅ ✅ 外部使用 ✅ ✅ ✅ API 知识库 ✅ ✅ ✅ 最大应用数量 500 无限制 由付费套餐决定 最大知识库数量(单个知识库内容无限制) 30 无限制 由付费套餐决定 自定义版权信息 ❌ ✅ 设计中 多租户与支付 ❌ ✅ ✅ 团队空间 &amp; 权限 ❌ ✅ ✅ 应用发布安全配置 ❌ ✅ ✅ 内容审核 ❌ ✅ ✅ web站点同步 ❌ ✅ ✅ 主流文档库接入(目前支持:语雀、飞书) ❌ ✅ ✅ 增强训练模式 ❌ ✅ ✅ 第三方应用快速接入(飞书、公众号) ❌ ✅ ✅ 管理后台 ❌ ✅ 不需要 SSO 登录(可自定义,也可使用内置:Github、公众号、钉钉、谷歌等) ❌ ✅ 不需要 图片知识库 ❌ 设计中 设计中 对话日志运营分析 ❌ 设计中 设计中 完整商业授权 ❌ ✅ ✅ 商业版软件价格 linkFastGPT 商业版软件根据不同的部署方式,分为 3 类收费模式。下面列举各种部署方式一些常规内容,如仍有问题,可联系咨询开源协议https://doc.tryfastgpt.ai/docs/agreement/open-source/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/agreement/open-source/FastGPT 项目在 Apache License 2.0 许可下开源,同时包含以下附加条件: +FastGPT 允许被用于商业化,例如作为其他应用的“后端即服务”使用,或者作为应用开发平台提供给企业。然而,当满足以下条件时,必须联系作者获得商业许可: +多租户 SaaS 服务:除非获得 FastGPT 的明确书面授权,否则不得使用 tryfastgpt.ai 的源码来运营与 tryfastgpt.ai 服务类似的多租户 SaaS 服务。 LOGO 及版权信息:在使用 FastGPT 的过程中,不得移除或修改 FastGPT 控制台内的 LOGO 或版权信息。 请通过电子邮件 yujinlong@sealos.io 联系我们咨询许可事宜。 +作为贡献者,你必须同意将你贡献的代码用于以下用途: +生产者有权将开源协议调整为更严格或更宽松的形式。 可用于商业目的,例如 FastGPT 的云服务。 除此之外,所有其他权利和限制均遵循 Apache License 2.0。如果你需要更多详细信息,可以参考 Apache License 2.0 的完整版本。本产品的交互设计受到外观专利保护。© 2023 Sealos.服务协议https://doc.tryfastgpt.ai/docs/agreement/terms/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/agreement/terms/最后更新时间:2024年3月3日 +FastGPT 服务协议是您与珠海环界云计算有限公司(以下简称“我们”或“本公司”)之间就FastGPT云服务(以下简称“本服务”)的使用等相关事项所订立的协议。请您仔细阅读并充分理解本协议各条款,特别是免除或者限制我们责任的条款、对您权益的限制条款、争议解决和法律适用条款等。如您不同意本协议任一内容,请勿注册或使用本服务。 +第1条 服务内容 +我们将向您提供存储、计算、网络传输等基于互联网的信息技术服务。 我们将不定期向您通过站内信、电子邮件或短信等形式向您推送最新的动态。 我们将为您提供相关技术支持和客户服务,帮助您更好地使用本服务。 我们将为您提供稳定的在线服务,保证每月服务可用性不低于99%。 第2条 用户注册与账户管理 +您在使用本服务前需要注册一个账户。您保证在注册时提供的信息真实、准确、完整,并及时更新。 您应妥善保管账户名和密码,对由此产生的全部行为负责。如发现他人使用您的账户,请及时修改账号密码或与我们进行联系。 我们有权对您的账户进行审查,如发现您的账户存在异常或违法情况,我们有权暂停或终止向您提供服务。 第3条 使用规则 +您不得利用本服务从事任何违法活动或侵犯他人合法权益的行为,包括但不限于侵犯知识产权、泄露他人商业机密等。 您不得通过任何手段恶意注册账户,包括但不限于以牟利、炒作、套现等目的。 您不得利用本服务传播任何违法、有害、恶意软件等信息。 您应遵守相关法律法规及本协议的规定,对在本服务中发布的信息及使用本服务所产生的结果承担全部责任。 我们禁止使用我们对接的模型服务生成可能对个人或社会造成伤害的内容。保障平台的安全性,是长期稳定运营的关键。如发现任何利用平台接入模型能力进行违规内容生成和使用,将立即封号,账号余额不退。违规内容包括但不限于: 剥削和虐待 禁止描述、展示或宣扬儿童性剥削或性虐待的内容,无论法律是否禁止。这包括涉及儿童或使儿童色情的内容。 禁止描述或用于培养儿童的内容。修饰是成年人以剥削,特别是性剥削为目的与儿童建立关系的行为。这包括以性剥削、贩运或其他形式剥削为目的与儿童交流。 未经同意的私密内容 服务禁止描述、提供或宣传未经同意的亲密活动的内容。 禁止描述、提供特征或宣传或用于招揽商业性活动和性服务的内容。这包括鼓励和协调真正的性活动。 禁止描述或用于人口贩运目的的内容。这包括招募人员、便利交通、支付和助长对人的剥削,如强迫劳动、家庭奴役、役、强迫婚姻和强迫医疗程序。 自杀和自残,禁止描述、赞美、支持、促进、美化、鼓励和/或指导个人自残或自杀的内容。 暴力内容和行为 禁止描述、展示或宣扬血腥暴力或血腥的内容。 禁止描绘恐怖主义行为的内容;赞扬或支持恐怖组织、恐怖行为者或暴力恐怖意识形态;鼓励恐怖活动;向恐怖组织或恐怖事业提供援助;或协助恐怖组织招募成员。 禁止通过暴力威胁或煽动来鼓吹或宣扬对他人的暴力行为的内容。 仇恨言论和歧视 禁止基于实际或感知的种族、民族、国籍、性别、性别认同、性取向、宗教信仰、年龄、残疾状况、种姓或与系统性偏见或边缘化相关的任何其他特征等特征攻击、诋毁、恐吓、降级、针对或排斥个人或群体的内容。 禁止针对个人或群体进行威胁、恐吓、侮辱、贬低或贬低的语言或图像、宣扬身体伤害或其他虐待行为(如跟踪)的内容。 禁止故意欺骗并可能对公共利益产生不利影响的内容,包括与健康、安全、选举诚信或公民参与相关的欺骗性或不真实内容。 直接支持非法主动攻击或造成技术危害的恶意软件活动的内容,例如提供恶意可执行文件、组织拒绝服务攻击或管理命令和控制服务器。 第4条 费用及支付 +您同意支付与本服务相关的费用,具体费用标准以我们公布的价格为准。 我们可能会根据运营成本和市场情况调整费用标准。最新价格以您付款时刻的价格为准。 第5条 服务免责与责任限制 +本服务按照现有技术和条件所能达到的水平提供。我们不能保证本服务完全无故障或满足您的所有需求。 对于因您自身误操作导致的数据丢失、损坏等情况,我们不承担责任。 由于生成式 AI 的特性,其在不同国家的管控措施也会有所不同,请所有使用者务必遵守所在地的相关法律。如果您以任何违反 FastGPT 可接受使用政策的方式使用,包括但不限于法律、法规、政府命令或法令禁止的任何用途,或任何侵犯他人权利的使用;由使用者自行承担。我们对由客户使用产生的问题概不负责。下面是各国对生成式AI的管控条例的链接: 中国生成式人工智能服务管理办法(征求意见稿) +第6条 知识产权 +我们对本服务及相关软件、技术、文档等拥有全部知识产权,除非经我们明确许可,您不得进行复制、分发、出租、反向工程等行为。 您在使用本服务过程中产生的所有数据和内容(包括但不限于文件、图片等)的知识产权归您所有。我们不会对您的数据和内容进行使用、复制、修改等行为。 在线服务中其他用户的数据和内容的知识产权归原用户所有,未经原用户许可,您不得进行使用、复制、修改等行为。 第7条 其他条款 +如本协议中部分条款因违反法律法规而被视为无效,不影响其他条款的效力。 本公司保留对本协议及隐私政策的最终解释权。如您对本协议或隐私政策有任何疑问,请联系我们:yujinlong@sealos.io。隐私政策https://doc.tryfastgpt.ai/docs/agreement/privacy/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/agreement/privacy/最后更新时间:2024年3月3日 +我们非常重视您的隐私保护,在您使用FastGPT云服务时(以下简称为“本服务”),我们将按照以下政策收集、使用、披露和保护您的个人信息。请您仔细阅读并充分理解本隐私政策。 +我们可能需要收集的信息 +在您注册或使用本服务时,我们可能收集您的姓名、电话号码、电子邮件地址、地址等个人信息。 在您使用本服务过程中产生的信息,如操作日志、访问IP地址、设备型号等。 我们可能会通过 Cookies 或其他技术收集和存储您访问本服务的相关信息,以便为您提供更好的用户体验。 我们如何使用收集的信息? +我们会根据法律法规规定以及与用户之间的约定来处理用户的个人信息。 我们可能会将收集到的信息用于改进服务质量、开发新产品或功能等目的。 我们可能会将收集到的信息用于向您推送与本服务相关的通知或广告。 信息披露 +我们不会向任何第三方披露您的个人信息,除非: +您事先同意; 法律法规要求; 为维护我们或其他用户的合法权益。 我们可能与关联公司、合作伙伴分享您的个人信息,但我们会采取相应的保密措施,确保信息安全。 +信息保护 +我们采取各种安全措施,包括加密、访问控制等技术手段,以保护您的个人信息免受未经授权的访问、使用或泄露。 我们会定期对收集、存储和处理的个人信息进行安全评估,以确保个人信息安全。 在发生个人信息泄露等安全事件时,我们会立即启动应急预案,并在法律法规规定的范围内向您及时告知。 我们不会使用您的数据进行额外的备份存储或用于模型训练。 您在本服务进行的数据删除均为物理删除,不可恢复。如有非物理删除的操作,我们会在服务中特别指出。 用户权利 +您有权随时查阅、更正或删除您的个人信息。 您有权拒绝我们收集您的个人信息,但这可能导致您无法使用本服务的部分功能。 您有权要求我们停止处理您的个人信息,但这可能导致您无法继续使用本服务。 隐私政策更新 +我们可能会对本隐私政策进行修改。如本隐私政策发生变更,我们将在本服务页面上发布修改后的隐私政策。如您继续使用本服务,则视为同意修改后的隐私政策。 我们鼓励您定期查阅本隐私政策,以了解我们如何保护您的个人信息。 未成年人保护 +我们非常重视对未成年人个人信息的保护,如您为未成年人,请在监护人指导下使用本服务,并请监护人帮助您在使用本服务过程中正确处理个人信息。 +跨境数据传输 +由于我们的服务器可能位于不同国家或地区,您同意我们可能需要将您的个人信息传输至其他国家或地区,并在该等国家或地区存储和处理以向您提供服务。我们会采取适当措施确保跨境传输的数据仍然受到适当保护。 +联系我们 +如您对本隐私政策有任何疑问、建议或投诉,请通过以下方式与我们联系:yujinlong@sealos.io。 我们将尽快回复并解决您提出的问题。加入社区https://doc.tryfastgpt.ai/docs/community/Mon, 01 Jan 0001 00:00:00 +0000https://doc.tryfastgpt.ai/docs/community/FastGPT 是一个由用户和贡献者参与推动的开源项目,如果您对产品使用存在疑问和建议,可尝试以下方式寻求支持。我们的团队与社区会竭尽所能为您提供帮助。 +📱 扫码加入社区微信交流群👇 +🐞 请将任何 FastGPT 的 Bug、问题和需求提交到 GitHub Issue。 \ No newline at end of file diff --git a/js/bootstrap.1d45dfc5d2726b7dab81f4f79c8683c5c08ec8f539f18dcb6724d690f825bbaf320353147818f1376885a08a116e74b3.js b/js/bootstrap.1d45dfc5d2726b7dab81f4f79c8683c5c08ec8f539f18dcb6724d690f825bbaf320353147818f1376885a08a116e74b3.js new file mode 100644 index 000000000000..3217d5c9133f --- /dev/null +++ b/js/bootstrap.1d45dfc5d2726b7dab81f4f79c8683c5c08ec8f539f18dcb6724d690f825bbaf320353147818f1376885a08a116e74b3.js @@ -0,0 +1 @@ +(()=>{var g=new Map,O={set(e,t,r){g.has(e)||g.set(e,new Map);let n=g.get(e);if(!n.has(t)&&n.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`);return}n.set(t,r)},get(e,t){return g.has(e)&&g.get(e).get(t)||null},remove(e,t){if(!g.has(e))return;let r=g.get(e);r.delete(t),r.size===0&&g.delete(e)}};var S="transitionend",T=e=>(e&&window.CSS&&window.CSS.escape&&(e=e.replace(/#([^\s"#']+)/g,(t,r)=>`#${CSS.escape(r)}`)),e),F=e=>e==null?`${e}`:Object.prototype.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase();var pt=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:r}=window.getComputedStyle(e),n=Number.parseFloat(t),s=Number.parseFloat(r);return!n&&!s?0:(t=t.split(",")[0],r=r.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(r))*1e3)},Et=e=>{e.dispatchEvent(new Event(S))},m=e=>!e||typeof e!="object"?!1:(typeof e.jquery!="undefined"&&(e=e[0]),typeof e.nodeType!="undefined"),w=e=>m(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(T(e)):null,U=e=>{if(!m(e)||e.getClientRects().length===0)return!1;let t=getComputedStyle(e).getPropertyValue("visibility")==="visible",r=e.closest("details:not([open])");if(!r)return t;if(r!==e){let n=e.closest("summary");if(n&&n.parentNode!==r||n===null)return!1}return t},y=e=>!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled")?!0:typeof e.disabled!="undefined"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false";var C=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,D=[],ht=e=>{document.readyState==="loading"?(D.length||document.addEventListener("DOMContentLoaded",()=>{for(let t of D)t()}),D.push(e)):e()};var Q=e=>{ht(()=>{let t=C();if(t){let r=e.NAME,n=t.fn[r];t.fn[r]=e.jQueryInterface,t.fn[r].Constructor=e,t.fn[r].noConflict=()=>(t.fn[r]=n,e.jQueryInterface)}})},j=(e,t=[],r=e)=>typeof e=="function"?e(...t):r,q=(e,t,r=!0)=>{if(!r){j(e);return}let n=5,s=pt(t)+n,i=!1,o=({target:a})=>{a===t&&(i=!0,t.removeEventListener(S,o),j(e))};t.addEventListener(S,o),setTimeout(()=>{i||Et(t)},s)},G=(e,t,r,n)=>{let s=e.length,i=e.indexOf(t);return i===-1?!r&&n?e[s-1]:e[0]:(i+=r?1:-1,n&&(i=(i+s)%s),e[Math.max(0,Math.min(i,s-1))])};var _t=/[^.]*(?=\..*)\.|.*/,bt=/\..*/,mt=/::\d+$/,v={},z=1,J={mouseenter:"mouseover",mouseleave:"mouseout"},At=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function X(e,t){return t&&`${t}::${z++}`||e.uidEvent||z++}function Z(e){let t=X(e);return e.uidEvent=t,v[t]=v[t]||{},v[t]}function yt(e,t){return function r(n){return R(n,{delegateTarget:e}),r.oneOff&&L.off(e,n.type,t),t.apply(e,[n])}}function Ot(e,t,r){return function n(s){let i=e.querySelectorAll(t);for(let{target:o}=s;o&&o!==this;o=o.parentNode)for(let a of i)if(a===o)return R(s,{delegateTarget:o}),n.oneOff&&L.off(e,s.type,t,r),r.apply(o,[s])}}function tt(e,t,r=null){return Object.values(e).find(n=>n.callable===t&&n.delegationSelector===r)}function et(e,t,r){let n=typeof t=="string",s=n?r:t||r,i=rt(e);return At.has(i)||(i=e),[n,s,i]}function B(e,t,r,n,s){if(typeof t!="string"||!e)return;let[i,o,a]=et(t,r,n);t in J&&(o=(gt=>function(b){if(!b.relatedTarget||b.relatedTarget!==b.delegateTarget&&!b.delegateTarget.contains(b.relatedTarget))return gt.call(this,b)})(o));let u=Z(e),d=u[a]||(u[a]={}),c=tt(d,o,i?r:null);if(c){c.oneOff=c.oneOff&&s;return}let _=X(o,t.replace(_t,"")),f=i?Ot(e,r,o):yt(e,o);f.delegationSelector=i?r:null,f.callable=o,f.oneOff=s,f.uidEvent=_,d[_]=f,e.addEventListener(a,f,i)}function I(e,t,r,n,s){let i=tt(t[r],n,s);i&&(e.removeEventListener(r,i,!!s),delete t[r][i.uidEvent])}function Nt(e,t,r,n){let s=t[r]||{};for(let[i,o]of Object.entries(s))i.includes(n)&&I(e,t,r,o.callable,o.delegationSelector)}function rt(e){return e=e.replace(bt,""),J[e]||e}var L={on(e,t,r,n){B(e,t,r,n,!1)},one(e,t,r,n){B(e,t,r,n,!0)},off(e,t,r,n){if(typeof t!="string"||!e)return;let[s,i,o]=et(t,r,n),a=o!==t,u=Z(e),d=u[o]||{},c=t.startsWith(".");if(typeof i!="undefined"){if(!Object.keys(d).length)return;I(e,u,o,i,s?r:null);return}if(c)for(let _ of Object.keys(u))Nt(e,u,_,t.slice(1));for(let[_,f]of Object.entries(d)){let Y=_.replace(mt,"");(!a||t.includes(Y))&&I(e,u,o,f.callable,f.delegationSelector)}},trigger(e,t,r){if(typeof t!="string"||!e)return null;let n=C(),s=rt(t),i=t!==s,o=null,a=!0,u=!0,d=!1;i&&n&&(o=n.Event(t,r),n(e).trigger(o),a=!o.isPropagationStopped(),u=!o.isImmediatePropagationStopped(),d=o.isDefaultPrevented());let c=R(new Event(t,{bubbles:a,cancelable:!0}),r);return d&&c.preventDefault(),u&&e.dispatchEvent(c),c.defaultPrevented&&o&&o.preventDefault(),c}};function R(e,t={}){for(let[r,n]of Object.entries(t))try{e[r]=n}catch(s){Object.defineProperty(e,r,{configurable:!0,get(){return n}})}return e}var l=L;function nt(e){if(e==="true")return!0;if(e==="false")return!1;if(e===Number(e).toString())return Number(e);if(e===""||e==="null")return null;if(typeof e!="string")return e;try{return JSON.parse(decodeURIComponent(e))}catch(t){return e}}function x(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}var Dt={setDataAttribute(e,t,r){e.setAttribute(`data-bs-${x(t)}`,r)},removeDataAttribute(e,t){e.removeAttribute(`data-bs-${x(t)}`)},getDataAttributes(e){if(!e)return{};let t={},r=Object.keys(e.dataset).filter(n=>n.startsWith("bs")&&!n.startsWith("bsConfig"));for(let n of r){let s=n.replace(/^bs/,"");s=s.charAt(0).toLowerCase()+s.slice(1,s.length),t[s]=nt(e.dataset[n])}return t},getDataAttribute(e,t){return nt(e.getAttribute(`data-bs-${x(t)}`))}},M=Dt;var $=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,r){let n=m(r)?M.getDataAttribute(r,"config"):{};return{...this.constructor.Default,...typeof n=="object"?n:{},...m(r)?M.getDataAttributes(r):{},...typeof t=="object"?t:{}}}_typeCheckConfig(t,r=this.constructor.DefaultType){for(let[n,s]of Object.entries(r)){let i=t[n],o=m(i)?"element":F(i);if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}}},st=$;var St="5.3.2",P=class extends st{constructor(t,r){super(),t=w(t),t&&(this._element=t,this._config=this._getConfig(r),O.set(this._element,this.constructor.DATA_KEY,this))}dispose(){O.remove(this._element,this.constructor.DATA_KEY),l.off(this._element,this.constructor.EVENT_KEY);for(let t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,r,n=!0){q(t,r,n)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return O.get(w(t),this.DATA_KEY)}static getOrCreateInstance(t,r={}){return this.getInstance(t)||new this(t,typeof r=="object"?r:null)}static get VERSION(){return St}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}},ot=P;var k=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let r=e.getAttribute("href");if(!r||!r.includes("#")&&!r.startsWith("."))return null;r.includes("#")&&!r.startsWith("#")&&(r=`#${r.split("#")[1]}`),t=r&&r!=="#"?T(r.trim()):null}return t},N={find(e,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,e))},findOne(e,t=document.documentElement){return Element.prototype.querySelector.call(t,e)},children(e,t){return[].concat(...e.children).filter(r=>r.matches(t))},parents(e,t){let r=[],n=e.parentNode.closest(t);for(;n;)r.push(n),n=n.parentNode.closest(t);return r},prev(e,t){let r=e.previousElementSibling;for(;r;){if(r.matches(t))return[r];r=r.previousElementSibling}return[]},next(e,t){let r=e.nextElementSibling;for(;r;){if(r.matches(t))return[r];r=r.nextElementSibling}return[]},focusableChildren(e){let t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(r=>`${r}:not([tabindex^="-"])`).join(",");return this.find(t,e).filter(r=>!y(r)&&U(r))},getSelectorFromElement(e){let t=k(e);return t&&N.findOne(t)?t:null},getElementFromSelector(e){let t=k(e);return t?N.findOne(t):null},getMultipleElementsFromSelector(e){let t=k(e);return t?N.find(t):[]}},p=N;var Tt="tab",wt="bs.tab",h=`.${wt}`,Ct=`hide${h}`,vt=`hidden${h}`,It=`show${h}`,Lt=`shown${h}`,Rt=`click${h}`,xt=`keydown${h}`,Mt=`load${h}`,$t="ArrowLeft",it="ArrowRight",Pt="ArrowUp",at="ArrowDown",K="Home",ut="End",E="active",ct="fade",H="show",kt="dropdown",lt=".dropdown-toggle",Kt=".dropdown-menu",V=`:not(${lt})`,Ht='.list-group, .nav, [role="tablist"]',Vt=".nav-item, .list-group-item",Wt=`.nav-link${V}, .list-group-item${V}, [role="tab"]${V}`,ft='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',W=`${Wt}, ${ft}`,Yt=`.${E}[data-bs-toggle="tab"], .${E}[data-bs-toggle="pill"], .${E}[data-bs-toggle="list"]`,A=class e extends ot{constructor(t){super(t),this._parent=this._element.closest(Ht),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),l.on(this._element,xt,r=>this._keydown(r)))}static get NAME(){return Tt}show(){let t=this._element;if(this._elemIsActive(t))return;let r=this._getActiveElem(),n=r?l.trigger(r,Ct,{relatedTarget:t}):null;l.trigger(t,It,{relatedTarget:r}).defaultPrevented||n&&n.defaultPrevented||(this._deactivate(r,t),this._activate(t,r))}_activate(t,r){if(!t)return;t.classList.add(E),this._activate(p.getElementFromSelector(t));let n=()=>{if(t.getAttribute("role")!=="tab"){t.classList.add(H);return}t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),l.trigger(t,Lt,{relatedTarget:r})};this._queueCallback(n,t,t.classList.contains(ct))}_deactivate(t,r){if(!t)return;t.classList.remove(E),t.blur(),this._deactivate(p.getElementFromSelector(t));let n=()=>{if(t.getAttribute("role")!=="tab"){t.classList.remove(H);return}t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),l.trigger(t,vt,{relatedTarget:r})};this._queueCallback(n,t,t.classList.contains(ct))}_keydown(t){if(![$t,it,Pt,at,K,ut].includes(t.key))return;t.stopPropagation(),t.preventDefault();let r=this._getChildren().filter(s=>!y(s)),n;if([K,ut].includes(t.key))n=r[t.key===K?0:r.length-1];else{let s=[it,at].includes(t.key);n=G(r,t.target,s,!0)}n&&(n.focus({preventScroll:!0}),e.getOrCreateInstance(n).show())}_getChildren(){return p.find(W,this._parent)}_getActiveElem(){return this._getChildren().find(t=>this._elemIsActive(t))||null}_setInitialAttributes(t,r){this._setAttributeIfNotExists(t,"role","tablist");for(let n of r)this._setInitialAttributesOnChild(n)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);let r=this._elemIsActive(t),n=this._getOuterElement(t);t.setAttribute("aria-selected",r),n!==t&&this._setAttributeIfNotExists(n,"role","presentation"),r||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){let r=p.getElementFromSelector(t);r&&(this._setAttributeIfNotExists(r,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(r,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,r){let n=this._getOuterElement(t);if(!n.classList.contains(kt))return;let s=(i,o)=>{let a=p.findOne(i,n);a&&a.classList.toggle(o,r)};s(lt,E),s(Kt,H),n.setAttribute("aria-expanded",r)}_setAttributeIfNotExists(t,r,n){t.hasAttribute(r)||t.setAttribute(r,n)}_elemIsActive(t){return t.classList.contains(E)}_getInnerElement(t){return t.matches(W)?t:p.findOne(W,t)}_getOuterElement(t){return t.closest(Vt)||t}static jQueryInterface(t){return this.each(function(){let r=e.getOrCreateInstance(this);if(typeof t=="string"){if(r[t]===void 0||t.startsWith("_")||t==="constructor")throw new TypeError(`No method named "${t}"`);r[t]()}})}};l.on(document,Rt,ft,function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),!y(this)&&A.getOrCreateInstance(this).show()});l.on(window,Mt,()=>{for(let e of p.find(Yt))A.getOrCreateInstance(e)});Q(A);var dt=A;var le={Tab:dt};})(); diff --git a/js/bundle.min.d26bada42aacabf0a605636aba0bce9543bb24ed6b0f215dfa05077278d571a26b3e2cea8da2843e8256ffc49825559c.js b/js/bundle.min.d26bada42aacabf0a605636aba0bce9543bb24ed6b0f215dfa05077278d571a26b3e2cea8da2843e8256ffc49825559c.js new file mode 100644 index 000000000000..2784dac4bd48 --- /dev/null +++ b/js/bundle.min.d26bada42aacabf0a605636aba0bce9543bb24ed6b0f215dfa05077278d571a26b3e2cea8da2843e8256ffc49825559c.js @@ -0,0 +1 @@ +function windowScroll(){const e=document.getElementById("topnav");e!=null&&(document.body.scrollTop>=50||document.documentElement.scrollTop>=50?e.classList.add("nav-sticky"):e.classList.remove("nav-sticky"))}window.addEventListener("scroll",e=>{e.preventDefault(),windowScroll()});function toggleMenu(){document.getElementById("isToggle").classList.toggle("open");var e=document.getElementById("navigation");e.style.display==="block"?e.style.display="none":e.style.display="block"} \ No newline at end of file diff --git a/js/image-compare.min.b181189e797ddef290813acdab2d11c521bedcf9d92918ad9a52a1670feb560b009b104b3d4498032b08821690b5ac32.js b/js/image-compare.min.b181189e797ddef290813acdab2d11c521bedcf9d92918ad9a52a1670feb560b009b104b3d4498032b08821690b5ac32.js new file mode 100644 index 000000000000..5dd1382889a4 --- /dev/null +++ b/js/image-compare.min.b181189e797ddef290813acdab2d11c521bedcf9d92918ad9a52a1670feb560b009b104b3d4498032b08821690b5ac32.js @@ -0,0 +1,54 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("ImageCompare",[],t):"object"==typeof exports?exports.ImageCompare=t():e.ImageCompare=t()}(self,function(){return function(){var t,s={9662:function(e,t,n){var s=n(614),o=n(6330),i=TypeError;e.exports=function(e){if(s(e))return e;throw i(o(e)+" is not a function")}},6077:function(e,t,n){var s=n(614),o=String,i=TypeError;e.exports=function(e){if("object"==typeof e||s(e))return e;throw i("Can't set "+o(e)+" as a prototype")}},1223:function(e,t,n){var i=n(5112),a=n(30),r=n(3070).f,s=i("unscopables"),o=Array.prototype;null==o[s]&&r(o,s,{configurable:!0,value:a(null)}),e.exports=function(e){o[s][e]=!0}},9670:function(e,t,n){var s=n(111),o=String,i=TypeError;e.exports=function(e){if(s(e))return e;throw i(o(e)+" is not an object")}},8533:function(e,t,n){"use strict";var s=n(2092).forEach,o=n(9341)("forEach");e.exports=o?[].forEach:function(e){return s(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var i=n(9974),a=n(6916),r=n(7908),c=n(3411),l=n(7659),d=n(4411),u=n(6244),s=n(6135),h=n(8554),m=n(1246),o=Array;e.exports=function(e){var t,n,g,v,b,y,_,O,p=r(e),x=d(this),w=arguments.length,f=w>1?arguments[1]:void 0,j=void 0!==f;if(j&&(f=i(f,w>2?arguments[2]:void 0)),b=m(p),t=0,!b||this===o&&l(b))for(g=u(p),n=x?new this(g):o(g);g>t;t++)v=j?f(p[t],t):p[t],s(n,t,v);else for(O=(_=h(p,b)).next,n=x?new this:[];!(y=a(O,_)).done;t++)v=j?c(_,f,[y.value,t],!0):y.value,s(n,t,v);return n.length=t,n}},1318:function(e,t,n){var o=n(5656),i=n(1400),a=n(6244),s=function(e){return function(t,n,s){var d,c=o(t),l=a(c),r=i(s,l);if(e&&n!=n){for(;l>r;)if((d=c[r++])!=d)return!0}else for(;l>r;r++)if((e||r in c)&&c[r]===n)return e||r||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var i=n(9974),a=n(1702),r=n(8361),c=n(7908),l=n(6244),d=n(5417),o=a([].push),s=function(e){var t=1==e,a=2==e,u=3==e,n=4==e,s=6==e,h=7==e,m=5==e||s;return function(f,p,g,v){for(var j,_,O=c(f),w=r(O),E=i(p,g),x=l(w),b=0,C=v||d,y=t?C(f,x):a||h?C(f,0):void 0;x>b;b++)if((m||b in w)&&(_=E(j=w[b],b,O),e))if(t)y[b]=_;else if(_)switch(e){case 3:return!0;case 5:return j;case 6:return b;case 2:o(y,j)}else switch(e){case 4:return!1;case 7:o(y,j)}return s?-1:u||n?n:y}};e.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6),filterReject:s(7)}},1194:function(e,t,n){var s=n(7293),o=n(5112),i=n(7392),a=o("species");e.exports=function(e){return i>=51||!s(function(){var t=[];return(t.constructor={})[a]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var s=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&s(function(){n.call(null,t||function(){return 1},1)})}},1589:function(e,t,n){var s=n(1400),o=n(6244),i=n(6135),a=Array,r=Math.max;e.exports=function(e,t,n){for(var l=o(e),c=s(t,l),h=s(void 0===n?l:n,l),d=a(r(h-c,0)),u=0;c9007199254740991)throw t("Maximum allowed index exceeded");return e}},8324:function(e){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},8509:function(e,t,n){var s=n(317)("span").classList,o=s&&s.constructor&&s.constructor.prototype;e.exports=o===Object.prototype?void 0:o},8113:function(e,t,n){var s=n(5005);e.exports=s("navigator","userAgent")||""},7392:function(e,t,n){var s,o,a=n(7854),i=n(8113),r=a.process,c=a.Deno,l=r&&r.versions||c&&c.version,d=l&&l.v8;d&&(o=(s=d.split("."))[0]>0&&s[0]<4?1:+(s[0]+s[1])),!o&&i&&(!(s=i.match(/Edge\/(\d+)/))||s[1]>=74)&&(s=i.match(/Chrome\/(\d+)/))&&(o=+s[1]),e.exports=o},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var s=n(7854),o=n(1236).f,i=n(8880),a=n(8052),r=n(3072),c=n(9920),l=n(4705);e.exports=function(e,t){var n,d,u,h,f,m=e.target,p=e.global,g=e.stat;if(h=p?s:g?s[m]||r(m,{}):(s[m]||{}).prototype)for(n in t){if(u=t[n],d=e.dontCallGetSet?(f=o(h,n))&&f.value:h[n],!l(p?n:m+(g?".":"#")+n,e.forced)&&void 0!==d){if(typeof u==typeof d)continue;c(u,d)}(e.sham||d&&d.sham)&&i(u,"sham",!0),a(h,n,u,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch{return!0}}},2104:function(e,t,n){var a=n(4374),s=Function.prototype,o=s.apply,i=s.call;e.exports="object"==typeof Reflect&&Reflect.apply||(a?i.bind(o):function(){return i.apply(o,arguments)})},9974:function(e,t,n){var s=n(1702),o=n(9662),i=n(4374),a=s(s.bind);e.exports=function(e,t){return o(e),void 0===t?e:i?a(e,t):function(){return e.apply(t,arguments)}}},4374:function(e,t,n){var s=n(7293);e.exports=!s(function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")})},6916:function(e,t,n){var o=n(4374),s=Function.prototype.call;e.exports=o?s.bind(s):function(){return s.apply(s,arguments)}},6530:function(e,t,n){var s=n(9781),a=n(2597),i=Function.prototype,r=s&&Object.getOwnPropertyDescriptor,o=a(i,"name"),c=o&&"something"===function(){}.name,l=o&&(!s||s&&r(i,"name").configurable);e.exports={EXISTS:o,PROPER:c,CONFIGURABLE:l}},1702:function(e,t,n){var o=n(4374),i=Function.prototype,a=i.bind,s=i.call,r=o&&a.bind(s,s);e.exports=o?function(e){return e&&r(e)}:function(e){return e&&function(){return s.apply(e,arguments)}}},5005:function(e,t,n){var s=n(7854),o=n(614),i=function(e){return o(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(s[e]):s[e]&&s[e][t]}},1246:function(e,t,n){var o=n(648),s=n(8173),i=n(7497),a=n(5112)("iterator");e.exports=function(e){if(e!=null)return s(e,a)||s(e,"@@iterator")||i[o(e)]}},8554:function(e,t,n){var s=n(6916),o=n(9662),i=n(9670),a=n(6330),r=n(1246),c=TypeError;e.exports=function(e,t){var n=arguments.length<2?r(e):t;if(o(n))return i(s(n,e));throw c(a(e)+" is not iterable")}},8173:function(e,t,n){var s=n(9662);e.exports=function(e,t){var n=e[t];return n==null?void 0:s(n)}},7854:function(e,t,n){var s=function(e){return e&&e.Math==Math&&e};e.exports=s("object"==typeof globalThis&&globalThis)||s("object"==typeof window&&window)||s("object"==typeof self&&self)||s("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},2597:function(e,t,n){var s=n(1702),o=n(7908),i=s({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return i(o(e),t)}},3501:function(e){e.exports={}},490:function(e,t,n){var s=n(5005);e.exports=s("document","documentElement")},4664:function(e,t,n){var s=n(9781),o=n(7293),i=n(317);e.exports=!s&&!o(function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a})},8361:function(e,t,n){var o=n(1702),i=n(7293),a=n(4326),s=Object,r=o("".split);e.exports=i(function(){return!s("z").propertyIsEnumerable(0)})?function(e){return"String"==a(e)?r(e,""):s(e)}:s},2788:function(e,t,n){var o=n(1702),i=n(614),s=n(5465),a=o(Function.toString);i(s.inspectSource)||(s.inspectSource=function(e){return a(e)}),e.exports=s.inspectSource},9909:function(e,t,n){var s,i,a,r,w=n(8536),m=n(7854),c=n(1702),v=n(111),b=n(8880),u=n(2597),l=n(5465),p=n(6200),g=n(3501),h="Object already initialized",d=m.TypeError,j=m.WeakMap;if(w||l.state){var o=l.state||(l.state=new j),y=c(o.get),f=c(o.has),_=c(o.set);a=function(e,t){if(f(o,e))throw new d(h);return t.facade=e,_(o,e,t),t},i=function(e){return y(o,e)||{}},r=function(e){return f(o,e)}}else s=p("state"),g[s]=!0,a=function(e,t){if(u(e,s))throw new d(h);return t.facade=e,b(e,s,t),t},i=function(e){return u(e,s)?e[s]:{}},r=function(e){return u(e,s)};e.exports={set:a,get:i,has:r,enforce:function(e){return r(e)?i(e):a(e,{})},getterFor:function(e){return function(t){var n;if(!v(t)||(n=i(t)).type!==e)throw d("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var s=n(5112),o=n(7497),i=s("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||a[i]===e)}},3157:function(e,t,n){var s=n(4326);e.exports=Array.isArray||function(e){return"Array"==s(e)}},614:function(e){e.exports=function(e){return"function"==typeof e}},4411:function(e,t,n){var h=n(1702),g=n(7293),r=n(614),l=n(648),d=n(5005),u=n(2788),i=function(){},m=[],a=d("Reflect","construct"),o=/^\s*(?:class|function)\b/,f=h(o.exec),p=!o.exec(i),s=function(e){if(!r(e))return!1;try{return a(i,m,e),!0}catch{return!1}},c=function(e){if(!r(e))return!1;switch(l(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return p||!!f(o,u(e))}catch{return!0}};c.sham=!0,e.exports=!a||g(function(){var e;return s(s.call)||!s(Object)||!s(function(){e=!0})||e})?c:s},4705:function(e,t,n){var o=n(7293),i=n(614),a=/#|\.prototype\./,s=function(e,t){var n=c[r(e)];return n==d||n!=l&&(i(t)?o(t):!!t)},r=s.normalize=function(e){return String(e).replace(a,".").toLowerCase()},c=s.data={},l=s.NATIVE="N",d=s.POLYFILL="P";e.exports=s},111:function(e,t,n){var s=n(614);e.exports=function(e){return"object"==typeof e?null!==e:s(e)}},1913:function(e){e.exports=!1},2190:function(e,t,n){var s=n(5005),o=n(614),i=n(7976),a=n(3307),r=Object;e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=s("Symbol");return o(t)&&i(t.prototype,r(e))}},9212:function(e,t,n){var o=n(6916),s=n(9670),i=n(8173);e.exports=function(e,t,n){var a,r;s(e);try{if(!(a=i(e,"return"))){if("throw"===t)throw n;return n}a=o(a,e)}catch(e){r=!0,a=e}if("throw"===t)throw n;if(r)throw a;return s(a),n}},3383:function(e,t,n){"use strict";var s,i,a,l=n(7293),d=n(614),u=n(30),r=n(9518),h=n(8052),m=n(5112),f=n(1913),o=m("iterator"),c=!1;[].keys&&("next"in(a=[].keys())?(i=r(r(a)))!==Object.prototype&&(s=i):c=!0),s==null||l(function(){var e={};return s[o].call(e)!==e})?s={}:f&&(s=u(s)),d(s[o])||h(s,o,function(){return this}),e.exports={IteratorPrototype:s,BUGGY_SAFARI_ITERATORS:c}},7497:function(e){e.exports={}},6244:function(e,t,n){var s=n(7466);e.exports=function(e){return s(e.length)}},6339:function(e,t,n){var r=n(7293),h=n(614),s=n(2597),i=n(9781),c=n(6530).CONFIGURABLE,l=n(2788),a=n(9909),d=a.enforce,u=a.get,o=Object.defineProperty,m=i&&!r(function(){return 8!==o(function(){},"length",{value:8}).length}),f=String(String).split("String"),p=e.exports=function(e,t,n){"Symbol("===String(t).slice(0,7)&&(t="["+String(t).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!s(e,"name")||c&&e.name!==t)&&o(e,"name",{value:t,configurable:!0}),m&&n&&s(n,"arity")&&e.length!==n.arity&&o(e,"length",{value:n.arity});try{n&&s(n,"constructor")&&n.constructor?i&&o(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch{}var a=d(e);return s(a,"source")||(a.source=f.join("string"==typeof t?t:"")),e};Function.prototype.toString=p(function(){return h(this)&&u(this).source||l(this)},"toString")},4758:function(e){var t=Math.ceil,n=Math.floor;e.exports=Math.trunc||function(e){var s=+e;return(s>0?n:t)(s)}},735:function(e,t,n){var s=n(133);e.exports=s&&!!Symbol.for&&!!Symbol.keyFor},133:function(e,t,n){var s=n(7392),o=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!o(function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&s&&s<41})},8536:function(e,t,n){var o=n(7854),i=n(614),a=n(2788),s=o.WeakMap;e.exports=i(s)&&/native code/.test(a(s))},1574:function(e,t,n){"use strict";var i=n(9781),r=n(1702),c=n(6916),l=n(7293),o=n(1956),d=n(5181),u=n(5296),h=n(7908),m=n(8361),s=Object.assign,a=Object.defineProperty,f=r([].concat);e.exports=!s||l(function(){if(i&&1!==s({b:1},s(a({},"a",{enumerable:!0,get:function(){a(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=s({},e)[n]||o(s({},t)).join("")!=r})?function(e){for(var a=h(e),v=arguments.length,r=1,l=d.f,b=u.f;v>r;)for(var s,n=m(arguments[r++]),p=l?f(o(n),l(n)):o(n),j=p.length,g=0;j>g;)s=p[g++],i&&!c(b,n,s)||(a[s]=n[s]);return a}:s},30:function(e,t,n){var s,d=n(9670),u=n(6048),a=n(748),h=n(3501),m=n(490),f=n(317),r=n(6200)("IE_PROTO"),i=function(){},c=function(e){return"