Преглед изворни кода

feat(知识库): 增加知识库模块

ageer пре 3 месеци
родитељ
комит
1385b165c9
100 измењених фајлова са 381 додато и 4824 уклоњено
  1. 0 392
      application.yml
  2. 10 1
      ruoyi-admin/pom.xml
  3. 0 23
      ruoyi-admin/src/main/java/com/xmzs/PandaApplication.java
  4. 0 18
      ruoyi-admin/src/main/java/com/xmzs/PandaServletInitializer.java
  5. 0 157
      ruoyi-admin/src/main/java/com/xmzs/controller/AuthController.java
  6. 0 140
      ruoyi-admin/src/main/java/com/xmzs/controller/CaptchaController.java
  7. 0 113
      ruoyi-admin/src/main/java/com/xmzs/controller/ChatController.java
  8. 0 25
      ruoyi-admin/src/main/java/com/xmzs/controller/IndexController.java
  9. 0 151
      ruoyi-admin/src/main/java/com/xmzs/controller/PayController.java
  10. 0 61
      ruoyi-admin/src/main/java/com/xmzs/controller/WeChatController.java
  11. 21 0
      ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIApplication.java
  12. 18 0
      ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIServletInitializer.java
  13. 0 21
      ruoyi-admin/src/main/java/org/ruoyi/RuoYiApplication.java
  14. 0 18
      ruoyi-admin/src/main/java/org/ruoyi/RuoYiServletInitializer.java
  15. 210 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java
  16. 67 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/OllamaController.java
  17. 3 24
      ruoyi-admin/src/main/resources/application-dev.yml
  18. 21 49
      ruoyi-admin/src/main/resources/application.yml
  19. BIN
      ruoyi-admin/src/main/resources/static/1.jpg
  20. 0 0
      ruoyi-admin/src/main/resources/static/assets/css/iconfont.css
  21. 0 8
      ruoyi-admin/src/main/resources/static/assets/css/onlinewebfonts.css
  22. 0 0
      ruoyi-admin/src/main/resources/static/assets/css/vno.css
  23. BIN
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.eot
  24. 0 963
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.svg
  25. BIN
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.ttf
  26. BIN
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff
  27. BIN
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff2
  28. BIN
      ruoyi-admin/src/main/resources/static/assets/img/logo.jpg
  29. BIN
      ruoyi-admin/src/main/resources/static/assets/img/logo1.jpg
  30. BIN
      ruoyi-admin/src/main/resources/static/assets/img/logo2.jpg
  31. BIN
      ruoyi-admin/src/main/resources/static/assets/img/logo3.jpg
  32. 0 38
      ruoyi-admin/src/main/resources/static/assets/js/bing.js
  33. 0 104
      ruoyi-admin/src/main/resources/static/assets/js/main.js
  34. 0 1
      ruoyi-admin/src/main/resources/static/assets/json/images.json
  35. 0 1
      ruoyi-admin/src/main/resources/static/assets/svg/favicon.svg
  36. 0 45
      ruoyi-admin/src/test/java/com/xmzs/test/AssertUnitTest.java
  37. 0 70
      ruoyi-admin/src/test/java/com/xmzs/test/DemoUnitTest.java
  38. 0 72
      ruoyi-admin/src/test/java/com/xmzs/test/ParamUnitTest.java
  39. 0 54
      ruoyi-admin/src/test/java/com/xmzs/test/TagUnitTest.java
  40. 0 0
      ruoyi-admin/src/test/java/org/biada/test/AssertUnitTest.java
  41. 0 0
      ruoyi-admin/src/test/java/org/biada/test/DemoUnitTest.java
  42. 0 0
      ruoyi-admin/src/test/java/org/biada/test/ParamUnitTest.java
  43. 0 0
      ruoyi-admin/src/test/java/org/biada/test/TagUnitTest.java
  44. 1 0
      ruoyi-common/pom.xml
  45. 7 0
      ruoyi-common/ruoyi-common-bom/pom.xml
  46. 23 5
      ruoyi-common/ruoyi-common-chat/pom.xml
  47. 0 49
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/config/ChatConfig.java
  48. 0 36
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/config/LocalCache.java
  49. 0 61
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/config/WebSocketConfig.java
  50. 0 26
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/config/properties/WebSocketProperties.java
  51. 0 38
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/constant/OpenAIConst.java
  52. 0 28
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/constant/WebSocketConstants.java
  53. 0 31
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/ChatProcessRequest.java
  54. 0 55
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/ChatRequest.java
  55. 0 33
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/Dall3Request.java
  56. 0 15
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/MjTaskRequest.java
  57. 0 34
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/RoleRequest.java
  58. 0 21
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/SaveMsgRequest.java
  59. 0 35
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/SimpleGenerateRequest.java
  60. 0 19
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/ChatResponse.java
  61. 0 14
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/MetadataResponse.java
  62. 0 20
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/RoleDataResponse.java
  63. 0 13
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/RoleResponse.java
  64. 0 25
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/SimpleGenerateDataResponse.java
  65. 0 25
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/SimpleGenerateResponse.java
  66. 0 48
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/Tts/TextToSpeech.java
  67. 0 15
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/Tts/TtsFormat.java
  68. 0 23
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/Tts/TtsVoice.java
  69. 0 33
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/BillingUsage.java
  70. 0 39
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/CreditGrantsResponse.java
  71. 0 28
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/DailyCost.java
  72. 0 40
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/Datum.java
  73. 0 21
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/Grants.java
  74. 0 56
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/KeyInfo.java
  75. 0 25
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/LineItem.java
  76. 0 17
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/Plan.java
  77. 0 73
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/Subscription.java
  78. 0 263
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/BaseChatCompletion.java
  79. 0 84
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/BaseMessage.java
  80. 0 34
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/ChatCompletion.java
  81. 0 30
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/ChatCompletionWithPicture.java
  82. 0 43
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/Content.java
  83. 0 27
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/FunctionCall.java
  84. 0 46
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/Functions.java
  85. 0 28
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/ImageUrl.java
  86. 0 117
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/Message.java
  87. 0 114
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/MessagePicture.java
  88. 0 42
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/Parameters.java
  89. 0 28
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/ResponseFormat.java
  90. 0 31
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolCallFunction.java
  91. 0 38
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolCalls.java
  92. 0 25
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolChoice.java
  93. 0 33
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolChoiceObj.java
  94. 0 21
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolChoiceObjFunction.java
  95. 0 35
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/Tools.java
  96. 0 36
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolsFunction.java
  97. 0 23
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/common/Choice.java
  98. 0 20
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/common/DeleteResponse.java
  99. 0 30
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/common/OpenAiResponse.java
  100. 0 126
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/completions/Completion.java

+ 0 - 392
application.yml

@@ -1,392 +0,0 @@
-# 项目相关配置
-ruoyi:
-  # 名称
-  name: "xmzs"
-  # 版本
-  version: ${revision}
-  # 版权年份
-  copyrightYear: 2023
-  # 实例演示开关
-  demoEnabled: true
-  # 获取ip地址开关
-  addressEnabled: false
-
-captcha:
-  enable: false
-  # 页面 <参数设置> 可开启关闭 验证码校验
-  # 验证码类型 math 数组计算 char 字符验证
-  type: MATH
-  # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
-  category: CIRCLE
-  # 数字验证码位数
-  numberLength: 1
-  # 字符验证码长度
-  charLength: 4
-
-# 开发环境配置
-server:
-  # 服务器的HTTP端口,默认为8080
-  port: 6039
-  servlet:
-    # 应用的访问路径
-    context-path: /
-  # undertow 配置
-  undertow:
-    # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
-    max-http-post-size: -1
-    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
-    # 每块buffer的空间大小,越小的空间被利用越充分
-    buffer-size: 512
-    # 是否分配的直接内存
-    direct-buffers: true
-    threads:
-      # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
-      io: 8
-      # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
-      worker: 256
-
-# 日志配置
-logging:
-  level:
-    com.xmzs: @logging.level@
-    org.springframework: warn
-  config: classpath:logback-plus.xml
-
-# 用户配置
-user:
-  password:
-    # 密码最大错误次数
-    maxRetryCount: 5
-    # 密码锁定时间(默认10分钟)
-    lockTime: 10
-
-# Spring配置
-spring:
-  application:
-    name: ${ruoyi.name}
-  # 资源信息
-  messages:
-    # 国际化资源文件路径
-    basename: i18n/messages
-  profiles:
-    active: @profiles.active@
-  # 文件上传
-  servlet:
-    multipart:
-      # 单个文件大小
-      max-file-size: 10MB
-      # 设置总上传的文件大小
-      max-request-size: 20MB
-  mvc:
-    format:
-      date-time: yyyy-MM-dd HH:mm:ss
-  jackson:
-    # 日期格式化
-    date-format: yyyy-MM-dd HH:mm:ss
-    serialization:
-      # 格式化输出
-      indent_output: false
-      # 忽略无法转换的对象
-      fail_on_empty_beans: false
-    deserialization:
-      # 允许对象忽略json中不存在的属性
-      fail_on_unknown_properties: false
-
-# Sa-Token配置
-sa-token:
-  # token名称 (同时也是cookie名称)
-  token-name: Authorization
-  # token有效期 设为7天 (必定过期) 单位: 秒
-  timeout: 604800
-  # token临时有效期 (指定时间无操作就过期) 单位: 秒
-  activity-timeout: 604800
-  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
-  is-concurrent: true
-  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
-  is-share: false
-  # 是否尝试从header里读取token
-  is-read-header: true
-  # 是否尝试从cookie里读取token
-  is-read-cookie: false
-  # token前缀
-  token-prefix: "Bearer"
-  # jwt秘钥
-  jwt-secret-key: abcdefghijklmnopqrstuvwxyz
-
-# security配置
-security:
-  # 排除路径
-  excludes:
-    # 修改用户头像
-    - /system/user/edit/avatar
-    - /pay/returnUrl
-    - /pay/notifyUrl
-    # 上传文件
-    - /resource/oss/upload
-    # 重置密码
-    - /auth/reset/password
-    # 聊天接口
-    - /chat
-    # 静态资源
-    - /*.html
-    - /**/*.html
-    - /**/*.css
-    - /**/*.js
-    # 公共路径
-    - /favicon.ico
-    - /error
-    # swagger 文档配置
-    - /*/api-docs
-    - /*/api-docs/**
-    # actuator 监控配置
-    - /actuator
-    - /actuator/**
-# 多租户配置
-tenant:
-  # 是否开启
-  enable: false
-  # 排除表
-  excludes:
-    - sys_menu
-    - sys_tenant
-    - sys_tenant_package
-    - sys_role_dept
-    - sys_role_menu
-    - sys_user_post
-    - sys_user_role
-
-# MyBatisPlus配置
-# https://baomidou.com/config/
-mybatis-plus:
-  # 不支持多包, 如有需要可在注解配置 或 提升扫包等级
-  # 例如 com.**.**.mapper
-  mapperPackage: com.xmzs.**.mapper
-  # 对应的 XML 文件位置
-  mapperLocations: classpath*:mapper/**/*Mapper.xml
-  # 实体扫描,多个package用逗号或者分号分隔
-  typeAliasesPackage: com.xmzs.**.domain
-  # 启动时是否检查 MyBatis XML 文件的存在,默认不检查
-  checkConfigLocation: false
-  configuration:
-    # 自动驼峰命名规则(camel case)映射
-    mapUnderscoreToCamelCase: true
-    # MyBatis 自动映射策略
-    # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射
-    autoMappingBehavior: FULL
-    # MyBatis 自动映射时未知列或未知属性处理策
-    # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息
-    autoMappingUnknownColumnBehavior: NONE
-    # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl
-    # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl
-    # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl
-    logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl
-  global-config:
-    # 是否打印 Logo banner
-    banner: true
-    dbConfig:
-      # 主键类型
-      # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
-      idType: ASSIGN_ID
-      # 逻辑已删除值
-      logicDeleteValue: 2
-      # 逻辑未删除值
-      logicNotDeleteValue: 0
-      # 字段验证策略之 insert,在 insert 的时候的字段验证策略
-      # IGNORED 忽略 NOT_NULL 非NULL NOT_EMPTY 非空 DEFAULT 默认 NEVER 不加入 SQL
-      insertStrategy: NOT_NULL
-      # 字段验证策略之 update,在 update 的时候的字段验证策略
-      updateStrategy: NOT_NULL
-      # 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件
-      where-strategy: NOT_NULL
-
-# 数据加密
-mybatis-encryptor:
-  # 是否开启加密
-  enable: false
-  # 默认加密算法
-  algorithm: BASE64
-  # 编码方式 BASE64/HEX。默认BASE64
-  encode: BASE64
-  # 安全秘钥 对称算法的秘钥 如:AES,SM4
-  password:
-  # 公私钥 非对称算法的公私钥 如:SM2,RSA
-  publicKey:
-  privateKey:
-
-# Swagger配置
-swagger:
-  info:
-    # 标题
-    title: '标题:${ruoyi.name}多租户管理系统_接口文档'
-    # 描述
-    description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
-    # 版本
-    version: '版本号: ${ruoyi.version}'
-    # 作者信息
-    contact:
-      name: ageerle
-      email: ageerle@163.com
-      url: https://gitee.com/ageerle/ruoyi-ai
-  components:
-    # 鉴权方式配置
-    security-schemes:
-      apiKey:
-        type: APIKEY
-        in: HEADER
-        name: ${sa-token.token-name}
-
-springdoc:
-  api-docs:
-    # 是否开启接口文档
-    enabled: true
-  swagger-ui:
-    # 持久化认证数据
-    persistAuthorization: true
-  #这里定义了两个分组,可定义多个,也可以不定义
-  group-configs:
-    - group: 1.演示模块
-      packages-to-scan: com.xmzs.demo
-    - group: 2.通用模块
-      packages-to-scan: com.xmzs.web
-    - group: 3.系统模块
-      packages-to-scan: com.xmzs.system
-    - group: 4.代码生成模块
-      packages-to-scan: com.xmzs.generator
-
-# 防止XSS攻击
-xss:
-  # 过滤开关
-  enabled: true
-  # 排除链接(多个用逗号分隔)
-  excludes: /system/notice
-  # 匹配链接
-  urlPatterns: /system/*,/monitor/*,/tool/*
-
-# 全局线程池相关配置
-thread-pool:
-  # 是否开启线程池
-  enabled: false
-  # 队列最大长度
-  queueCapacity: 128
-  # 线程池维护线程所允许的空闲时间
-  keepAliveSeconds: 300
-
---- # 分布式锁 lock4j 全局配置
-lock4j:
-  # 获取分布式锁超时时间,默认为 3000 毫秒
-  acquire-timeout: 3000
-  # 分布式锁的超时时间,默认为 30 秒
-  expire: 30000
-
---- # Actuator 监控端点的配置项
-management:
-  endpoints:
-    web:
-      exposure:
-        include: '*'
-  endpoint:
-    health:
-      show-details: ALWAYS
-    logfile:
-      external-file: ./logs/sys-console.log
-
---- # websocket
-websocket:
-  enabled: false
-  # 路径
-  path: ''
-  # 设置访问源地址
-  allowedOrigins: '*'
-
-# 微信小程序配置信息
-wx:
-  miniapp:
-    configs:
-      - appid: # 你的appid
-        secret: # 你的secret
-        token: #微信小程序消息服务器配置的token
-        aesKey: #微信小程序消息服务器配置的EncodingAESKey
-        msgDataFormat: JSON
-baidu:
-  # 是否开启文本审核
-  enabled: false
-  # 文本审核
-  textReview:
-    apiKey: '' # apiKey
-    secretKey: '' # secretKey
-  appKey: xxxxxxxxxxxxxxxxx
-  secretKey: xxxxxxxxxxxxxxxxxxxxxxx
-
-wechat:
-  #  是否使用微信 true/false
-  enable: true
-  #  生成的登录二维码路径 默认与项目同级
-  qrPath: "./"
-
-keyword:
-  #  重置会话指令
-  reset: "重置会话"
-  #  ai画图指令(DALL·E模型 https://platform.openai.com/docs/models/dall-e)
-  #  generation 根据关键词生成图片(https://platform.openai.com/docs/guides/images/generations)
-  image: "ai画图"
-  #  ai语音指令(TTS模型 https://platform.openai.com/docs/api-reference/audio)
-  audio: "ai语音"
-
-mj:
-  api-secret: 'sk-xx'
-  task-store:
-    type: in_memory
-    timeout: 30d
-  translate-way: gpt
-  #  proxy:
-  #    host: 127.0.0.1
-  #    port: 10809
-  ng-discord:
-    server: 'https://xxx.pandarobot.chat/'
-    cdn: 'https://xxx.pandarobot.chat/'
-    wss: 'https://xxx.pandarobot.chat/'
-  openai:
-    gpt-api-url: 'https://api.pandarobot.chat/'
-    gpt-api-key: 'sk-xx'
-  accounts:
-    - guild-id: 'xx'
-      channel-id: 'xx'
-      user-token: 'xx'
-
---- # mail 邮件发送
-mail:
-  enabled: true
-  host: smtp.163.com
-  port: 465
-  # 是否需要用户名密码验证
-  auth: true
-  # 发送方,遵循RFC-822标准
-  from: ageerle@163.com
-  # 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
-  user: ageerle@163.com
-  # 密码(填写授权码)
-  pass: TOGXBVPYFVPFRQMQ
-  # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
-  starttlsEnable: true
-  # 使用SSL安全连接
-  sslEnable: true
-  # SMTP超时时长,单位毫秒,缺省值不超时
-  timeout: 0
-  # Socket连接超时值,单位毫秒,缺省值不超时
-  connectionTimeout: 0
-
-# chatgpt配置信息
-chat:
-  apiKey: 'sk-xxx'
-  apiHost: 'https://api.pandarobot.chat/'
-
-# 支付配置信息
-pay:
-  pid: 'xxx'
-  key: 'xxx'
-  payUrl: 'https://pay.pandarobot.chat/mapi.php'
-  notify_url: 'https://www.pandarobot.chat/pay/returnUrl'
-  return_url: 'https://www.pandarobot.chat/pay/notifyUrl'
-  type: 'wxpay'
-  device: 'pc'
-  sign_type: 'MD5'

+ 10 - 1
ruoyi-admin/pom.xml

@@ -57,7 +57,10 @@
             <artifactId>ruoyi-fusion</artifactId>
         </dependency>
 
-
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-knowledge</artifactId>
+        </dependency>
 
 
         <!--  demo模块  -->
@@ -78,6 +81,12 @@
             <artifactId>thumbnailator</artifactId>
             <version>0.4.11</version>
         </dependency>
+        <dependency>
+            <groupId>io.github.ollama4j</groupId>
+            <artifactId>ollama4j</artifactId>
+            <version>1.0.79</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 0 - 23
ruoyi-admin/src/main/java/com/xmzs/PandaApplication.java

@@ -1,23 +0,0 @@
-package com.xmzs;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
-
-/**
- * 启动程序
- *
- * @author Lion Li
- */
-
-@SpringBootApplication
-public class PandaApplication {
-
-
-    public static void main(String[] args) {
-        SpringApplication application = new SpringApplication(PandaApplication.class);
-        application.setApplicationStartup(new BufferingApplicationStartup(2048));
-        application.run(args);
-        System.out.println("(♥◠‿◠)ノ゙  panda智能助手启动成功   ლ(´ڡ`ლ)゙");
-    }
-}

+ 0 - 18
ruoyi-admin/src/main/java/com/xmzs/PandaServletInitializer.java

@@ -1,18 +0,0 @@
-package com.xmzs;
-
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-
-/**
- * web容器中进行部署
- *
- * @author Lion Li
- */
-public class PandaServletInitializer extends SpringBootServletInitializer {
-
-    @Override
-    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
-        return application.sources(PandaApplication.class);
-    }
-
-}

+ 0 - 157
ruoyi-admin/src/main/java/com/xmzs/controller/AuthController.java

@@ -1,157 +0,0 @@
-package com.xmzs.controller;
-
-import cn.dev33.satoken.annotation.SaIgnore;
-import cn.hutool.core.collection.CollUtil;
-import com.xmzs.common.core.constant.Constants;
-import com.xmzs.common.core.domain.R;
-import com.xmzs.common.core.domain.model.*;
-import com.xmzs.common.core.utils.MapstructUtils;
-import com.xmzs.common.core.utils.StreamUtils;
-import com.xmzs.common.core.utils.StringUtils;
-import com.xmzs.common.satoken.utils.LoginHelper;
-import com.xmzs.common.tenant.helper.TenantHelper;
-import com.xmzs.system.domain.bo.SysTenantBo;
-import com.xmzs.system.domain.vo.LoginTenantVo;
-import com.xmzs.system.domain.vo.SysTenantVo;
-import com.xmzs.system.domain.vo.TenantListVo;
-import com.xmzs.system.service.ISysTenantService;
-
-
-import com.xmzs.system.service.SysLoginService;
-import com.xmzs.system.service.SysRegisterService;
-import com.xmzs.web.domain.vo.LoginVo;
-
-import jakarta.servlet.http.HttpServletRequest;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.net.URL;
-import java.util.List;
-
-/**
- * 认证
- *
- * @author Lion Li
- */
-@SaIgnore
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/auth")
-public class AuthController {
-
-    private final SysLoginService loginService;
-    private final SysRegisterService registerService;
-    private final ISysTenantService tenantService;
-
-    /**
-     * 登录方法
-     *
-     * @param body 登录信息
-     * @return 结果
-     */
-    @PostMapping("/login")
-    public R<LoginVo> login(@Validated @RequestBody LoginBody body) {
-        body.setTenantId(Constants.TENANT_ID);
-        LoginVo loginVo = new LoginVo();
-        // 生成令牌
-        String token = loginService.login(
-                body.getTenantId(),
-                body.getUsername(), body.getPassword(),
-                body.getCode(), body.getUuid());
-        loginVo.setToken(token);
-        loginVo.setUserInfo(LoginHelper.getLoginUser());
-        return R.ok(loginVo);
-    }
-
-    /**
-     * 短信登录
-     *
-     * @param body 登录信息
-     * @return 结果
-     */
-    @PostMapping("/smsLogin")
-    public R<LoginVo> smsLogin(@Validated @RequestBody SmsLoginBody body) {
-        LoginVo loginVo = new LoginVo();
-        // 生成令牌
-        String token = loginService.smsLogin(body.getTenantId(), body.getPhonenumber(), body.getSmsCode());
-        loginVo.setToken(token);
-        return R.ok(loginVo);
-    }
-
-    /**
-     * 邮件登录
-     *
-     * @param body 登录信息
-     * @return 结果
-     */
-    @PostMapping("/emailLogin")
-    public R<LoginVo> emailLogin(@Validated @RequestBody EmailLoginBody body) {
-        LoginVo loginVo = new LoginVo();
-        // 生成令牌
-        String token = loginService.emailLogin(body.getTenantId(), body.getEmail(), body.getEmailCode());
-        loginVo.setToken(token);
-        return R.ok(loginVo);
-    }
-
-    /**
-     * 游客登录
-     *
-     * @param loginBody
-     * @return 结果
-     */
-    @PostMapping("/visitorLogin")
-    public R<LoginVo> xcxLogin(@RequestBody VisitorLoginBody loginBody) {
-        return R.ok(loginService.visitorLogin(loginBody));
-    }
-
-    /**
-     * 退出登录
-     */
-    @PostMapping("/logout")
-    public R<Void> logout() {
-        loginService.logout();
-        return R.ok("退出成功");
-    }
-
-    /**
-     * 用户注册
-     */
-    @PostMapping("/register")
-    public R<Void> register(@Validated @RequestBody RegisterBody user) {
-        registerService.register(user);
-        return R.ok();
-    }
-
-    /**
-     * 重置密码
-     */
-    @PostMapping("/reset/password")
-    @SaIgnore
-    public R<Void> resetPassWord(@Validated @RequestBody RegisterBody user) {
-        registerService.resetPassWord(user);
-        return R.ok();
-    }
-
-    /**
-     * 登录页面租户下拉框
-     *
-     * @return 租户列表
-     */
-    @GetMapping("/tenant/list")
-    public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
-        List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo());
-        List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class);
-        // 获取域名
-        String host = new URL(request.getRequestURL().toString()).getHost();
-        // 根据域名进行筛选
-        List<TenantListVo> list = StreamUtils.filter(voList, vo -> StringUtils.equals(vo.getDomain(), host));
-        // 返回对象
-        LoginTenantVo vo = new LoginTenantVo();
-        vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
-        vo.setTenantEnabled(TenantHelper.isEnable());
-        return R.ok(vo);
-    }
-
-}

+ 0 - 140
ruoyi-admin/src/main/java/com/xmzs/controller/CaptchaController.java

@@ -1,140 +0,0 @@
-package com.xmzs.controller;
-
-import cn.dev33.satoken.annotation.SaIgnore;
-import cn.hutool.captcha.AbstractCaptcha;
-import cn.hutool.captcha.generator.CodeGenerator;
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.RandomUtil;
-import com.xmzs.common.core.constant.Constants;
-import com.xmzs.common.core.constant.GlobalConstants;
-import com.xmzs.common.core.domain.R;
-import com.xmzs.common.core.utils.SpringUtils;
-import com.xmzs.common.core.utils.StringUtils;
-import com.xmzs.common.core.utils.reflect.ReflectUtils;
-import com.xmzs.common.mail.config.properties.MailProperties;
-import com.xmzs.common.mail.utils.MailUtils;
-import com.xmzs.common.redis.utils.RedisUtils;
-import com.xmzs.common.sms.config.properties.SmsProperties;
-import com.xmzs.common.sms.core.SmsTemplate;
-import com.xmzs.common.sms.entity.SmsResult;
-import com.xmzs.common.web.config.properties.CaptchaProperties;
-import com.xmzs.common.web.enums.CaptchaType;
-import com.xmzs.web.domain.request.EmailRequest;
-import com.xmzs.web.domain.vo.CaptchaVo;
-import jakarta.validation.Valid;
-import jakarta.validation.constraints.NotBlank;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.expression.Expression;
-import org.springframework.expression.ExpressionParser;
-import org.springframework.expression.spel.standard.SpelExpressionParser;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.time.Duration;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 验证码操作处理
- *
- * @author Lion Li
- */
-@SaIgnore
-@Slf4j
-@Validated
-@RequiredArgsConstructor
-@RestController
-public class CaptchaController {
-
-    private final CaptchaProperties captchaProperties;
-    private final SmsProperties smsProperties;
-    private final MailProperties mailProperties;
-
-    /**
-     * 短信验证码
-     *
-     * @param phonenumber 用户手机号
-     */
-    @GetMapping("/resource/sms/code")
-    public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
-        if (!smsProperties.getEnabled()) {
-            return R.fail("当前系统没有开启短信功能!");
-        }
-        String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
-        String code = RandomUtil.randomNumbers(4);
-        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
-        // 验证码模板id 自行处理 (查数据库或写死均可)
-        String templateId = "";
-        Map<String, String> map = new HashMap<>(1);
-        map.put("code", code);
-        SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class);
-        SmsResult result = smsTemplate.send(phonenumber, templateId, map);
-        if (!result.isSuccess()) {
-            log.error("验证码短信发送异常 => {}", result);
-            return R.fail(result.getMessage());
-        }
-        return R.ok();
-    }
-
-    /**
-     * 邮箱验证码
-     *
-     * @param emailRequest 用户邮箱
-     */
-    //@PostMapping("/resource/email/code")
-    @PostMapping("/resource/email/code")
-    public R<Void> emailCode(@RequestBody @Valid EmailRequest emailRequest) {
-        if (!mailProperties.getEnabled()) {
-            return R.fail("当前系统没有开启邮箱功能!");
-        }
-        String key = GlobalConstants.CAPTCHA_CODE_KEY + emailRequest.getUsername();
-        String code = RandomUtil.randomNumbers(4);
-        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
-        try {
-            MailUtils.sendText(emailRequest.getUsername(), "【熊猫助手】登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。");
-        } catch (Exception e) {
-            log.error("验证码短信发送异常 => {}", e.getMessage());
-            return R.fail(e.getMessage());
-        }
-        return R.ok();
-    }
-
-    /**
-     * 生成验证码
-     */
-    @GetMapping("/code")
-    public R<CaptchaVo> getCode() {
-        CaptchaVo captchaVo = new CaptchaVo();
-        boolean captchaEnabled = captchaProperties.getEnable();
-        if (!captchaEnabled) {
-            captchaVo.setCaptchaEnabled(false);
-            return R.ok(captchaVo);
-        }
-        // 保存验证码信息
-        String uuid = IdUtil.simpleUUID();
-        String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid;
-        // 生成验证码
-        CaptchaType captchaType = captchaProperties.getType();
-        boolean isMath = CaptchaType.MATH == captchaType;
-        Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
-        CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
-        AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
-        captcha.setGenerator(codeGenerator);
-        captcha.createCode();
-        String code = captcha.getCode();
-        if (isMath) {
-            ExpressionParser parser = new SpelExpressionParser();
-            Expression exp = parser.parseExpression(StringUtils.remove(code, "="));
-            code = exp.getValue(String.class);
-        }
-        RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
-        captchaVo.setUuid(uuid);
-        captchaVo.setImg(captcha.getImageBase64());
-        return R.ok(captchaVo);
-    }
-
-}

+ 0 - 113
ruoyi-admin/src/main/java/com/xmzs/controller/ChatController.java

@@ -1,113 +0,0 @@
-package com.xmzs.controller;
-
-
-import com.xmzs.common.chat.domain.request.ChatRequest;
-import com.xmzs.common.chat.domain.request.Dall3Request;
-import com.xmzs.common.chat.entity.Tts.TextToSpeech;
-import com.xmzs.common.chat.entity.files.UploadFileResponse;
-import com.xmzs.common.chat.entity.images.Item;
-import com.xmzs.common.chat.entity.whisper.WhisperResponse;
-import com.xmzs.common.core.domain.R;
-import com.xmzs.common.core.domain.model.LoginUser;
-import com.xmzs.common.core.exception.base.BaseException;
-import com.xmzs.common.mybatis.core.page.PageQuery;
-import com.xmzs.common.mybatis.core.page.TableDataInfo;
-import com.xmzs.common.satoken.utils.LoginHelper;
-import com.xmzs.system.domain.bo.ChatMessageBo;
-import com.xmzs.system.domain.vo.ChatMessageVo;
-import com.xmzs.system.service.IChatMessageService;
-import com.xmzs.system.service.ISseService;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.Valid;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.core.io.Resource;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-
-import java.util.List;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @date 2023-03-01
- */
-@Controller
-@Slf4j
-@RequiredArgsConstructor
-public class ChatController {
-
-    private final ISseService ISseService;
-
-    private final IChatMessageService chatMessageService;
-
-    /**
-     * 聊天接口
-     */
-    @PostMapping("/chat")
-    @ResponseBody
-    public SseEmitter sseChat(@RequestBody @Valid ChatRequest chatRequest, HttpServletResponse response) {
-        return ISseService.sseChat(chatRequest);
-    }
-
-    /**
-     * 上传文件
-     */
-    @PostMapping("/v1/upload")
-    @ResponseBody
-    public UploadFileResponse upload(@RequestPart("file") MultipartFile file) {
-        return ISseService.upload(file);
-    }
-
-
-    /**
-     * 语音转文本
-     *
-     * @param file
-     */
-    @PostMapping("/audio")
-    @ResponseBody
-    public WhisperResponse audio(@RequestParam("file") MultipartFile file) {
-        WhisperResponse whisperResponse = ISseService.speechToTextTranscriptionsV2(file);
-        return whisperResponse;
-    }
-
-    /**
-     * 文本转语音
-     *
-     * @param textToSpeech
-     */
-    @PostMapping("/speech")
-    @ResponseBody
-    public ResponseEntity<Resource> speech(@RequestBody TextToSpeech textToSpeech) {
-        return ISseService.textToSpeed(textToSpeech);
-    }
-
-
-    @PostMapping("/dall3")
-    @ResponseBody
-    public R<List<Item>> dall3(@RequestBody @Valid Dall3Request request) {
-        return R.ok(ISseService.dall3(request));
-    }
-
-    /**
-     * 聊天记录
-     */
-    @PostMapping("/chatList")
-    @ResponseBody
-    public R<TableDataInfo<ChatMessageVo>> list(@RequestBody @Valid ChatMessageBo chatRequest, @RequestBody PageQuery pageQuery) {
-        // 默认查询当前登录用户消息记录
-        LoginUser loginUser = LoginHelper.getLoginUser();
-        if (loginUser == null) {
-            throw new BaseException("用户未登录!");
-        }
-        chatRequest.setUserId(loginUser.getUserId());
-        TableDataInfo<ChatMessageVo> chatMessageVoTableDataInfo = chatMessageService.queryPageList(chatRequest, pageQuery);
-        return R.ok(chatMessageVoTableDataInfo);
-    }
-
-}

+ 0 - 25
ruoyi-admin/src/main/java/com/xmzs/controller/IndexController.java

@@ -1,25 +0,0 @@
-package com.xmzs.controller;
-
-import cn.dev33.satoken.annotation.SaIgnore;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-
-/**
- * 首页
- *
- * @author Lion Li
- */
-@SaIgnore
-@RequiredArgsConstructor
-@Controller
-public class IndexController {
-
-    /**
-     * 访问首页,提示语
-     */
-    @GetMapping("/")
-    public String index() {
-        return "index.html";
-    }
-}

+ 0 - 151
ruoyi-admin/src/main/java/com/xmzs/controller/PayController.java

@@ -1,151 +0,0 @@
-package com.xmzs.controller;
-
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.extra.qrcode.QrCodeUtil;
-import com.xmzs.common.config.PayConfig;
-import com.xmzs.common.core.domain.R;
-import com.xmzs.common.core.domain.model.LoginUser;
-import com.xmzs.common.core.exception.base.BaseException;
-import com.xmzs.common.core.utils.StringUtils;
-import com.xmzs.common.oss.core.OssClient;
-import com.xmzs.common.oss.entity.UploadResult;
-import com.xmzs.common.oss.factory.OssFactory;
-import com.xmzs.common.response.PayResponse;
-import com.xmzs.common.satoken.utils.LoginHelper;
-import com.xmzs.common.service.PayService;
-import com.xmzs.common.utils.MD5Util;
-import com.xmzs.system.domain.bo.PaymentOrdersBo;
-import com.xmzs.system.domain.bo.SysUserBo;
-import com.xmzs.system.domain.request.OrderRequest;
-import com.xmzs.system.domain.vo.PaymentOrdersVo;
-import com.xmzs.system.domain.vo.SysUserVo;
-import com.xmzs.system.service.IPaymentOrdersService;
-import com.xmzs.system.service.ISysUserService;
-import com.xmzs.system.util.OrderNumberGenerator;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/pay")
-@Slf4j
-public class PayController {
-
-    private final PayService payService;
-
-    private final ISysUserService userService;
-
-    private final IPaymentOrdersService paymentOrdersService;
-
-    private final PayConfig payConfig;
-
-    /**
-     * 获取支付二维码
-     *
-     * @Date 2023/7/3
-     * @return void
-     **/
-    @PostMapping("/payUrl")
-    public R<PaymentOrdersVo> payUrl(@RequestBody OrderRequest orderRequest) {
-        LoginUser loginUser = LoginHelper.getLoginUser();
-        // 创建订单
-        PaymentOrdersBo paymentOrders = new PaymentOrdersBo();
-        paymentOrders.setOrderName(orderRequest.getName());
-        paymentOrders.setAmount(new BigDecimal(orderRequest.getMoney()));
-        String orderNo = OrderNumberGenerator.generate();
-        paymentOrders.setOrderNo(orderNo);
-        paymentOrders.setUserId(loginUser.getUserId());
-        // TODO 支付状态默认待支付 - 添加枚举
-        paymentOrders.setPaymentStatus("1");
-        paymentOrdersService.insertByBo(paymentOrders);
-        String payUrl = payService.getPayUrl(orderNo, orderRequest.getName(), Double.parseDouble(orderRequest.getMoney()), "192.168.1.6");
-        byte[] bytes = QrCodeUtil.generatePng(payUrl, 300, 300);
-        OssClient storage = OssFactory.instance();
-        UploadResult upload=storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
-        PaymentOrdersVo paymentOrdersVo = new PaymentOrdersVo();
-        BeanUtil.copyProperties(paymentOrders,paymentOrdersVo);
-        paymentOrdersVo.setUrl(upload.getUrl());
-        return R.ok(paymentOrdersVo);
-    }
-
-    /**
-     * 跳转通知地址
-     *
-     * @Date 2023/7/3
-     * @param
-     * @return void
-     **/
-    @PostMapping("/notifyUrl")
-    public void notifyUrl() {
-        log.info("notifyUrl===========");
-    }
-
-    /**
-     * 获取订单信息
-     *
-     */
-    @PostMapping("/orderInfo")
-    public R<PaymentOrdersVo> orderInfo(@RequestBody  OrderRequest orderRequest) {
-        if(StringUtils.isEmpty(orderRequest.getOrderNo())){
-            throw new BaseException("订单号不能为空!");
-        }
-        PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
-        paymentOrdersBo.setOrderNo(orderRequest.getOrderNo());
-        List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
-        if (CollectionUtil.isEmpty(paymentOrdersList)){
-            throw new BaseException("订单不存在!");
-        }
-        PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
-        return R.ok(paymentOrdersVo);
-    }
-
-    /**
-     * 跳转通知地址
-     *
-     * @Date 2023/7/3
-     * @param payResponse
-     * @return void
-     **/
-    @GetMapping("/returnUrl")
-    public String returnUrl(PayResponse payResponse) {
-        // 校验签名
-        String mdString = "money=" + payResponse.getMoney() + "&name=" + payResponse.getName() +
-            "&out_trade_no=" + payResponse.getOut_trade_no() + "&pid=" + payConfig.getPid() +
-            "&trade_no=" + payResponse.getTrade_no() + "&trade_status=" + payResponse.getTrade_status() +
-            "&type=" + payResponse.getType() +  payConfig.getKey();
-        String sign = MD5Util.GetMD5Code(mdString);
-        if(!sign.equals(payResponse.getSign())){
-            throw new BaseException("校验签名失败!");
-        }
-        double money = Double.parseDouble(payResponse.getMoney());
-        log.info("支付订单号{}",payResponse);
-        PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
-        paymentOrdersBo.setOrderNo(payResponse.getOut_trade_no());
-        List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
-        if (CollectionUtil.isEmpty(paymentOrdersList)){
-            throw new BaseException("订单不存在!");
-        }
-        // 订单状态修改为已支付
-        PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
-        paymentOrdersVo.setPaymentStatus("2");
-        paymentOrdersVo.setPaymentMethod(payResponse.getType());
-        BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
-        paymentOrdersService.updateByBo(paymentOrdersBo);
-
-        SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
-        sysUserVo.setUserBalance(sysUserVo.getUserBalance()+money);
-        SysUserBo sysUserBo = new SysUserBo();
-        BeanUtil.copyProperties(sysUserVo,sysUserBo);
-        // 设置为付费用户
-        sysUserBo.setUserGrade("1");
-        userService.updateUser(sysUserBo);
-        return "success";
-    }
-
-}
-

+ 0 - 61
ruoyi-admin/src/main/java/com/xmzs/controller/WeChatController.java

@@ -1,61 +0,0 @@
-package com.xmzs.controller;
-
-import cn.dev33.satoken.annotation.SaIgnore;
-import com.xmzs.common.core.domain.R;
-import com.xmzs.common.wechat.Wechat;
-import com.xmzs.common.wechat.controller.LoginController;
-import com.xmzs.common.wechat.core.MsgCenter;
-import com.xmzs.system.cofing.KeywordConfig;
-import com.xmzs.system.cofing.WechatConfig;
-import com.xmzs.system.handler.WechatMessageHandler;
-import com.xmzs.system.service.ISseService;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * 个人微信扩展控制器
- *
- * @author WangLe
- */
-@SaIgnore
-@Slf4j
-@Validated
-@RequiredArgsConstructor
-@RestController
-public class WeChatController {
-
-    @Getter
-    private Wechat wechatBot;
-
-    private final WechatConfig wechatConfig;
-
-    private final ISseService sseService;
-
-    private final  KeywordConfig keywordConfig;
-
-    /**
-     * 获取微信登录二维码
-     *
-     */
-    @GetMapping("/getQr")
-    public R<String> getQr() {
-        //微信
-        if (wechatConfig.getEnable()){
-            log.info("正在登录微信,请按提示操作:");
-            wechatBot = new Wechat(new WechatMessageHandler(sseService, keywordConfig));
-            // 登陆
-            LoginController login = new LoginController();
-            String qrCode = login.login_1();
-            new Thread(login::login_2).start();
-            wechatBot.start();
-            return R.ok(qrCode);
-        }else {
-            return R.fail();
-        }
-    }
-
-}

+ 21 - 0
ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIApplication.java

@@ -0,0 +1,21 @@
+package org.ruoyi;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+/**
+ * 启动程序
+ *
+ * @author Lion Li
+ */
+@SpringBootApplication
+public class RuoYiAIApplication {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(RuoYiAIApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        System.out.println("(♥◠‿◠)ノ゙  RuoYiAI启动成功   ლ(´ڡ`ლ)゙");
+    }
+}

+ 18 - 0
ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIServletInitializer.java

@@ -0,0 +1,18 @@
+package org.ruoyi;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web容器中进行部署
+ *
+ * @author Lion Li
+ */
+public class RuoYiAIServletInitializer extends SpringBootServletInitializer {
+
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+        return application.sources(RuoYiAIApplication.class);
+    }
+
+}

+ 0 - 21
ruoyi-admin/src/main/java/org/ruoyi/RuoYiApplication.java

@@ -1,21 +0,0 @@
-package org.ruoyi;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
-
-/**
- * 启动程序
- *
- * @author Lion Li
- */
-@SpringBootApplication
-public class RuoYiApplication {
-
-    public static void main(String[] args) {
-        SpringApplication application = new SpringApplication(RuoYiApplication.class);
-        application.setApplicationStartup(new BufferingApplicationStartup(2048));
-        application.run(args);
-        System.out.println("(♥◠‿◠)ノ゙  RuoYiAi启动成功   ლ(´ڡ`ლ)゙");
-    }
-}

+ 0 - 18
ruoyi-admin/src/main/java/org/ruoyi/RuoYiServletInitializer.java

@@ -1,18 +0,0 @@
-package org.ruoyi;
-
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-
-/**
- * web容器中进行部署
- *
- * @author Lion Li
- */
-public class RuoYiServletInitializer extends SpringBootServletInitializer {
-
-    @Override
-    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
-        return application.sources(RuoYiApplication.class);
-    }
-
-}

+ 210 - 0
ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java

@@ -0,0 +1,210 @@
+package org.ruoyi.controller;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.theokanning.openai.completion.chat.ChatMessageRole;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.ruoyi.common.chat.config.ChatConfig;
+import org.ruoyi.common.chat.domain.request.ChatRequest;
+import org.ruoyi.common.chat.entity.chat.ChatCompletion;
+import org.ruoyi.common.chat.entity.chat.Message;
+import org.ruoyi.common.chat.openai.OpenAiStreamClient;
+import org.ruoyi.common.core.domain.R;
+import org.ruoyi.common.core.validate.AddGroup;
+import org.ruoyi.common.excel.utils.ExcelUtil;
+import org.ruoyi.common.log.annotation.Log;
+import org.ruoyi.common.log.enums.BusinessType;
+import org.ruoyi.common.mybatis.core.page.PageQuery;
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.common.satoken.utils.LoginHelper;
+import org.ruoyi.common.web.core.BaseController;
+import org.ruoyi.knowledge.domain.bo.KnowledgeAttachBo;
+import org.ruoyi.knowledge.domain.bo.KnowledgeFragmentBo;
+import org.ruoyi.knowledge.domain.bo.KnowledgeInfoBo;
+import org.ruoyi.knowledge.domain.req.KnowledgeInfoUploadRequest;
+import org.ruoyi.knowledge.domain.vo.KnowledgeAttachVo;
+import org.ruoyi.knowledge.domain.vo.KnowledgeFragmentVo;
+import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.knowledge.service.EmbeddingService;
+import org.ruoyi.knowledge.service.IKnowledgeAttachService;
+import org.ruoyi.knowledge.service.IKnowledgeFragmentService;
+import org.ruoyi.knowledge.service.IKnowledgeInfoService;
+import org.ruoyi.system.listener.SSEEventSourceListener;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.ruoyi.knowledge.chain.vectorstore.VectorStore;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 知识库
+ *
+ * @author Lion Li
+ * @date 2024-10-21
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/knowledge")
+public class KnowledgeController extends BaseController {
+
+    private final IKnowledgeInfoService knowledgeInfoService;
+
+    private final VectorStore vectorStore;
+
+    private final IKnowledgeAttachService attachService;
+
+    private final IKnowledgeFragmentService fragmentService;
+
+    private final EmbeddingService embeddingService;
+
+    private OpenAiStreamClient openAiStreamClient;
+
+    private final ChatConfig chatConfig;
+
+    /**
+     * 知识库对话
+     */
+    @PostMapping("/send")
+    public SseEmitter send(@RequestBody @Valid ChatRequest chatRequest) {
+
+        openAiStreamClient = chatConfig.getOpenAiStreamClient();
+        SseEmitter sseEmitter = new SseEmitter(0L);
+        SSEEventSourceListener openAIEventSourceListener = new SSEEventSourceListener(sseEmitter);
+
+        List<Message> messages = chatRequest.getMessages();
+        String content = messages.get(messages.size() - 1).getContent().toString();
+        List<String> nearestList;
+        List<Double> queryVector = embeddingService.getQueryVector(content);
+        nearestList = vectorStore.nearest(queryVector,chatRequest.getKid());
+        for (String prompt : nearestList) {
+            Message sysMessage = Message.builder().content(prompt).role(Message.Role.USER).build();
+            messages.add(sysMessage);
+        }
+        Message userMessage = Message.builder().content(content + (nearestList.size() > 0 ? "\n\n注意:回答问题时,须严格根据我给你的系统上下文内容原文进行回答,请不要自己发挥,回答时保持原来文本的段落层级" : "") ).role(Message.Role.USER).build();
+        messages.add(userMessage);
+
+
+        ChatCompletion completion = ChatCompletion
+            .builder()
+            .messages(messages)
+            .model(chatRequest.getModel())
+            .temperature(chatRequest.getTemperature())
+            .topP(chatRequest.getTop_p())
+            .stream(true)
+            .build();
+        openAiStreamClient.streamChatCompletion(completion, openAIEventSourceListener);
+
+        return sseEmitter;
+    }
+
+
+    /**
+     * 根据用户信息查询本地知识库
+     */
+    @GetMapping("/list")
+    public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
+        if(!StpUtil.isLogin()){
+            throw new SecurityException("请先去登录!");
+        }
+        bo.setUid(LoginHelper.getUserId());
+        return knowledgeInfoService.queryPageList(bo, pageQuery);
+    }
+
+
+
+    /**
+     * 新增知识库
+     */
+    @Log(title = "知识库", businessType = BusinessType.INSERT)
+    @PostMapping("/save")
+    public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
+        knowledgeInfoService.saveOne(bo);
+        return R.ok();
+    }
+
+    /**
+     * 删除知识库
+     */
+    @PostMapping("/remove/{id}")
+    public R<String> remove(@PathVariable String id){
+        knowledgeInfoService.removeKnowledge(id);
+        return R.ok("删除知识库成功!");
+    }
+
+    /**
+     * 修改知识库
+     */
+    @Log(title = "知识库", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public R<Void> edit( @RequestBody KnowledgeInfoBo bo) {
+        return toAjax(knowledgeInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 导出知识库列表
+     */
+    @Log(title = "知识库", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
+        List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "知识库", KnowledgeInfoVo.class, response);
+    }
+
+    /**
+     * 查询知识附件信息
+     */
+    @GetMapping("/detail/{kid}")
+    public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery,@PathVariable String kid){
+        bo.setKid(kid);
+        return attachService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 上传知识库附件
+     */
+    @PostMapping(value = "/attach/upload")
+    public R<String> upload(KnowledgeInfoUploadRequest request){
+        knowledgeInfoService.upload(request);
+        return R.ok("上传知识库附件成功!");
+    }
+
+    /**
+     * 获取知识库附件详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("attach/info/{id}")
+    public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "主键不能为空")
+                                              @PathVariable Long id) {
+        return R.ok(attachService.queryById(id));
+    }
+
+    /**
+     * 删除知识库附件
+     *
+     */
+    @PostMapping("attach/remove/{kid}")
+    public R<Void> removeAttach(@NotEmpty(message = "主键不能为空")
+                          @PathVariable String kid) {
+        attachService.removeKnowledgeAttach(kid);
+        return R.ok();
+    }
+
+
+    /**
+     * 查询知识片段
+     */
+    @GetMapping("/fragment/list/{docId}")
+    public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo, PageQuery pageQuery, @PathVariable String docId) {
+        bo.setDocId(docId);
+        return fragmentService.queryPageList(bo, pageQuery);
+    }
+
+}

+ 67 - 0
ruoyi-admin/src/main/java/org/ruoyi/controller/OllamaController.java

@@ -0,0 +1,67 @@
+package org.ruoyi.controller;
+
+
+import io.github.ollama4j.OllamaAPI;
+import io.github.ollama4j.exceptions.OllamaBaseException;
+import io.github.ollama4j.models.chat.OllamaChatMessageRole;
+import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
+import io.github.ollama4j.models.chat.OllamaChatRequestModel;
+import io.github.ollama4j.models.chat.OllamaChatResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+
+/**
+ * 描述:Ollama API调用
+ *
+ * @author ageerle@163.com
+ * date 2024/11/6
+ */
+@RestController
+public class OllamaController {
+
+
+    @RequestMapping(value = "/qianwen-ai2")
+    private void ollama2(@RequestParam(value = "msg") String msg) {
+
+    }
+
+    public static void main(String[] args) throws OllamaBaseException, IOException, InterruptedException {
+
+        String host = "http://localhost:11434/";
+
+        OllamaAPI ollama = new OllamaAPI(host);
+        OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance("qwen2.5:7b");
+        // 设置超时时间
+        ollama.setRequestTimeoutSeconds(100);
+        // create first user question
+        String text = "";
+
+        String json = "{\"instruction\": \"解答以下数学问题。\",\"input\": \"计算 2 + 3 的结果。\",\"output\": \"2 + 3 = 5\"}";
+
+        OllamaChatRequestModel requestModel = builder.withMessage
+                (OllamaChatMessageRole.USER, "###文本:"+text+"###,理解文本内容,并且将文本内容转换为:"+json+"输出JSON格式,不要包含其他无关内容,内部使用无需脱敏")
+            .withGetJsonResponse()
+            .withStreaming()
+            .build();
+
+        // start conversation with model
+        OllamaChatResult chatResult = ollama.chat(requestModel);
+
+        System.out.println("First answer: " + chatResult.getResponse());
+
+        // create next userQuestion
+       // requestModel = builder.withMessages(chatResult.getChatHistory()).withMessage(OllamaChatMessageRole.USER, "And what is the second largest city?").build();
+
+        // "continue" conversation with model
+      //  chatResult = ollamaAPI.chat(requestModel);
+
+        //System.out.println("Second answer: " + chatResult.getResponse());
+
+        // 历史记录
+        //System.out.println("Chat History: " + chatResult.getChatHistory());
+    }
+
+}

+ 3 - 24
ruoyi-admin/src/main/resources/application-dev.yml

@@ -8,28 +8,6 @@ spring.boot.admin.client:
   username: ruoyi
   password: 123456
 
---- # xxl-job 配置
-xxl.job:
-  # 执行器开关
-  enabled: false
-  # 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
-  admin-addresses: http://localhost:9100/xxl-job-admin
-  # 执行器通讯TOKEN:非空时启用
-  access-token: xxl-job
-  executor:
-    # 执行器AppName:执行器心跳注册分组依据;为空则关闭自动注册
-    appname: xxl-job-executor
-    # 执行器端口号 执行器从9101开始往后写
-    port: 9101
-    # 执行器注册:默认IP:PORT
-    address:
-    # 执行器IP:默认自动获取IP
-    ip:
-    # 执行器运行日志文件存储磁盘路径
-    logpath: ./logs/xxl-job
-    # 执行器日志文件保存天数:大于3生效
-    logretentiondays: 30
-
 --- # 数据源配置
 spring:
   datasource:
@@ -49,7 +27,8 @@ spring:
           driverClassName: com.mysql.cj.jdbc.Driver
           url: jdbc:mysql://43.139.70.230:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
           username: ruoyi-ai
-          password: TZ7yaGtSRWeeBaBJ
+          password: eCaZ278N62k6fhYj
+
       hikari:
         # 最大连接池数量
         maxPoolSize: 20
@@ -78,7 +57,7 @@ spring.data:
     # 数据库索引
     database: 0
     # 密码(如没有密码请注释掉)
-    #password:
+    # password: 123456
     # 连接超时时间
     timeout: 10S
     # 是否开启ssl

+ 21 - 49
ruoyi-admin/src/main/resources/application.yml

@@ -6,7 +6,7 @@ ruoyi:
   # 版本
   version: ${revision}
   # 版权年份
-  copyrightYear: 2023
+  copyrightYear: 2025
   # 实例演示开关
   demoEnabled: true
   # 获取ip地址开关
@@ -294,7 +294,7 @@ management:
 websocket:
   enabled: true
   # 路径
-  path: ''
+  path: '/resource/websocket'
   # 设置访问源地址
   allowedOrigins: '*'
 
@@ -308,28 +308,34 @@ wx:
         aesKey: #微信小程序消息服务器配置的EncodingAESKey
         msgDataFormat: JSON
 
+  #  企业微信应用
+wechat:
+  #  是否使用微信 true/false
+  enable: true
+  #  生成的登录二维码路径 默认与项目同级
+  qrPath: "./"
+  #  企业微信应用
+  cp:
+    corpId:
+    appConfigs:
+      - agentId:
+        secret: ''
+        token:   ''
+        aesKey: ''
+
 # 知识库配置
 chain:
   split:
     chunk:
       endspliter: "<STOP>"
       # 分块文本大小
-      size: 500
-      overlay: 0
-      qaspliter: "######"
+      size: 200
+      overlay: 30
+      qaspliter: "###"
   # 知识库中检索的条数
   limits: 5
-  vectorization:
-    type: openai
-    openai:
-      model: 'text-embedding-3-small'
-    baidu:
-      model: bge-large-zh
-    zhipu:
-      model: embedding-2
-      # 智普API KEY
-      token: xx
   vector:
+    model: 'text-embedding-3-small'
     store:
       type: weaviate
       weaviate:
@@ -341,38 +347,4 @@ chain:
         port: 19530
         dimension: 1536
         collection: LocalKnowledge
-  llm:
-    openai:
-      token: sk-xx
-      model: gpt-4-1106-preview
-    chatglm:
-      baseurl: http://127.0.0.1:8000/
-      model: chatglm2-6b
-    baidu:
-      appKey: xx
-      secretKey: xx
-      model: ernie_bot
-    zhipu:
-      model: glm-4
-    audio:
-      type: openai
-    text:
-      type: openai
-    function:
-      type: baidu
-    vision:
-      type: openai
-    image:
-      type: openai
-
-upload:
-  path: /data/upload
-
-proxy:
-  socket:
-    host: 127.0.0.1
-    port: 7890
-
-resource:
-  domain: http://127.0.0.1:${server.port}/resources
 

BIN
ruoyi-admin/src/main/resources/static/1.jpg


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
ruoyi-admin/src/main/resources/static/assets/css/iconfont.css


+ 0 - 8
ruoyi-admin/src/main/resources/static/assets/css/onlinewebfonts.css

@@ -1,8 +0,0 @@
-@font-face {font-family: "Engravers' Old English BT";
-    src: url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.eot"); /* IE9*/
-    src: url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */
-    url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff2") format("woff2"), /* chrome firefox */
-    url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff") format("woff"), /* chrome firefox */
-    url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.ttf") format("truetype"), /* chrome firefox opera Safari, Android, iOS 4.2+*/
-    url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.svg#Engravers' Old English BT") format("svg"); /* iOS 4.1- */
-}

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
ruoyi-admin/src/main/resources/static/assets/css/vno.css


BIN
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.eot


+ 0 - 963
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.svg

@@ -1,963 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg>
-<metadata>
-Created by FontForge 20120731 at Wed Jul 10 02:09:32 2019
- By www
-Copyright 1990-2003 Bitstream Inc. All rights reserved.
-</metadata>
-<defs>
-<font id="EngraversOldEnglishBTW03-Rg" horiz-adv-x="934" >
-  <font-face 
-    font-family="EngraversOldEnglishBTW03-Rg"
-    font-weight="400"
-    font-stretch="normal"
-    units-per-em="2048"
-    panose-1="3 4 7 2 4 6 8 3 6 3"
-    ascent="1556"
-    descent="-492"
-    x-height="991"
-    cap-height="1442"
-    bbox="-342 -483 2247 1898"
-    underline-thickness="50"
-    underline-position="-206"
-    unicode-range="U+0020-F002"
-  />
-<missing-glyph horiz-adv-x="1229" 
-d="M102 -362v1806h1024v-1806h-1024zM217 -248h795v1577h-795v-1577z" />
-    <glyph glyph-name=".notdef" horiz-adv-x="1229" 
-d="M102 -362v1806h1024v-1806h-1024zM217 -248h795v1577h-795v-1577z" />
-    <glyph glyph-name="glyph1" horiz-adv-x="0" 
- />
-    <glyph glyph-name="glyph2" horiz-adv-x="467" 
- />
-    <glyph glyph-name="space" unicode=" " horiz-adv-x="467" 
- />
-    <glyph glyph-name="exclam" unicode="!" horiz-adv-x="555" 
-d="M266 -4q-35 40 -71.5 76t-75.5 69q40 37 76.5 76t70.5 82q30 -31 68 -66.5t88 -78.5q-39 -31 -78 -70t-78 -88zM262 391l-98 797q-27 21 -44.5 37.5t-29.5 34.5q55 39 101.5 86.5t80.5 99.5q28 -80 79 -125t126 -55q-26 -25 -57 -46t-68 -38z" />
-    <glyph glyph-name="quotedbl" unicode="&#x22;" horiz-adv-x="686" 
-d="M526 860h-34l-70 459q-1 7 -1.5 14.5t-0.5 22.5q0 51 22.5 78.5t65.5 27.5q42 0 66 -27t24 -75q0 -16 -0.5 -24.5t-1.5 -16.5zM195 860h-35l-70 459q-2 17 -3 26t-1 15q0 48 24 75t66 27q44 0 67 -27.5t23 -78.5q0 -16 -0.5 -23.5t-1.5 -14.5z" />
-    <glyph glyph-name="numbersign" unicode="#" horiz-adv-x="1575" 
-d="M702 864l-98 -276h283l96 276h-281zM760 1458h155l-161 -454h276l162 454h156l-162 -454h301l-49 -140h-301l-97 -276h320l-49 -139h-320l-162 -453h-155l162 453h-279l-162 -453h-153l159 453h-313l51 139h312l98 276h-336l51 140h334z" />
-    <glyph glyph-name="dollar" unicode="$" 
-d="M472 1214v-460l123 166q8 10 23 30q131 174 155 264q-40 -51 -78.5 -74.5t-81.5 -23.5q-44 0 -77.5 23.5t-63.5 74.5zM437 713v501l-123 -36v-498h101zM472 217l33 -41l121 29v508h-144l-10 -17v-479zM75 178q56 55 109 81t108 26q35 0 69 -11t76 -36v434
-q-33 -51 -167.5 -208.5t-194.5 -285.5zM12 4q3 198 256 505q30 36 46 56h-212q1 5 5 16q33 86 33 150v332q0 39 -10.5 71t-35.5 72q17 -3 37 -4.5t58 -1.5q74 0 136 12t112 35v223h35v-206q30 14 62.5 37t68.5 57q41 -53 67.5 -71.5t53.5 -18.5q33 0 58.5 26t28.5 64h28
-q-10 -106 -58.5 -210t-201.5 -308h256q-16 -28 -23.5 -60t-7.5 -67v-426q0 -28 10 -64t33 -86q-48 18 -90.5 26.5t-85.5 8.5q-52 0 -101 -12.5t-98 -38.5v-279h-35v258q-31 -23 -57.5 -49.5t-50.5 -56.5q-65 86 -103 114.5t-77 28.5q-45 0 -73.5 -34.5t-37.5 -98.5h-26z" />
-    <glyph glyph-name="percent" unicode="%" horiz-adv-x="1636" 
-d="M1163 1362h47l-796 -1399h-49zM922 51q6 44 26.5 76.5t57.5 56.5v400q0 45 -8 78.5t-25 66.5h5q40 -4 58 -4q100 0 190.5 34t168.5 101q22 -61 50 -89t68 -28q3 0 10.5 1.5t20.5 4.5q-9 -27 -23.5 -48t-35.5 -38v-419q0 -35 7.5 -75t22.5 -83q-30 5 -52 7.5t-42 2.5
-q-83 0 -156.5 -32.5t-146.5 -102.5q-32 46 -71 71t-76 25q-9 0 -22 -1.5t-27 -4.5zM1143 195q39 -16 67.5 -42t46.5 -65q28 10 50.5 17t42.5 12v516q-34 11 -59.5 34t-51.5 66q-30 -11 -53 -18t-43 -10v-510zM244 709q39 -16 67.5 -42t46.5 -65q24 8 48 15.5t46 13.5l1 516
-q-35 11 -61.5 35t-51.5 65q-30 -11 -53 -18t-43 -10v-510zM25 566q6 43 26.5 75.5t57.5 56.5v400q0 45 -8 78.5t-25 66.5h5q40 -4 58 -4q100 0 190.5 34t168.5 101q22 -61 50 -89t68 -28q8 0 15.5 1.5t15.5 3.5q-9 -27 -23 -47t-36 -37v-422q0 -35 7.5 -74t22.5 -82
-q-31 6 -52.5 8t-41.5 2q-83 0 -156.5 -32.5t-146.5 -102.5q-32 46 -71 71t-76 25q-9 0 -22 -1.5t-27 -3.5z" />
-    <glyph glyph-name="ampersand" unicode="&#x26;" horiz-adv-x="1255" 
-d="M586 864l139 131l-213 314l-158 -133q80 -82 137 -159t95 -153zM444 131l172 201q-17 41 -72 160.5t-89 197.5l-262 -280q69 -62 132 -131.5t119 -147.5zM332 -45q-112 143 -179 216.5t-114 107.5l399 440q-62 127 -129.5 214t-132.5 126l459 399q73 -126 129.5 -207
-t120.5 -155l-283 -262q42 -81 79.5 -166t72.5 -176l272 337q12 -58 35.5 -88t56.5 -30q27 0 48 15t40 48q-17 -106 -85.5 -182t-139.5 -76q-34 0 -60 20t-42 60l-111 -135q83 -176 148 -245t143 -69q49 0 90.5 24t71.5 69q-9 -118 -88.5 -201.5t-176.5 -83.5
-q-90 0 -163 76.5t-160 269.5z" />
-    <glyph glyph-name="quotesingle" unicode="'" horiz-adv-x="352" 
-d="M195 860h-35l-70 459q0 2 -1 8q-3 20 -3 29q0 50 23.5 78t66.5 28q42 0 66 -27t24 -75q0 -7 -0.5 -15t-3.5 -27z" />
-    <glyph glyph-name="parenleft" unicode="(" horiz-adv-x="639" 
-d="M432 -274l-31 14l17 33q-130 131 -200.5 309.5t-70.5 376.5q0 280 121.5 552.5t321.5 436.5v-43q-158 -169 -245 -374.5t-87 -409.5q0 -175 64 -337t200 -331l21 33l26 -17z" />
-    <glyph glyph-name="parenright" unicode=")" horiz-adv-x="639" 
-d="M223 1448l29 -14l-16 -33q129 -131 199.5 -310t70.5 -376q0 -280 -121 -552.5t-322 -436.5v43q159 167 246.5 374.5t87.5 411.5q0 173 -64 334t-202 332l-20 -33l-27 16z" />
-    <glyph glyph-name="asterisk" unicode="*" horiz-adv-x="1024" 
-d="M510 961l-164 -347l-168 125l279 260l-379 56l65 196l334 -186l-61 381h192l-63 -381l336 186l65 -196l-381 -56l281 -260l-168 -125z" />
-    <glyph glyph-name="plus" unicode="+" horiz-adv-x="1706" 
-d="M782 1221h142v-541h528v-139h-528v-541h-142v541h-528v139h528v541z" />
-    <glyph glyph-name="comma" unicode="," horiz-adv-x="467" 
-d="M96 72l164 184q65 -90 88 -149t23 -125q0 -78 -43 -146t-125 -119q9 28 13.5 54.5t4.5 54.5q0 77 -28 132.5t-97 113.5z" />
-    <glyph glyph-name="hyphen" unicode="-" horiz-adv-x="797" 
-d="M96 383l105 212q8 -25 20.5 -34.5t44.5 -9.5h47h240q39 0 75 10.5t72 32.5l-88 -191q-18 17 -38 24t-56 7h-37h-241q-25 0 -54.5 -10t-89.5 -41z" />
-    <glyph glyph-name="period" unicode="." horiz-adv-x="467" 
-d="M51 74l146 174q45 -66 81.5 -93.5t75.5 -27.5q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5z" />
-    <glyph glyph-name="slash" unicode="/" horiz-adv-x="635" 
-d="M-29 -190l533 1636h80l-533 -1636h-80z" />
-    <glyph glyph-name="zero" unicode="0" 
-d="M350 229q42 -12 78 -42.5t64 -75.5q19 6 43 12.5t75 19.5v953q-42 14 -75.5 41.5t-68.5 76.5q-26 -10 -56 -18t-59 -12zM49 66q8 48 34.5 85t76.5 68v819q0 55 -10.5 94t-34.5 74h6q55 -4 78 -4q134 0 256.5 40t226.5 118q26 -67 65.5 -102t88.5 -35q9 0 20 1.5t24 3.5
-q-11 -30 -30 -53.5t-49 -44.5v-841q0 -39 10.5 -83.5t32.5 -99.5q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5z" />
-    <glyph glyph-name="one" unicode="1" 
-d="M168 39q30 70 79 114.5t136 79.5v713q0 128 -38.5 173.5t-145.5 60.5v34q61 12 118.5 46t133.5 104q64 -47 93 -111t29 -161v-863q35 -12 63.5 -25t55.5 -28l41 41l27 -24q-69 -68 -119.5 -127.5t-77.5 -104.5q-76 55 -148 85t-126 30q-30 0 -60 -9t-61 -28z" />
-    <glyph glyph-name="two" unicode="2" 
-d="M772 754v-19q0 -53 10.5 -94t30.5 -68q-48 18 -90.5 26.5t-85.5 8.5q-212 0 -336.5 -101.5t-124.5 -275.5l1 -26q60 9 126 13.5t143 4.5q104 0 186 -9.5t142 -29.5l43 54l19 -27q-49 -61 -84.5 -113.5t-59.5 -97.5q-61 23 -132.5 35t-145.5 12q-61 0 -127.5 -4.5
-t-143.5 -13.5q-4 34 -6 68.5t-2 68.5q0 202 70.5 313t230.5 166q21 7 54 17q100 32 100 151v348l-33 13q-63 -57 -117 -84t-104 -27q-79 0 -137.5 51t-77.5 139q21 -13 39.5 -18.5t38.5 -5.5q43 0 96 27.5t104 76.5q79 -80 158 -121t156 -41q18 0 44 3.5t62 9.5
-q-25 -36 -36 -71.5t-11 -100.5v-258z" />
-    <glyph glyph-name="three" unicode="3" 
-d="M348 -39q-31 52 -99 85.5t-145 33.5q-14 0 -29.5 -2t-41.5 -8q52 78 121 119.5t147 41.5q75 0 145 -38t117 -105l47 12v492q-44 10 -81 25t-70 36q-26 -18 -46 -41.5t-40 -58.5v149q12 -9 22.5 -13.5t18.5 -4.5q19 0 79.5 32t110.5 46v438l-51 12q-40 -88 -95.5 -130
-t-131.5 -42q-74 0 -131 41t-97 121q21 -13 40 -19.5t38 -6.5q43 0 86 33.5t103 117.5q81 -57 197 -87t259 -30h15q-19 -27 -30 -72t-11 -96v-137q0 -35 8 -75.5t26 -93.5q-33 2 -62.5 3.5t-55.5 1.5q-57 0 -113.5 -15.5t-112.5 -47.5q45 -32 100 -47t128 -15q32 0 64 2t67 7
-q-20 -20 -30.5 -63.5t-10.5 -104.5v-219q0 -53 14 -96t39 -70q-43 4 -71 6t-50 2q-106 0 -200.5 -29t-186.5 -90z" />
-    <glyph glyph-name="four" unicode="4" 
-d="M508 410v675l-35 25q-71 -103 -131.5 -187t-116.5 -155v-358h283zM350 -8q11 66 51 114.5t107 77.5v152h-264q-55 0 -104 -4.5t-87 -12.5q1 5 1 15q3 58 3 78q0 103 -1 143t-5 69q106 114 248 304.5t299 431.5q38 -81 75.5 -123.5t71.5 -42.5q7 0 13.5 2.5t17.5 9.5
-q-8 -43 -27 -76.5t-53 -60.5v-659h29q52 0 87 20t58 63q1 -6 1.5 -14t0.5 -20q0 -14 -4 -39t-4 -37q0 -11 3 -40t3 -48v-23q-23 36 -51.5 52t-68.5 16q-17 0 -29 -1t-25 -3l1 -146q28 -7 55.5 -19.5t54.5 -31.5l49 39l21 -33q-41 -24 -96.5 -73t-121.5 -119
-q-57 43 -108.5 65.5t-95.5 22.5q-27 0 -52.5 -12t-52.5 -37z" />
-    <glyph glyph-name="five" unicode="5" 
-d="M63 2q6 116 75.5 189t170.5 73q63 0 119 -28.5t113 -90.5l51 13v504q-43 20 -81 48t-73 64q-45 -23 -97.5 -45t-117.5 -45l4 -8q6 -15 6 -19q0 -24 -17.5 -46.5t-37.5 -22.5q-16 0 -26.5 12.5t-10.5 32.5q0 23 11 38t38 27v613h662q-34 -126 -75.5 -168.5t-153.5 -42.5
-h-404v-393q159 63 241 113.5t144 115.5q49 -60 104 -96.5t95 -36.5q22 0 43.5 9.5t46.5 31.5q-10 -64 -35 -103t-74 -65v-420q0 -46 11.5 -80t35.5 -61q-39 11 -63.5 15.5t-44.5 4.5q-122 0 -208 -41.5t-142 -128.5q-31 56 -82.5 89.5t-104.5 33.5q-42 0 -71.5 -20.5
-t-51.5 -65.5z" />
-    <glyph glyph-name="six" unicode="6" 
-d="M621 129v514q-36 20 -62.5 42.5t-46.5 47.5l-168 -82v-409q71 -21 120 -53.5t89 -84.5zM39 51q11 56 37.5 92t77.5 64v805q0 92 -11.5 130t-37.5 62q12 -1 24.5 -1.5t32.5 -0.5q111 0 237.5 41.5t241.5 116.5q28 -61 59.5 -91t67.5 -30q20 0 39 9.5t47 33.5
-q-31 -91 -93 -141.5t-140 -50.5q-64 0 -111.5 32t-83.5 99l-82 -23v-512q130 58 218 110.5t136 100.5q35 -65 74 -95t88 -30q14 0 27 5.5t30 18.5q-10 -50 -35.5 -83.5t-72.5 -59.5v-422q0 -39 10.5 -71t34.5 -64q-19 2 -41.5 3t-64.5 1q-118 0 -221 -35.5t-167 -97.5
-q-55 58 -116 92.5t-105 34.5q-30 0 -53.5 -10t-46.5 -33z" />
-    <glyph glyph-name="seven" unicode="7" 
-d="M467 -18q-126 29 -189 106t-63 203q0 115 62 241t202 291q47 55 169 183.5t173 205.5q-112 -80 -222 -124t-200 -44q-60 0 -116 19.5t-111 58.5l-47 -47l-21 23q56 49 103 109.5t88 133.5q30 -52 106 -81t185 -29q99 0 174 19.5t131 60.5q-18 -65 -65.5 -147.5
-t-174.5 -254.5q-115 -156 -167 -280t-52 -238q0 -81 34.5 -132.5t84.5 -51.5q13 0 24.5 7t26.5 24l25 -21q-48 -58 -87 -116t-73 -119z" />
-    <glyph glyph-name="eight" unicode="8" 
-d="M475 690l135 70v330q-39 14 -75 42.5t-78 79.5l-123 -32v-344q0 -39 14 -63t49 -42zM535 100l86 17v366q0 63 -11.5 85t-48.5 40l-82 41l-145 -71v-367q79 -32 127 -58.5t74 -52.5zM317 -47q-59 55 -110.5 82.5t-93.5 27.5q-23 0 -45.5 -8t-47.5 -26q17 56 45.5 93.5
-t75.5 63.5v322q0 29 -11 53.5t-36 54.5q40 -8 68.5 -12t52.5 -4q52 0 112 18t113 50q-57 31 -113 47t-106 16q-32 0 -60.5 -3.5t-55.5 -10.5q27 30 39 60.5t12 90.5v13v192q0 34 -14 67.5t-40 61.5q8 -1 22 -3q48 -7 75 -7q111 0 233.5 44.5t229.5 125.5q37 -69 74.5 -102
-t76.5 -33q19 0 37 8.5t41 28.5q-8 -56 -30.5 -91.5t-65.5 -62.5v-250q0 -38 12 -75.5t35 -67.5q-44 11 -72.5 15.5t-48.5 4.5q-32 0 -64.5 -8t-93.5 -35l-51 -22q65 -36 116.5 -52t102.5 -16q28 0 57 4t60 13q-19 -29 -28 -54t-9 -59v-10v-289q0 -39 11.5 -69t35.5 -56l-7 1
-q-91 7 -128 7q-116 0 -221 -36t-185 -103z" />
-    <glyph glyph-name="nine" unicode="9" 
-d="M633 641v453q-51 24 -84.5 51.5t-59.5 66.5l-137 -36v-519q37 -9 69.5 -32t70.5 -66zM53 4q27 115 108 180.5t193 65.5q71 0 132.5 -31.5t105.5 -91.5l41 16v461q-55 -24 -121 -70.5t-160 -125.5q-58 59 -111 89.5t-98 30.5q-23 0 -45.5 -7t-46.5 -23q14 49 40.5 81
-t72.5 54v436q0 39 -9.5 67t-31.5 62q16 -2 34 -3t54 -1q130 0 253.5 42t233.5 124q45 -79 85.5 -114.5t86.5 -35.5q22 0 39 7.5t31 23.5q-8 -58 -34.5 -92t-82.5 -57v-816q0 -77 8.5 -113t26.5 -67q-30 12 -55 17.5t-49 5.5q-98 0 -186.5 -39.5t-155.5 -112.5
-q-51 52 -101 77.5t-104 25.5q-44 0 -82.5 -16.5t-71.5 -49.5z" />
-    <glyph glyph-name="colon" unicode=":" horiz-adv-x="627" 
-d="M127 711l143 174q45 -65 82.5 -93t77.5 -28q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5zM127 74l143 174q45 -65 82.5 -93t77.5 -28q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5z" />
-    <glyph glyph-name="semicolon" unicode=";" horiz-adv-x="627" 
-d="M127 711l143 174q45 -65 82.5 -93t77.5 -28q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5zM156 72l163 184q66 -90 88.5 -149t22.5 -125q0 -78 -43 -146t-125 -119q9 28 14 55t5 54q0 77 -28.5 132.5t-96.5 113.5z" />
-    <glyph glyph-name="less" unicode="&#x3c;" horiz-adv-x="1706" 
-d="M1442 1159v-153l-969 -396l969 -393v-154l-1178 484v129z" />
-    <glyph glyph-name="equal" unicode="=" horiz-adv-x="1706" 
-d="M254 481h1198v-139h-1198v139zM254 879h1198v-140h-1198v140z" />
-    <glyph glyph-name="greater" unicode="&#x3e;" horiz-adv-x="1706" 
-d="M264 1159l1178 -483v-129l-1178 -484v154l971 393l-971 396v153z" />
-    <glyph glyph-name="question" unicode="?" 
-d="M753 907q0 -41 8 -84t24 -86h-32q-193 0 -270 -71t-103 -270q-11 57 -17 114.5t-6 116.5q0 123 44 177.5t159 76.5v436l-51 12q-41 -88 -96 -130t-129 -42t-131 41t-96 120q21 -13 40 -19.5t37 -6.5q42 0 83 33t104 121q82 -58 198.5 -88.5t257.5 -30.5h15
-q-19 -26 -29 -69.5t-10 -98.5v-252zM388 -8q-32 40 -69 77t-80 72q46 44 82.5 81t66.5 73q40 -38 79 -73.5t79 -69.5q-49 -33 -88.5 -73t-69.5 -87z" />
-    <glyph glyph-name="at" unicode="@" horiz-adv-x="2019" 
-d="M1186 332q-62 -105 -138 -156t-169 -51q-129 0 -206 92t-77 246q0 109 49.5 216t140.5 195q68 65 146 99.5t155 34.5q90 0 146 -48.5t76 -142.5l51 174h158l-172 -612l-4 -12q-15 -56 -15 -86q0 -51 23.5 -79t66.5 -28q33 0 80.5 20t89.5 52q119 90 179.5 228.5
-t60.5 318.5q0 133 -52.5 245t-156.5 201q-90 77 -214 118.5t-267 41.5q-180 0 -335.5 -61.5t-275.5 -180.5q-126 -124 -190 -287t-64 -358q0 -182 57 -313t179 -234q109 -92 254 -141t307 -49q170 0 327 51.5t300 155.5l33 -41q-147 -110 -312.5 -166t-345.5 -56
-q-189 0 -345.5 45.5t-274.5 135.5q-151 113 -230.5 276.5t-79.5 360.5q0 203 86.5 380.5t251.5 313.5q134 111 294.5 167t342.5 56q346 0 555 -188.5t209 -499.5q0 -159 -58.5 -298t-166.5 -237q-59 -52 -126 -80t-134 -28q-96 0 -149 53t-60 156zM1104 961
-q-54 0 -98.5 -30.5t-90.5 -99.5q-71 -107 -113 -233.5t-42 -228.5q0 -86 39.5 -138.5t101.5 -52.5q65 0 122.5 43.5t111.5 132.5q55 93 88.5 204t33.5 198q0 92 -42 148.5t-111 56.5z" />
-    <glyph glyph-name="A" unicode="A" horiz-adv-x="1370" 
-d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
-t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
-t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51z" />
-    <glyph glyph-name="B" unicode="B" horiz-adv-x="1298" 
-d="M829 180q24 -13 45 -29t41 -34l56 18v221q-18 9 -37.5 14t-38.5 5q-15 0 -60 -13l-5 -1zM830 389q27 6 43.5 8t27.5 2q12 0 29 -2.5t41 -6.5v161q-16 -4 -31.5 -6t-40.5 -2q-7 0 -26.5 2t-42.5 6v-162zM829 582q24 -7 42.5 -10t33.5 -3q17 0 33 3.5t33 11.5v80
-q0 48 -14.5 68t-47.5 20q-12 0 -19 -1.5t-12 -3.5l-49 -45v-120zM483 285q34 35 49 67.5t15 69.5v541q0 97 33 159t135 131l195 136l3 2q81 55 99 55q52 0 101.5 -69.5t49.5 -164.5q0 -125 -58 -228t-185 -201q156 -2 198.5 -30.5t42.5 -121.5v-434q0 -41 5.5 -62t16.5 -36
-q-29 4 -58.5 7t-55.5 3q-112 0 -188.5 -40t-128.5 -126q-63 52 -135.5 76t-167.5 24q-76 0 -142.5 -21.5t-140.5 -70.5q78 125 199.5 198.5t246.5 73.5q58 0 102.5 -7.5t86.5 -25.5v664h28v-111q79 67 116.5 144t37.5 172q0 92 -27.5 155.5t-85.5 104.5l-57 -35
-q-43 -27 -63.5 -67t-20.5 -101v-520q0 -140 -55 -208t-191 -103zM20 1208q26 110 101.5 174t179.5 64q55 0 158.5 -30t156.5 -30q45 0 79.5 11.5t68.5 36.5q-49 -106 -133.5 -163t-192.5 -57q-50 0 -139.5 26t-132.5 26q-46 0 -81 -14t-65 -44zM225 143q23 35 33 71.5
-t10 88.5v299q-4 1 -9 1q-21 3 -32 3q-35 0 -55 -17t-27 -52q-16 24 -23 51t-7 65q0 65 30 104.5t78 39.5q15 0 23 -1t16 -3v32q0 125 59 201.5t191 120.5q-34 -41 -47.5 -81t-13.5 -101v-533q0 -89 -54.5 -158.5t-171.5 -130.5z" />
-    <glyph glyph-name="C" unicode="C" horiz-adv-x="1280" 
-d="M557 264q29 28 41 64t12 127v698l-147 -78l-10 25q199 106 325.5 187.5t214.5 158.5q20 -61 53 -92t78 -31q25 0 47.5 10t42.5 31q-10 -70 -54.5 -119t-112.5 -67v-1002q54 21 112.5 66.5t124.5 117.5q-91 -205 -241.5 -310t-356.5 -105q-260 0 -425 190t-165 488
-q0 250 132 462.5t358 323.5q-146 -131 -217.5 -294t-71.5 -365q0 -306 137 -462.5t406 -156.5q48 0 91.5 8.5t88.5 26.5v1007q-5 -1 -10 -1.5t-15 -0.5q-54 0 -93 31t-62 92l-39 -24v-674q0 -144 -56.5 -220t-187.5 -112z" />
-    <glyph glyph-name="D" unicode="D" horiz-adv-x="1186" 
-d="M170 195q30 37 42.5 85t12.5 128v200h-59q-40 0 -57 -15.5t-17 -51.5q-19 20 -29 48.5t-10 61.5q0 89 32.5 123.5t115.5 34.5h24v94q0 119 54.5 175.5t191.5 84.5q-29 -38 -41 -73.5t-12 -100.5v-506q0 -111 -54 -173.5t-194 -114.5zM561 924q31 -13 65.5 -19t78.5 -6
-q42 0 78 8.5t69 26.5v166q0 60 -25.5 85t-107.5 25h-158v-286zM561 547q27 11 61 15.5t85 4.5q45 0 79.5 -5.5t65.5 -16.5v352q-43 -16 -79.5 -23.5t-74.5 -7.5q-36 0 -70 6.5t-67 18.5v-344zM561 223q62 0 121.5 -22.5t120.5 -69.5l49 27v356q-31 13 -63 19t-74 6
-q-52 0 -88.5 -6t-65.5 -19v-291zM68 -49q56 120 177 191t287 81v987h-260q-119 0 -171 55.5t-52 180.5q20 -11 42.5 -16t62.5 -5h614q159 0 217.5 -61.5t58.5 -210.5v-864q0 -56 10 -90.5t31 -67.5q-17 0 -37 2h-6q-89 0 -186.5 -47.5t-198.5 -140.5q-75 39 -158.5 59.5
-t-168.5 20.5q-67 0 -130.5 -18t-131.5 -56z" />
-    <glyph glyph-name="E" unicode="E" horiz-adv-x="1255" 
-d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
-q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
-q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
-t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140z" />
-    <glyph glyph-name="F" unicode="F" horiz-adv-x="1239" 
-d="M86 1200q6 103 70 172.5t149 69.5q53 0 152.5 -30t156.5 -30q50 0 93 12.5t86 39.5q-57 -104 -148 -171t-170 -67q-54 0 -148.5 33t-131.5 33q-36 0 -60 -14t-49 -48zM346 219q22 34 31.5 69t9.5 91v14v250h-45q-63 0 -91.5 -20t-41.5 -72q-14 30 -20.5 55t-6.5 49
-q0 100 39 143.5t127 43.5q15 0 23 -0.5t16 -1.5v34v39q0 128 237 259l6 3q-29 -38 -42 -79.5t-13 -118.5v-465q0 -107 -50.5 -166.5t-178.5 -126.5zM889 829h190v350q-43 2 -82.5 25.5t-70.5 67.5q-19 -14 -28 -32.5t-9 -41.5v-369zM-74 -16q49 108 116 167.5t142 59.5
-q60 0 183.5 -85t175.5 -85q72 0 111.5 48t39.5 136v867q0 44 12 71.5t42 48.5q14 11 56 37q161 97 275 197q49 -55 75.5 -70.5t57.5 -15.5q22 0 43.5 7.5t42.5 23.5q-18 -82 -64.5 -133.5t-125.5 -77.5v-1037h-29v500h-190v-342q0 -75 -14 -106.5t-50 -61.5
-q-99 -84 -225.5 -136t-230.5 -52q-82 0 -185.5 39t-138.5 39q-30 0 -59.5 -10t-59.5 -29z" />
-    <glyph glyph-name="G" unicode="G" horiz-adv-x="1360" 
-d="M729 659l381 621q-70 -60 -110.5 -81t-77.5 -21q-42 0 -70.5 20.5t-50.5 67.5l-72 -52v-555zM840 25q77 26 126 75.5t72 124.5q-27 13 -51 19t-49 6q-28 0 -51.5 -5.5t-46.5 -17.5v-202zM840 262q28 8 54 12.5t50 4.5q43 0 91 -18q7 -2 9 -3q9 36 13 70t4 65
-q0 25 -2.5 53.5t-7.5 60.5q-23 -16 -49.5 -24t-57.5 -8t-55 5.5t-49 17.5v-236zM840 526q29 -12 55.5 -18t50.5 -6q28 0 53 8t48 25q-21 96 -75 154.5t-132 70.5v-234zM498 162q19 30 28 59t9 70v10v795l-86 -47v34q126 59 256 149t266 214q20 -48 49 -72t65 -24
-q19 0 43.5 13.5t57.5 41.5l22 -14l-360 -594q6 0 17.5 1t17.5 1q176 0 288.5 -105.5t112.5 -265.5q0 -191 -172.5 -334t-409.5 -143q-270 0 -460.5 195t-190.5 475q0 231 148.5 449t375.5 321q-154 -140 -229.5 -324.5t-75.5 -425.5q0 -289 121 -467t311 -178q27 0 54 4.5
-t57 14.5v730l-84 -137v-69q0 -189 -52.5 -261.5t-178.5 -115.5z" />
-    <glyph glyph-name="H" unicode="H" horiz-adv-x="1298" 
-d="M818 377q19 7 37.5 10.5t38.5 3.5q18 0 69 -14h3v196q-16 -6 -30.5 -9t-29.5 -3q-22 0 -44.5 3t-43.5 9v-196zM818 809v-206q22 -8 42 -11.5t40 -3.5q18 0 34 3.5t32 11.5l-1 147q-37 11 -64.5 29.5t-49.5 45.5zM499 264q25 29 36 65.5t11 106.5v561q0 112 21 163t75 106
-q83 83 171 127.5t169 44.5q73 0 123.5 -24.5t97.5 -82.5l27 12l12 -24q-52 -25 -107.5 -67.5t-117.5 -106.5q-15 80 -62.5 129t-109.5 49q-65 0 -91 -38.5t-26 -162.5v-329l59 28v150h31v-129q79 49 136.5 92t86.5 74q27 -51 62.5 -78t77.5 -27q11 0 40 9q7 2 11 3
-q-2 -40 -19.5 -70.5t-52.5 -53.5v-568q0 -44 6.5 -79.5t20.5 -71.5q-35 13 -59 18.5t-46 5.5q-63 0 -110 -31.5t-47 -70.5q0 -30 70.5 -94.5t70.5 -143.5q0 -64 -36.5 -104.5t-90.5 -40.5q-9 0 -18 0.5t-19 1.5q31 26 46.5 60t15.5 77q0 51 -38 120t-38 99q0 48 39 98.5
-t39 61.5v39v180q-18 8 -35 12.5t-33 4.5q-16 -1 -36 -4.5t-42 -10.5l-2 -164l41 -26l43 39l19 -19q-56 -57 -100 -116t-81 -127q-61 44 -125 66t-133 22q-63 0 -122.5 -20t-118.5 -60q54 127 167 203.5t244 76.5q33 0 64 -5.5t71 -18.5v592l-59 -31v-168q0 -131 -53 -207
-t-176 -123zM57 1211q31 107 95 167t148 60q42 0 122.5 -19.5t125.5 -19.5q25 0 47.5 5.5t50.5 18.5q-46 -102 -102 -148t-131 -46q-36 0 -110.5 19.5t-115.5 19.5q-52 0 -128 -56zM179 70q43 51 61.5 111t18.5 181v33v256q-7 1 -14 1.5t-17 0.5q-54 0 -83 -19t-37 -61
-q-18 21 -25.5 43.5t-7.5 55.5q0 81 44 129.5t120 48.5h20q-2 16 -2 45q0 96 51 158t195 131q-28 -38 -39.5 -85t-11.5 -157v-500q0 -136 -61 -217t-212 -155z" />
-    <glyph glyph-name="I" unicode="I" horiz-adv-x="1090" 
-d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
-q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
-q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64z" />
-    <glyph glyph-name="J" unicode="J" horiz-adv-x="1090" 
-d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM668 379q0 -133 -63.5 -211.5t-182.5 -95.5q32 28 45.5 74.5t13.5 138.5v360q-9 1 -18.5 1.5
-t-24.5 0.5q-54 0 -83 -19t-38 -61q-17 21 -24.5 43.5t-7.5 55.5q0 86 43.5 133t124.5 47q3 0 13 -1t15 -1q-1 10 -1.5 21.5t-0.5 33.5q0 90 49 153t172 128q-16 -41 -24 -86t-8 -95v-620zM961 455q0 -12 1 -46t1 -57q0 -197 -120.5 -303t-342.5 -106q-191 0 -299.5 72
-t-108.5 198q0 80 43 131t109 51q52 0 88.5 -36.5t36.5 -90.5q0 -49 -29 -80.5t-74 -31.5q-18 0 -37 9.5t-46 32.5q-2 -6 -2.5 -13t-0.5 -17q0 -80 81.5 -129t219.5 -49q156 0 222.5 75t66.5 259q0 7 -1 38t-1 54v616q0 145 51 215t195 156q-29 -38 -41 -85.5t-12 -139.5
-v-723z" />
-    <glyph glyph-name="K" unicode="K" horiz-adv-x="1327" 
-d="M33 1214q32 110 96.5 172t146.5 62q42 0 123 -21.5t125 -21.5q25 0 47.5 5.5t50.5 18.5q-46 -101 -101.5 -147.5t-131.5 -46.5q-36 0 -110 16.5t-115 16.5q-53 0 -126 -50zM453 559q0 -137 -60.5 -218t-210.5 -155q44 49 62 114t18 196v134q-8 2 -14.5 2.5t-16.5 0.5
-q-54 0 -83 -19.5t-37 -60.5q-18 20 -25.5 43t-7.5 55q0 84 42.5 132t117.5 48q4 0 12 -1t12 -1q0 8 -1 23t-1 22q0 97 51 159.5t193 129.5q-28 -37 -39.5 -87.5t-11.5 -143.5v-373zM104 -51q62 128 194 210.5t273 82.5q79 0 149 -24.5t124 -70.5l30 33l19 -20
-q-58 -65 -107 -123.5t-81 -104.5q-50 47 -121 71t-158 24q-95 0 -171 -18.5t-151 -59.5zM485 305q36 34 52 80t16 115v49v495q0 140 61 223t197 130q-39 -46 -55.5 -98.5t-16.5 -155.5v-33v-375l342 711q34 -45 57 -60.5t52 -15.5q30 0 56 13.5t54 43.5
-q-7 -113 -70.5 -192.5t-142.5 -79.5q-21 0 -44.5 7t-51.5 22l-155 -316q51 -24 94.5 -94t85.5 -195q11 -32 31 -92q105 -315 192 -315q18 0 38.5 4.5t55.5 16.5q-54 -58 -96.5 -122.5t-75.5 -140.5q-69 8 -117.5 46t-74.5 104q-28 70 -91.5 288.5t-138.5 323.5v-24
-q0 -167 -54.5 -243.5t-199.5 -119.5z" />
-    <glyph glyph-name="L" unicode="L" horiz-adv-x="1280" 
-d="M451 512q0 -137 -60 -217t-211 -154q45 50 63.5 117.5t18.5 198.5q0 22 -1 73.5t-1 81.5q-16 3 -21.5 3.5t-9.5 0.5q-53 0 -82 -19.5t-39 -61.5q-17 20 -24.5 43.5t-7.5 56.5q0 84 42.5 132t117.5 48q4 0 12 -1t12 -1q0 7 -1 21.5t-1 21.5q0 97 51 159t193 130
-q-28 -38 -39.5 -88t-11.5 -144v-401zM53 1184q32 110 97 172.5t147 62.5q41 0 122 -22.5t126 -22.5q24 0 46.5 5.5t51.5 19.5q-46 -101 -101.5 -147t-131.5 -46q-36 0 -110.5 16.5t-115.5 16.5q-50 0 -120 -48q-7 -5 -11 -7zM506 287q31 33 44 75.5t13 139.5v483
-q0 113 32 178t107 133q79 73 157 111.5t147 38.5q53 0 96.5 -19t87.5 -61l39 35l18 -19q-45 -40 -84.5 -87.5t-95.5 -133.5q-98 96 -141 124t-78 28q-54 0 -76 -32.5t-22 -113.5v-538q0 -162 -55.5 -237t-188.5 -105zM180 -63q76 136 254 224.5t383 88.5q63 0 125 -9
-t125 -28v481q-14 6 -21.5 18t-7.5 27q0 23 13 38.5t30 15.5q21 0 33 -14t12 -38q0 -15 -6.5 -25t-21.5 -20v-493l80 -35l36 41l23 -19q-49 -61 -91 -123t-79 -128q-111 54 -225.5 82t-227.5 28q-111 0 -217.5 -27.5t-216.5 -84.5z" />
-    <glyph glyph-name="M" unicode="M" horiz-adv-x="1630" 
-d="M1077 136l9 5q99 67 153 95v391h-162v-491zM1077 813h162v375q-39 16 -65.5 34.5t-47.5 43.5l-49 -33v-420zM936 213q46 -26 73.5 -44t41.5 -32v1080q-32 -18 -60 -30.5t-55 -21.5v-952zM586 813h159v371q-35 7 -64 36t-46 72l-49 -22v-457zM174 258q37 21 54.5 65
-t17.5 119v185q-5 0 -15 -1t-16 -1q-42 0 -66 -23t-27 -65q-31 16 -47 45.5t-16 72.5q0 77 39.5 118.5t110.5 41.5q15 0 23 -0.5t13 -1.5l1 139q0 78 9.5 110t33.5 60q42 51 198 130q71 36 109 57l246 137q45 -94 91.5 -133t110.5 -39h7v172h26v-164q45 8 111.5 49.5
-t150.5 114.5q33 -73 68 -105t80 -32q14 0 29.5 5t35.5 17q-19 -47 -51 -82.5t-69 -52.5v-838q0 -102 33 -137t122 -35q-5 -7 -17 -24q-97 -136 -130 -211q-78 17 -129.5 81t-71.5 171q-115 -68 -192.5 -127t-139.5 -125q-65 63 -112.5 91t-89.5 28q-18 0 -36 -5t-36 -13
-q15 56 42 91t70 58v426h-159v-224q0 -204 -65.5 -326t-168.5 -122q-42 0 -129 31.5t-129 31.5q-32 0 -54 -13.5t-38 -42.5q3 98 63.5 167.5t143.5 69.5q43 0 115 -24.5t100 -24.5q72 0 100.5 60t28.5 265v780q-64 -26 -88.5 -61.5t-24.5 -103.5v-517q0 -165 -61.5 -237
-t-204.5 -78z" />
-    <glyph glyph-name="N" unicode="N" horiz-adv-x="1219" 
-d="M1055 260v592q-34 -16 -73.5 -24.5t-82.5 -8.5q-36 0 -63.5 5t-53.5 16l14 -37q167 -453 259 -543zM313 518q53 23 100.5 34t90.5 11q40 0 87.5 -10t106.5 -31l-32 82q-223 566 -353 627v-713zM12 -51q34 119 100 186t173 88v379l-6 2q-23 6 -33 6q-36 0 -58 -20.5
-t-22 -54.5q0 -1 -2 -2.5t-2 -2.5q-21 24 -30 53t-9 70q0 69 31 109.5t82 40.5q8 0 18.5 -1t29.5 -3l1 440q-12 4 -22.5 6t-22.5 2q-65 0 -114.5 -49.5t-49.5 -120.5q-14 32 -20.5 61.5t-6.5 57.5q0 111 71 181.5t183 70.5q130 0 233 -123.5t234 -450.5q38 -12 73 -18t66 -6
-q39 0 75 9.5t71 29.5v287h-8q-53 0 -104.5 16.5t-111.5 52.5l-51 -43l-16 19q73 65 125.5 122.5t79.5 102.5q50 -39 91 -55.5t83 -16.5q44 0 81.5 15.5t71.5 48.5q0 -88 -57.5 -158.5t-155.5 -101.5v-1241q-80 10 -166 135.5t-204 408.5q-50 25 -99.5 36t-103.5 11
-q-59 0 -107 -11t-90 -34v-256h45q65 0 133 -22t119 -60l27 29l22 -18q-64 -68 -106 -121t-68 -98q-55 44 -114.5 67t-120.5 23q-55 0 -113 -19t-125 -59z" />
-    <glyph glyph-name="O" unicode="O" horiz-adv-x="1421" 
-d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
-t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
-t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
-q0 -125 -52.5 -180t-187.5 -84z" />
-    <glyph glyph-name="P" unicode="P" horiz-adv-x="1233" 
-d="M614 932q32 -11 66.5 -17t71.5 -6q29 0 59.5 5.5t65.5 17.5v235q-32 19 -56.5 40t-46.5 48l-160 -108v-215zM614 467q34 9 64.5 13.5t58.5 4.5q40 0 74 -4.5t66 -13.5v434q-25 -10 -54 -14t-75 -4q-47 0 -76 4.5t-57 15.5zM614 264q68 -21 124 -57t106 -88l33 18v297
-q-38 11 -69 16t-60 5q-36 0 -69.5 -5.5t-64.5 -15.5v-170zM586 -356v1484l-99 -61v-1126q0 -135 23 -193.5t76 -103.5zM270 -410q12 73 18.5 138t6.5 112v235q-58 -1 -99.5 -39t-58.5 -106q-15 33 -21.5 61.5t-6.5 55.5q0 92 49 154t137 82v327q-10 1 -21 1.5t-28 0.5
-q-52 0 -74 -22t-22 -74q-22 29 -31.5 58.5t-9.5 64.5q0 79 37.5 117.5t113.5 38.5q14 0 21 -0.5t14 -1.5v284q0 85 -18.5 117.5t-65.5 32.5q-43 0 -71.5 -28.5t-53.5 -98.5q-17 32 -24 52.5t-7 37.5q0 114 64 183t170 69q96 0 148 -74.5t52 -212.5q0 -12 -0.5 -24.5
-t-1.5 -26.5l99 57v285h28v-262q107 70 188.5 133.5t147.5 128.5q39 -53 78 -79t82 -26q23 0 41.5 8t34.5 23v-4q0 -51 -29 -97.5t-86 -86.5v-881q0 -67 9.5 -113t29.5 -88q-17 1 -33 1.5t-30 0.5q-126 0 -210 -39.5t-147 -127.5l-76 61v-403q-33 6 -78 36.5t-114 94.5
-q-30 -41 -67 -74t-85 -62z" />
-    <glyph glyph-name="Q" unicode="Q" horiz-adv-x="1421" 
-d="M868 940q28 -13 59 -19t68 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-43 -27v-358zM868 905v-465q29 9 58.5 13t64.5 4t68 -7t69 -22q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-35 0 -67.5 5t-63.5 15zM869 410
-l-1 -375q98 40 159.5 129t94.5 237q-33 14 -66.5 20.5t-70.5 6.5q-29 0 -58 -4.5t-58 -13.5zM487 174q25 33 36.5 67t13.5 89v792l-91 -39l1 31l20 9q269 120 373 194v129l28 4v-115q45 23 87 51t83 62q158 -92 239 -248.5t81 -370.5q0 -316 -149.5 -556t-374.5 -293
-q19 -32 50 -88q82 -148 160 -148q3 0 10 1t11 1q-31 -36 -67 -53t-80 -17q-91 0 -153 64t-118 219q-265 27 -431.5 220.5t-166.5 473.5q0 252 124.5 472t322.5 319q-117 -128 -169.5 -306t-52.5 -456q0 -320 86.5 -485.5t270.5 -198.5q-7 23 -26 41.5t-58 40.5q19 4 36 6
-t31 2q56 0 106 -20.5t81 -55.5l39 15v1253l-113 -59v-775q0 -135 -52.5 -189.5t-187.5 -82.5z" />
-    <glyph glyph-name="R" unicode="R" horiz-adv-x="1305" 
-d="M754 680q115 63 165 139.5t50 188.5q0 115 -44 211t-73 96q-46 0 -72 -56t-26 -157v-422zM139 -55q77 147 189 221t260 74q91 0 168.5 -23.5t138.5 -69.5l51 52q-24 184 -61 311t-78 168l-53 -25q1 -3 1.5 -6.5t0.5 -9.5t-1 -12.5l-1 -6.5q0 -151 -54 -217t-206 -108
-q43 35 60 80t17 159v510q0 91 25 134.5t98 91.5q101 65 198 119.5t103 54.5q50 0 99 -82t49 -189q0 -137 -70.5 -256.5t-195.5 -191.5q100 -15 152 -80.5t75 -208.5q24 -148 56.5 -207t86.5 -59q5 0 12.5 1.5t16.5 4.5q-41 -68 -66.5 -126t-33.5 -105q-90 10 -147.5 69.5
-t-76.5 159.5q-54 -48 -185 -225l-3 -4q-64 52 -144.5 79t-175.5 27q-71 0 -148.5 -26.5t-156.5 -77.5zM88 1190q16 108 89.5 182t160.5 74q37 0 98 -32t103 -32q36 0 66.5 13.5t66.5 46.5q-21 -94 -97.5 -167t-148.5 -73q-28 0 -97 21.5t-108 21.5q-32 0 -64.5 -13.5
-t-68.5 -41.5zM461 498q0 -118 -49.5 -175.5t-186.5 -138.5q28 37 41 77.5t13 107.5v41l-1 225q-15 1 -29.5 1.5t-31.5 0.5q-50 0 -72.5 -19t-26.5 -62q-16 25 -24 57.5t-8 74.5q0 79 33.5 112.5t120.5 33.5q8 0 18 -1t21 -2v62q0 101 49.5 158t197.5 120q-38 -49 -51.5 -91
-t-13.5 -97v-485z" />
-    <glyph glyph-name="S" unicode="S" horiz-adv-x="1374" 
-d="M807 1028l63 90q-41 120 -115.5 186t-166.5 66q-95 0 -159 -49.5t-64 -118.5q0 -76 107.5 -118.5t334.5 -55.5zM16 0q78 128 231.5 206.5t325.5 78.5q100 0 182.5 -26.5t149.5 -80.5q173 186 219.5 264.5t46.5 149.5q0 113 -100 167.5t-360 78.5l-52 -88
-q221 -12 306.5 -58t85.5 -145q0 -62 -29 -113t-84 -88q5 19 7.5 34t2.5 28q0 68 -81 101.5t-316 53.5q-65 -126 -130 -188t-132 -62q-51 0 -85 34.5t-34 84.5q0 47 26.5 77t67.5 30q35 0 57.5 -26t22.5 -67q0 -20 -7.5 -39.5t-23.5 -39.5q3 -1 7 -1.5t8 -0.5q43 0 92 52
-t98 150q-215 17 -303 69.5t-88 160.5q0 48 17.5 89.5t54.5 82.5v-8q0 -92 92.5 -137.5t339.5 -67.5l47 88q-231 16 -327.5 71.5t-96.5 167.5q0 152 129 259.5t322 107.5q125 0 216 -36.5t140 -104.5l59 39l13 -29q-86 -59 -160 -132.5t-133 -160.5q252 -13 362.5 -84
-t110.5 -219q0 -86 -44 -171.5t-167 -221.5q-24 -27 -76 -83q-164 -178 -244 -294q-101 84 -201.5 121t-230.5 37q-82 0 -164 -27t-170 -84z" />
-    <glyph glyph-name="T" unicode="T" horiz-adv-x="1186" 
-d="M543 258q24 25 35.5 66t11.5 100v524l-72 -39v41q64 32 130 73.5t136 92.5v-536q0 -120 -52 -190t-189 -132zM90 1147q20 157 100 227t244 70q107 0 301 -26.5t281 -26.5q72 0 120 7.5t87 24.5q-31 -71 -82.5 -123.5t-122.5 -82.5v-910q31 30 64 68t65 82
-q-44 -235 -190 -372.5t-349 -137.5q-224 0 -368 151.5t-144 390.5q0 205 85 375.5t241 280.5q-81 -127 -116.5 -242t-35.5 -241q0 -223 103 -357.5t270 -134.5q81 0 169 29.5t175 85.5v923q-42 -11 -77 -16.5t-64 -5.5q-50 0 -237.5 21.5t-321.5 21.5q-78 0 -125 -19.5
-t-72 -62.5z" />
-    <glyph glyph-name="U" unicode="U" horiz-adv-x="1233" 
-d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
-q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
-q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
-q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5z" />
-    <glyph glyph-name="V" unicode="V" horiz-adv-x="1186" 
-d="M608 954q26 -21 54 -30t71 -9q32 0 59.5 8.5t51.5 24.5v236q-25 8 -49.5 24.5t-51.5 42.5l-135 -73v-224zM608 537q27 15 53.5 22.5t55.5 7.5q27 0 57 -7t70 -23v378q-32 -15 -62 -22.5t-61 -7.5q-27 0 -54.5 8.5t-58.5 26.5v-383zM608 141l68 -18q39 13 80 23.5t88 19.5
-v338q-30 17 -61 25t-68 8q-33 0 -58.5 -8.5t-48.5 -26.5v-361zM471 213l109 -53v997l-109 -55v-889zM80 29q26 68 75 115t124 75v842q0 110 -33.5 150t-108.5 40q-47 0 -91 -30.5t-79 -87.5q-3 14 -4.5 27.5t-1.5 21.5q0 109 77.5 188.5t186.5 79.5q107 0 176.5 -80
-t69.5 -209v-18l109 53v252h28v-236q78 37 165 98.5t171 139.5q31 -76 69.5 -114t84.5 -38q15 0 33 6.5t42 20.5q-11 -50 -43.5 -82t-99.5 -57v-871q0 -60 11 -107t32 -79q-34 6 -68 9t-69 3q-131 0 -256 -51.5t-223 -146.5q-44 55 -106.5 85.5t-133.5 30.5q-30 0 -63 -7
-t-74 -23z" />
-    <glyph glyph-name="W" unicode="W" horiz-adv-x="1612" 
-d="M1102 934q23 -13 42 -19t40 -6q23 0 42 4t36 13v243q-35 20 -64 46.5t-49 58.5l-47 -29v-311zM1102 559q22 8 42 12t38 4q23 0 42 -3.5t38 -12.5v338q-19 -7 -36.5 -10.5t-35.5 -3.5q-24 0 -45 4.5t-43 15.5v-344zM1102 139q42 24 81 42t79 32v317q-21 9 -38 13t-34 4
-q-19 0 -41 -4.5t-47 -14.5v-389zM1073 141v1092l-115 -51v-987zM606 934q23 -12 44.5 -18.5t41.5 -6.5q22 0 41 4t37 13v243q-32 17 -62 44t-53 61l-49 -29v-311zM606 559q25 8 45.5 12t36.5 4q20 0 40 -4t42 -12v338q-24 -8 -40.5 -11t-31.5 -3q-25 0 -48 5t-44 15v-344z
-M606 139q41 23 81.5 41t82.5 33v317q-20 9 -38 13t-36 4q-16 0 -35.5 -4t-54.5 -15v-389zM578 141v1092l-111 -51v-987zM70 16q32 76 83.5 124t125.5 71v412q-21 8 -38 12t-32 4q-36 0 -59.5 -18t-40.5 -60q-13 30 -19 56t-6 51q0 69 36.5 114t92.5 45q12 0 28.5 -2t37.5 -6
-v252q0 92 -29.5 135t-91.5 43q-48 0 -82 -32.5t-56 -98.5v13q-4 44 -4 59q0 114 65 186t167 72q97 0 153.5 -61t65.5 -174l111 53v188h28v-172q78 36 228 150q20 14 30 22q25 -86 75.5 -132t121.5 -46h12v178h29v-168q51 21 109 58.5t145 109.5q36 -76 69.5 -108.5
-t73.5 -32.5q14 0 29 7t34 23q-3 -46 -27.5 -80.5t-76.5 -64.5v-915q0 -44 9.5 -84.5t29.5 -79.5l-6 1q-96 11 -141 11q-106 0 -202 -43t-206 -139q-66 95 -122.5 137.5t-114.5 42.5q-57 0 -123.5 -44.5t-147.5 -135.5q-68 54 -125.5 80t-107.5 26q-33 0 -65.5 -9.5
-t-65.5 -29.5z" />
-    <glyph glyph-name="X" unicode="X" horiz-adv-x="1233" 
-d="M-10 -61v20q0 120 76 200.5t188 80.5q22 0 46.5 -7.5t51.5 -21.5l199 473h-152q-38 0 -80.5 -5.5t-113.5 -21.5q34 39 56.5 89t31.5 106q18 -15 37 -22t49 -7h12h121q-88 224 -158 311t-155 87q-51 0 -86 -30t-58 -93q-9 30 -13.5 55t-4.5 47q0 108 65.5 177t169.5 69
-q112 0 203.5 -108t196.5 -369l200 477q33 -34 73.5 -52t84.5 -18q35 0 68 17t69 53q-16 -137 -81.5 -213t-165.5 -76q-25 0 -49.5 5t-51.5 16l-119 -281l27 -74h225q23 0 51.5 5t59.5 14q-47 -49 -73.5 -92t-41.5 -93q-14 14 -33.5 20.5t-50.5 6.5h-89l5 -14
-q199 -502 336 -502q26 0 95 18h1v-1q-135 -187 -157 -246h-2q-132 0 -220 115t-241 581l-297 -701q-33 42 -69 59t-95 17q-41 0 -70.5 -14t-70.5 -57z" />
-    <glyph glyph-name="Y" unicode="Y" horiz-adv-x="1186" 
-d="M586 883q31 -21 60.5 -30t62.5 -9q28 0 55 9t53 28v272q-40 15 -68.5 37.5t-54.5 58.5l-108 -90v-276zM586 475q35 12 62.5 18.5t47.5 6.5q28 0 58.5 -7t62.5 -20v373q-33 -16 -60 -23.5t-50 -7.5q-22 0 -48 7t-73 28v-375zM586 25q13 -3 24.5 -5t20.5 -2
-q91 0 138.5 50.5t47.5 146.5v221q-32 18 -61.5 26.5t-59.5 8.5t-57.5 -8.5t-52.5 -26.5v-411zM557 35v1102l-115 -76v-746q0 -134 26 -191t89 -89zM752 -385l6 26q14 -5 26 -7.5t23 -2.5q46 0 80.5 31t34.5 70q0 24 -18.5 39.5t-49.5 15.5q-25 0 -70 -22.5t-90 -59.5l-6 -5
-q-121 -99 -203 -99q-80 0 -131 52.5t-51 133.5q0 70 46.5 115t158.5 82q-147 21 -201.5 78.5t-54.5 240.5v362q-14 3 -24.5 4t-20.5 1q-43 0 -68 -21.5t-39 -70.5q-15 33 -21.5 62t-6.5 58q0 82 35.5 124t105.5 42q12 0 21 -0.5t18 -0.5v237q0 74 -23.5 111.5t-70.5 37.5
-q-37 0 -64 -31t-39 -88q-8 36 -11 55.5t-3 35.5q0 94 60 159.5t151 65.5q98 0 144 -76.5t46 -239.5v-32l115 76v272h29v-250q67 53 135.5 116.5t136.5 137.5q25 -74 62.5 -110.5t89.5 -36.5q28 0 50.5 10t43.5 33v-11q0 -45 -24 -85t-74 -79v-911q0 -127 -64.5 -185.5
-t-265.5 -92.5q-191 -33 -257.5 -67.5t-66.5 -90.5q0 -29 22 -48.5t56 -19.5q42 0 165 85t202 85q68 0 117 -49t49 -119q0 -65 -45.5 -111t-110.5 -46q-15 0 -44 10q-8 3 -11 4z" />
-    <glyph glyph-name="Z" unicode="Z" horiz-adv-x="1042" 
-d="M825 807q26 0 55.5 5t63.5 15q-45 -46 -71 -89.5t-42 -94.5q-14 15 -36.5 22t-63.5 7h-92q-72 -181 -210.5 -344t-381.5 -346q19 10 55 30q372 205 553 205q62 0 128 -15t137 -44l41 45l26 -23q-60 -61 -108.5 -122.5t-79.5 -116.5q-73 42 -164.5 64t-198.5 22
-q-95 0 -204 -21.5t-228 -62.5l-12 24q118 65 343 543q49 105 77 162h-105q-45 0 -142 -20l-5 -1q32 38 53 83.5t31 96.5q30 -12 56 -18t46 -6h131q99 259 425 539l42 36q-47 -24 -134 -74q-282 -161 -460 -161q-60 0 -113.5 17t-111.5 55l-43 -45l-21 22q70 76 117 139
-t74 117q35 -61 122.5 -93t221.5 -32q124 0 225.5 29.5t190.5 91.5l16 -27q-142 -110 -332 -609l-1 -5h130z" />
-    <glyph glyph-name="bracketleft" unicode="[" horiz-adv-x="639" 
-d="M596 -233v-41h-403v1720h403v-45h-264v-1634h264z" />
-    <glyph glyph-name="backslash" unicode="\" horiz-adv-x="635" 
-d="M561 -190l-530 1636h80l530 -1636h-80z" />
-    <glyph glyph-name="bracketright" unicode="]" horiz-adv-x="639" 
-d="M449 -274h-404v41h262v1634h-262v45h404v-1720z" />
-    <glyph glyph-name="asciicircum" unicode="^" horiz-adv-x="2048" 
-d="M926 1462h194l512 -565h-98l-512 420l-514 -420h-96z" />
-    <glyph glyph-name="underscore" unicode="_" horiz-adv-x="1024" 
-d="M0 -340h1024v-143h-1024v143z" />
-    <glyph glyph-name="grave" unicode="`" horiz-adv-x="1024" 
-d="M324 1350q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="a" unicode="a" horiz-adv-x="868" 
-d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
-q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114z" />
-    <glyph glyph-name="b" unicode="b" 
-d="M342 231q52 -19 88.5 -49t61.5 -73q33 10 65 19t61 15v600q-46 17 -77.5 39t-55.5 56q-39 -28 -138 -66l-5 -2v-539zM49 66q8 48 34.5 85t76.5 68v897q0 85 -14 125t-47 73q6 0 13.5 -0.5t16.5 -0.5q38 0 122 37.5t150 93.5q-31 -64 -45 -129.5t-14 -186.5v-325
-q75 31 160.5 82.5t179.5 122.5q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-12 -31 -31.5 -55t-48.5 -46v-475q0 -50 10 -96t33 -101q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5z" />
-    <glyph glyph-name="c" unicode="c" horiz-adv-x="735" 
-d="M338 222q76 -5 145 -29t117 -62l57 47l21 -24l-223 -199q-80 60 -150 88.5t-139 28.5q-29 0 -57 -6t-58 -19q0 52 26 90.5t77 63.5v491q0 65 -12.5 101t-40.5 69q13 -1 27.5 -1.5t41.5 -0.5q98 0 201.5 38.5t160.5 96.5q32 -52 72.5 -80t83.5 -28q13 0 39 3q4 1 6 1
-q-42 -65 -91.5 -98t-102.5 -33q-59 0 -101 28.5t-57 79.5l-43 -14v-632z" />
-    <glyph glyph-name="d" unicode="d" 
-d="M347 211q51 -15 88.5 -41t59.5 -59q24 10 52.5 18t63.5 14v607l-116 122q-40 -29 -78 -48t-70 -25v-588zM61 58q5 39 29.5 70t78.5 65v446q0 77 -12.5 108.5t-42.5 57.5q15 -1 29 -1.5t30 -0.5q97 0 166.5 21.5t136.5 70.5l-203 227q-53 60 -103 104t-99 74
-q98 4 167 28.5t109 70.5v-29q0 -32 16.5 -63t65.5 -84l312 -335q2 -2 8 -9q42 -47 88 -58q-24 -28 -34.5 -58.5t-10.5 -74.5v-428q0 -58 9 -90.5t29 -65.5q-4 1 -12 2q-73 11 -102 11q-123 0 -219 -38t-162 -112q-55 56 -103 83.5t-92 27.5q-16 0 -35 -5t-44 -15z" />
-    <glyph glyph-name="e" unicode="e" horiz-adv-x="786" 
-d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
-t-51.5 -16z" />
-    <glyph glyph-name="f" unicode="f" horiz-adv-x="664" 
-d="M92 53q12 37 39.5 72t77.5 78v614h-152v90h152v51q0 59 -14 105t-39 74h16q105 0 209.5 56.5t200.5 166.5q37 -71 65 -99t60 -28q20 0 39 7.5t45 25.5q-24 -75 -80.5 -121.5t-122.5 -46.5q-45 0 -85.5 21.5t-74.5 62.5l-39 -23v-252q7 0 26.5 1t33.5 1q45 0 80 3t65 10
-l-27 -107q-14 2 -31.5 3t-56.5 1q-35 0 -54 -0.5t-36 -1.5v-602q29 -8 58.5 -26.5t76.5 -59.5l64 37l16 -25q-51 -27 -102 -66.5t-125 -111.5q-55 57 -106.5 86t-96.5 29q-20 0 -40 -6t-42 -19z" />
-    <glyph glyph-name="g" unicode="g" 
-d="M606 262v483q-46 12 -82 40t-69 77q-38 -14 -68.5 -22t-56.5 -11v-557q41 -19 73 -46.5t58 -65.5q13 9 61.5 45.5t83.5 56.5zM786 203q52 -27 77.5 -63t25.5 -83q0 -51 -33 -97t-141 -126l-252 -186q-36 43 -85 64.5t-114 21.5q-25 0 -56 -5.5t-71 -17.5q65 91 128 129.5
-t145 38.5q54 0 102.5 -18t93.5 -56q66 36 96.5 73t30.5 81q0 71 -88 133q-9 6 -13 9q-13 9 -19.5 32t-6.5 66v22q-83 -57 -159.5 -114.5t-143.5 -112.5q-47 56 -98.5 85.5t-104.5 29.5q-9 0 -22.5 -2l-40.5 -6q8 49 34.5 86.5t75.5 68.5v426q0 59 -10.5 96.5t-33.5 75.5
-q15 -1 33.5 -1.5t51.5 -0.5q135 0 257 39.5t225 116.5q25 -67 65 -102.5t88 -35.5q10 0 34 6q8 2 11 3q-12 -33 -32 -57.5t-50 -43.5v-575z" />
-    <glyph glyph-name="h" unicode="h" horiz-adv-x="948" 
-d="M51 70q5 48 33 81.5t81 57.5v917q0 79 -13.5 115.5t-46.5 69.5q79 24 148.5 63t142.5 101q-30 -84 -43.5 -177t-13.5 -239v-307l303 252q37 -65 76 -96t84 -31q19 0 37 6t40 20q-5 -44 -25 -76.5t-60 -62.5v-526q0 -59 8.5 -97t27.5 -75q-30 8 -56.5 12t-51.5 4
-q-53 0 -92 -27t-39 -61q0 -29 59.5 -98.5t59.5 -135.5q0 -67 -42 -112t-107 -49q29 25 44 60.5t15 82.5q0 66 -29 148.5t-29 97.5q0 29 27.5 68t27.5 79v600q-31 8 -59 29.5t-67 71.5l-152 -125v-502q40 -17 77 -40t70 -52q-67 -32 -119 -68.5t-92 -79.5q-28 52 -76 83.5
-t-96 31.5q-8 0 -20 -3t-32 -11z" />
-    <glyph glyph-name="i" unicode="i" horiz-adv-x="508" 
-d="M131 1163l-41 -26l-14 24q92 66 125 94.5t49 51.5q21 -51 48.5 -73t70.5 -22q4 0 12 1t12 1q-16 -53 -57.5 -85.5t-91.5 -32.5q-28 0 -57 17t-56 50zM317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5
-q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z" />
-    <glyph glyph-name="j" unicode="j" horiz-adv-x="508" 
-d="M156 743q-24 11 -43.5 26.5t-38.5 39.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-1 -48 -27.5 -85.5t-78.5 -63.5v-586q62 -51 93.5 -107.5t31.5 -115.5q0 -104 -161 -207q-31 -20 -47 -31q-47 -32 -69 -63t-27 -69
-q-9 12 -13.5 23.5t-4.5 22.5q0 42 74 132.5t74 150.5q0 61 -81 137q-14 13 -20 19q-14 14 -20 30.5t-6 46.5v15v583zM131 1163l-41 -26l-14 24q92 66 125 94.5t49 51.5q21 -51 48.5 -73t70.5 -22q4 0 12 1t12 1q-24 -58 -60.5 -88t-82.5 -30q-30 0 -58.5 16t-60.5 51z" />
-    <glyph glyph-name="k" unicode="k" horiz-adv-x="899" 
-d="M349 758l305 229q27 -87 65 -156t81 -108l-211 -160q37 -30 61.5 -75t44.5 -130q28 -112 66 -167.5t86 -55.5q10 0 21 4.5t23 13.5l17 -22q-64 -46 -112.5 -94.5t-73.5 -91.5q-66 19 -104 79.5t-64 190.5q-20 100 -43.5 155t-58.5 85l-103 -84v-183q38 -16 68 -37.5
-t55 -50.5q-47 -23 -91.5 -56t-96.5 -83q-57 61 -100.5 84t-94.5 23q-11 0 -17 -0.5t-11 -1.5q10 40 37 70.5t71 51.5v942q0 73 -14 111.5t-47 73.5q6 -1 13.5 -1.5t16.5 -0.5q38 0 121 37.5t150 93.5q-30 -64 -45 -127t-15 -125v-434zM349 414l289 225q-32 50 -60 103
-t-51 108l-178 -129v-307z" />
-    <glyph glyph-name="l" unicode="l" horiz-adv-x="502" 
-d="M47 51q11 44 39.5 75.5t75.5 51.5v924q0 80 -15.5 118.5t-54.5 73.5q83 9 156.5 46t152.5 112l15 -14q-41 -46 -57.5 -105t-16.5 -211v-901q44 -16 74.5 -40t54.5 -60l51 37l17 -27q-79 -57 -135 -107t-74 -79q-26 52 -79.5 85t-111.5 33q-19 0 -43 -3t-49 -9z" />
-    <glyph glyph-name="m" unicode="m" horiz-adv-x="1327" 
-d="M268 -37q-40 65 -94.5 96.5t-138.5 38.5q12 28 39 50t82 49v462q0 77 -28 104.5t-112 35.5q68 41 118 90t85 108q62 -31 89.5 -95t27.5 -185l321 280q53 -33 79 -95t26 -154v-31l319 280q14 -61 48.5 -95t84.5 -34q13 0 24.5 2t22.5 6q-17 -42 -38.5 -70.5t-51.5 -49.5
-v-465q0 -67 38 -101.5t111 -36.5q-54 -45 -95.5 -92t-71.5 -98q-92 25 -127 84t-35 246v430q-27 13 -51 29.5t-45 38.5l-133 -109v-483q37 -13 67 -35.5t60 -61.5q-54 -26 -101.5 -63.5t-89.5 -85.5q-29 65 -84 101.5t-139 43.5q16 27 41 50t66 47v458q0 64 -18.5 103.5
-t-57.5 62.5l-170 -137v-481q20 -9 43 -22t55 -34q-46 -35 -89.5 -83t-76.5 -99z" />
-    <glyph glyph-name="n" unicode="n" horiz-adv-x="948" 
-d="M297 -31q-40 64 -100.5 100.5t-124.5 36.5h-20t-15 -1q20 34 50 60t73 46v442q0 88 -28 116.5t-112 37.5q73 46 121 94t82 109q63 -36 90 -103t27 -192v-19l367 305q23 -64 56.5 -94t80.5 -30q5 0 12 1t20 4q-11 -33 -31.5 -58.5t-53.5 -47.5v-465q0 -79 35 -114.5
-t114 -38.5q-47 -41 -89 -88.5t-79 -100.5q-91 24 -126.5 79t-35.5 194v501q-22 13 -42 31t-40 41l-188 -162v-440q55 -18 86 -39.5t53 -54.5q-57 -26 -101 -62.5t-81 -87.5z" />
-    <glyph glyph-name="o" unicode="o" 
-d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
-q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5z" />
-    <glyph glyph-name="p" unicode="p" horiz-adv-x="948" 
-d="M182 659q0 68 -32.5 101t-108.5 43q79 55 126 102.5t79 102.5q58 -39 86 -102.5t28 -155.5v-29l347 289q24 -63 64 -98t87 -35q10 0 34 5q8 2 11 3q-12 -32 -31 -56.5t-49 -44.5v-440q0 -64 10.5 -120.5t32.5 -110.5l-48 3t-27 1q-83 0 -184.5 -37.5t-151.5 -89.5
-q-19 27 -41.5 45t-53.5 28v-188q0 -68 8.5 -111t26.5 -65q-71 -10 -157 -54t-113 -48q29 38 43 96.5t14 140.5v281h-22q-44 0 -80 -28.5t-64 -83.5q-1 4 -1.5 8.5t-0.5 15.5q0 64 47.5 126t120.5 93v413zM360 260q73 -17 128.5 -56t91.5 -98l61 25v614q-24 12 -46 31.5
-t-48 50.5l-187 -151v-416z" />
-    <glyph glyph-name="q" unicode="q" 
-d="M623 219v526q-46 12 -82 40t-70 77q-25 -8 -55 -16t-70 -17v-587q49 -20 79.5 -46.5t49.5 -64.5zM305 -33q-38 55 -88 84t-106 29q-22 0 -33.5 -0.5t-23.5 -1.5l-1 4q0 44 30.5 82t82.5 59v457q0 54 -11 93.5t-36 80.5q16 -1 34.5 -1.5t49.5 -0.5q135 0 257.5 39.5
-t225.5 116.5q26 -67 65 -102.5t87 -35.5q9 0 34 6q7 2 11 3q-13 -34 -32 -58t-48 -43v-942q0 -67 15 -127.5t44 -111.5q-35 12 -97 40q-115 52 -175 52h-15q27 23 37.5 77.5t10.5 196.5v215q-93 -48 -170.5 -99.5t-147.5 -111.5z" />
-    <glyph glyph-name="r" unicode="r" horiz-adv-x="664" 
-d="M296 -31q-40 64 -100.5 100.5t-124.5 36.5h-20t-15 -1q20 34 50 60t73 46v440q0 90 -27.5 119t-111.5 37q64 37 114.5 87.5t87.5 115.5q61 -39 89 -97.5t28 -150.5l184 248q24 -64 47 -89.5t56 -25.5q15 0 30.5 6t32.5 19q-8 -80 -50.5 -130.5t-96.5 -50.5
-q-37 0 -69.5 18.5t-59.5 55.5l-74 -100v-500q41 -14 70 -30t49 -36l37 27l20 -20q-76 -50 -131 -96t-88 -89z" />
-    <glyph glyph-name="s" unicode="s" horiz-adv-x="887" 
-d="M385 487q53 59 146 155q169 174 186 239q-40 -45 -80.5 -67.5t-79.5 -22.5q-40 0 -74.5 24t-58.5 70l-88 -23v-375h49zM123 145q43 32 95.5 51t94.5 19q48 0 90 -24t86 -76l84 18v379h-100q-72 -81 -197.5 -199.5t-152.5 -167.5zM65 -31h-24q0 4 1 13t1 14q0 71 56.5 160
-t203.5 239h-186q21 33 30 65t9 79v245q0 27 -10.5 52t-30.5 47q10 -1 44.5 -3.5t55.5 -2.5q103 0 192 30.5t166 91.5q28 -35 56 -52t57 -17q30 0 47 17.5t21 51.5h32q-12 -86 -54.5 -166t-170.5 -229h227q-17 -15 -25.5 -48t-8.5 -87v-233q0 -59 8.5 -93t28.5 -67
-q-39 12 -77.5 18t-78.5 6q-95 0 -170.5 -33t-138.5 -102q-52 62 -88 86.5t-74 24.5q-41 0 -67.5 -28.5t-31.5 -78.5z" />
-    <glyph glyph-name="t" unicode="t" horiz-adv-x="616" 
-d="M98 51q11 43 38.5 73.5t76.5 53.5v649h-18q-49 0 -84.5 -8t-59.5 -24q2 13 4 34q4 32 4 41q0 13 -1.5 30t-5.5 54q27 -12 59.5 -18t70.5 -6h31v37q0 69 -15.5 109.5t-54.5 74.5q82 8 155 45.5t155 114.5l14 -15q-41 -45 -57.5 -108t-16.5 -195v-63h31q38 0 70.5 6
-t58.5 18q-1 -4 -2 -12q-6 -48 -6 -68q0 -18 5 -58l3 -21q-25 16 -60.5 24t-82.5 8h-17v-606q41 -13 72 -37t57 -63l51 37l17 -27q-79 -57 -135 -107t-74 -79q-26 52 -79 85t-112 33q-19 0 -43 -3t-49 -9z" />
-    <glyph glyph-name="u" unicode="u" horiz-adv-x="948" 
-d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
-q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5z" />
-    <glyph glyph-name="v" unicode="v" horiz-adv-x="907" 
-d="M319 -31q-77 41 -107 93t-30 174v382q0 96 -20.5 148.5t-63.5 64.5l-67 -45l-15 25l9 6q164 109 237 174q53 -38 76.5 -108.5t23.5 -190.5v-366q0 -120 25 -159.5t89 -59.5q7 2 25 8q66 22 95 30v598q-24 17 -44.5 38t-37.5 48l-65 -49l-17 29q85 62 140.5 104t99.5 78
-q26 -72 68 -113.5t87 -41.5q10 0 22 3t30 11q-18 -43 -42 -70.5t-61 -46.5v-440q0 -51 10 -94.5t31 -83.5q-27 4 -55.5 6t-56.5 2q-102 0 -202.5 -40t-183.5 -114z" />
-    <glyph glyph-name="w" unicode="w" horiz-adv-x="1305" 
-d="M722 -14q-70 35 -102.5 83t-32.5 117v21l-248 -227q-28 56 -79 92.5t-101 36.5q-11 0 -25 -3t-39 -12q11 36 32 61.5t56 45.5v434q0 96 -20.5 148.5t-63.5 64.5l-67 -47l-14 27l8 5q164 109 237 177q53 -40 77 -111.5t24 -191.5v-474q21 -12 45 -34t59 -64l117 103v397
-q0 94 -21.5 147.5t-64.5 65.5l-68 -47l-12 26l8 6q164 109 238 177q52 -40 76 -111.5t24 -191.5v-377q0 -110 24 -148t87 -59q29 10 59.5 19t60.5 18v600q-25 17 -45 37.5t-37 46.5l-65 -49l-14 28q85 62 140.5 104.5t98.5 78.5q27 -73 68 -114.5t86 -41.5q10 0 21.5 3
-t29.5 11q-17 -42 -40.5 -68.5t-61.5 -45.5v-441q0 -51 10 -95.5t30 -83.5q-35 4 -61.5 6.5t-48.5 2.5q-102 0 -202 -40t-183 -113z" />
-    <glyph glyph-name="x" unicode="x" horiz-adv-x="854" 
-d="M10 -10q30 119 85 186.5t122 67.5q20 0 41.5 -9.5t46.5 -29.5l78 205l-18 45h-58q-41 0 -72.5 -2.5t-58.5 -7.5q9 24 13.5 47t5.5 47v14q13 -2 27.5 -3t43.5 -1q26 0 38.5 0.5t22.5 1.5q-59 163 -122 223.5t-170 69.5q103 63 144.5 97.5t66.5 70.5q56 -31 107.5 -112
-t119.5 -251l145 373q33 -60 52 -76t47 -16q27 0 47.5 20.5t34.5 63.5v-25q0 -114 -37 -181t-98 -67q-25 0 -50 11.5t-51 33.5l-71 -182l20 -49h82q33 0 66.5 5t68.5 15q-13 -33 -22 -61t-15 -55h-139q54 -144 104 -203t115 -59q12 0 26 3t40 11q-45 -60 -78 -117.5
-t-55 -113.5q-96 14 -159 87t-147 293l-153 -387q-24 50 -48.5 70t-58.5 20q-33 0 -64.5 -17.5t-64.5 -55.5z" />
-    <glyph glyph-name="y" unicode="y" horiz-adv-x="948" 
-d="M677 1006q32 -59 95 -96.5t130 -37.5h10q-20 -35 -49 -61t-71 -47v-633q16 -35 23 -67t7 -66q0 -160 -129 -270.5t-317 -110.5q-94 0 -175 56.5t-98 56.5q-28 0 -47 -16.5t-34 -55.5q-3 26 -4 38t-1 21q0 66 42 113t100 47q40 0 75 -23.5t80 -82.5q46 -63 81 -85t81 -22
-q79 0 138 57t59 136q0 34 -31 121.5t-31 181.5v84l-295 -264q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q11 35 32 60t56 47v452q0 88 -35 125.5t-116 41.5l7 6q104 91 160 184q91 -24 127.5 -84t36.5 -197v-496q23 -13 47 -35t57 -63l166 139v488q-44 16 -63 26
-t-31 21l-39 -29l-14 25q76 50 127 98.5t86 102.5z" />
-    <glyph glyph-name="z" unicode="z" horiz-adv-x="807" 
-d="M41 -27l-31 4q75 119 153 233t161 224h-101q-25 0 -53.5 -3t-56.5 -9q24 34 40 66.5t24 62.5h233l237 328q-95 -67 -175 -98t-157 -31q-74 0 -138.5 22.5t-117.5 67.5q61 37 115.5 83t104.5 101q16 -66 66.5 -100.5t129.5 -34.5q98 0 178.5 36.5t100.5 88.5l22 -15
-q-69 -112 -144.5 -224t-158.5 -226h123q29 0 46.5 4.5t35.5 13.5q-22 -33 -42 -67t-40 -70h-205l-239 -317q89 61 173.5 89.5t176.5 28.5q66 0 121 -15.5t106 -49.5l43 53l27 -26q-50 -52 -94 -108t-82 -118q-66 54 -147 80.5t-177 26.5q-98 0 -157 -23t-101 -78z" />
-    <glyph glyph-name="braceleft" unicode="{" horiz-adv-x="1024" 
-d="M848 1516v-53q-136 -2 -186 -55t-50 -210v-141q0 -227 -59 -308.5t-217 -113.5q159 -32 217.5 -113.5t58.5 -308.5v-141q0 -157 49.5 -209t186.5 -54v-53h-10q-219 0 -301 74t-82 272v207q0 161 -59 221.5t-218 73.5v64q161 13 219 73.5t58 221.5v206q0 199 82 273
-t301 74h10z" />
-    <glyph glyph-name="bar" unicode="|" horiz-adv-x="1024" 
-d="M438 1565h150v-2048h-150v2048z" />
-    <glyph glyph-name="braceright" unicode="}" horiz-adv-x="1024" 
-d="M176 1516h10q220 0 302.5 -74t82.5 -273v-206q0 -161 58 -221.5t219 -73.5v-64q-161 -13 -219 -73.5t-58 -221.5v-207q0 -198 -82.5 -272t-302.5 -74h-10v53q137 2 186.5 54.5t49.5 208.5v141q0 227 58.5 308.5t217.5 113.5q-158 32 -217 113.5t-59 308.5v141
-q0 157 -50 210t-186 55v53z" />
-    <glyph glyph-name="asciitilde" unicode="~" horiz-adv-x="1706" 
-d="M1530 770v-156q-104 -72 -199 -106.5t-190 -34.5q-93 0 -256 58q-22 8 -34 12l-15 5q-176 60 -273 60q-84 0 -175 -37t-210 -120v155q106 72 202 108t185 36q62 0 127.5 -13.5t163.5 -48.5q16 -5 47 -17q159 -57 240 -57q88 0 179.5 37t207.5 119z" />
-    <glyph glyph-name="uni0080" 
-d="M442 602v143h-176v-34q0 -20 1 -43t4 -66h171zM918 1284q-8 -89 -52 -140.5t-112 -51.5q-37 0 -67 32.5t-50 94.5l-29 -23v-399h215l-14 -52h-201v-143h146l-15 -51h-130q-8 -105 -57.5 -170.5t-148.5 -99.5q22 26 30.5 60t8.5 118v92h-166q23 -198 103 -301t213 -103
-q106 0 174.5 41t140.5 160q-34 -194 -126.5 -290.5t-243.5 -96.5q-198 0 -315.5 169t-117.5 421h-102l16 51h86q0 33 2.5 68t8.5 75h-113l14 52h109q35 172 124.5 309.5t219.5 218.5q-92 -103 -141.5 -234t-59.5 -294h174v274l-86 -57l-6 24q150 100 243.5 175.5
-t158.5 146.5q14 -54 40.5 -84.5t57.5 -30.5q18 0 34 9.5t34 29.5z" />
-    <glyph glyph-name="uni0080" unicode="&#x20ac;" 
-d="M442 602v143h-176v-34q0 -20 1 -43t4 -66h171zM918 1284q-8 -89 -52 -140.5t-112 -51.5q-37 0 -67 32.5t-50 94.5l-29 -23v-399h215l-14 -52h-201v-143h146l-15 -51h-130q-8 -105 -57.5 -170.5t-148.5 -99.5q22 26 30.5 60t8.5 118v92h-166q23 -198 103 -301t213 -103
-q106 0 174.5 41t140.5 160q-34 -194 -126.5 -290.5t-243.5 -96.5q-198 0 -315.5 169t-117.5 421h-102l16 51h86q0 33 2.5 68t8.5 75h-113l14 52h109q35 172 124.5 309.5t219.5 218.5q-92 -103 -141.5 -234t-59.5 -294h174v274l-86 -57l-6 24q150 100 243.5 175.5
-t158.5 146.5q14 -54 40.5 -84.5t57.5 -30.5q18 0 34 9.5t34 29.5z" />
-    <glyph glyph-name="uni00A0" unicode="&#xa0;" 
- />
-    <glyph glyph-name="exclamdown" unicode="&#xa1;" horiz-adv-x="555" 
-d="M291 1051l98 -797q22 -15 40 -33.5t34 -40.5q-56 -40 -102.5 -87t-79.5 -97q-28 80 -79 124.5t-126 55.5q23 24 54 44.5t71 39.5zM287 1446q35 -40 71.5 -76t75.5 -70q-32 -29 -66.5 -66.5t-78.5 -90.5q-43 42 -81 77.5t-77 67.5q38 29 75.5 66.5t80.5 91.5z" />
-    <glyph glyph-name="cent" unicode="&#xa2;" 
-d="M398 426q28 -2 52.5 -4.5t50.5 -7.5v586q-12 11 -22.5 27.5t-21.5 45.5l-60 -18zM762 358l-227 -198v-185h-33v205q-60 46 -129.5 71t-136.5 25q-30 0 -58.5 -5.5t-58.5 -18.5q0 52 26 90.5t78 63.5v489q0 70 -13 104.5t-42 67.5q17 -1 30.5 -1.5t26.5 -0.5
-q66 0 139 16.5t138 46.5v234h33v-217q17 5 37 19t42 36q33 -52 74.5 -80t85.5 -28q12 0 38 3q5 0 9 1q-42 -65 -93 -98t-107 -33q-21 0 -43.5 4.5t-42.5 13.5v-578q44 -11 80.5 -28t66.5 -41l61 47z" />
-    <glyph glyph-name="sterling" unicode="&#xa3;" 
-d="M68 0q67 134 202.5 211.5t304.5 77.5q63 0 126 -17.5t143 -58.5l28 39l17 -19q-39 -58 -71.5 -115.5t-59.5 -115.5q-82 49 -173.5 75.5t-178.5 26.5q-86 0 -169 -25.5t-169 -78.5zM375 500q0 -128 -54.5 -194.5t-179.5 -94.5q31 31 43.5 70.5t12.5 130.5v241h-172v80h172
-v166q0 114 30.5 175.5t104.5 125.5q78 67 152 102t139 35q49 0 92 -17.5t86 -55.5l35 32l20 -18q-48 -43 -89 -91.5t-83 -111.5q-99 91 -139 115t-74 24q-52 0 -74 -31.5t-22 -109.5v-340h358v-80h-358v-153z" />
-    <glyph glyph-name="currency" unicode="&#xa4;" 
-d="M442 602v143h-176v-34q0 -20 1 -43t4 -66h171zM918 1284q-8 -89 -52 -140.5t-112 -51.5q-37 0 -67 32.5t-50 94.5l-29 -23v-399h215l-14 -52h-201v-143h146l-15 -51h-130q-8 -105 -57.5 -170.5t-148.5 -99.5q22 26 30.5 60t8.5 118v92h-166q23 -198 103 -301t213 -103
-q106 0 174.5 41t140.5 160q-34 -194 -126.5 -290.5t-243.5 -96.5q-198 0 -315.5 169t-117.5 421h-102l16 51h86q0 33 2.5 68t8.5 75h-113l14 52h109q35 172 124.5 309.5t219.5 218.5q-92 -103 -141.5 -234t-59.5 -294h174v274l-86 -57l-6 24q150 100 243.5 175.5
-t158.5 146.5q14 -54 40.5 -84.5t57.5 -30.5q18 0 34 9.5t34 29.5z" />
-    <glyph glyph-name="yen" unicode="&#xa5;" horiz-adv-x="995" 
-d="M657 621v73h-268v-116q23 -15 46.5 -38t53.5 -61zM389 745h268v168h-268v-168zM721 1352q32 -59 95 -96t130 -37h10q-21 -37 -49.5 -63t-68.5 -46v-145h186v-52h-186v-168h186v-51h-186v-219q15 -36 22.5 -69t7.5 -66q0 -159 -128.5 -269t-317.5 -110q-94 0 -176 56.5
-t-99 56.5q-28 0 -45.5 -16t-33.5 -56q-1 5 -4 26.5t-3 32.5q0 66 42 113t100 47q41 0 77.5 -24t79.5 -80q49 -66 82.5 -87.5t77.5 -21.5q79 0 138 57.5t59 137.5q0 44 -31 124t-31 128q0 6 1 22.5t1 26.5v84l-297 -264q-27 57 -77.5 93t-102.5 36q-13 0 -28.5 -3t-34.5 -10
-q11 34 32.5 58.5t59.5 46.5v149h-189v51h189v168h-189v52h189v32q0 83 -38 123.5t-117 43.5q3 3 12 10q103 89 157 180q89 -21 127.5 -86t38.5 -195v-108h268v143q-34 10 -57 21.5t-39 25.5l-37 -29l-16 23q74 49 125.5 98t87.5 105z" />
-    <glyph glyph-name="brokenbar" unicode="&#xa6;" horiz-adv-x="1024" 
-d="M438 408h150v-758h-150v758zM438 1432h150v-758h-150v758z" />
-    <glyph glyph-name="section" unicode="&#xa7;" horiz-adv-x="1024" 
-d="M672 330v383q0 84 -11 114t-38 41l-45 19l-193 -80v-424q0 -41 14 -67.5t43 -41.5l76 -38zM369 -303q-60 61 -105 87t-90 26q-28 0 -51.5 -8t-46.5 -25q31 92 92.5 136t161.5 44q60 0 118 -25.5t130 -83.5l94 19v164q0 65 -18 88.5t-66 48.5q-130 67 -200 87.5t-140 20.5
-q-22 0 -73 -6q-9 -1 -13 -2v24q4 189 4 273q0 86 -1 143t-3 113q28 -5 42 -6.5t25 -1.5q68 0 150.5 23.5t163.5 66.5q-86 46 -152.5 67t-126.5 21q-24 0 -49 -3t-53 -9q19 38 28 74t9 73q0 54 -11 87.5t-34 68.5l7 -1q61 -7 89 -7q102 0 224 43.5t243 124.5q36 -73 69 -103
-t74 -30q24 0 46.5 11t41.5 32q-23 -89 -79 -133.5t-144 -44.5q-66 0 -113 27t-98 95l-129 -36v-152q0 -91 94 -136l6 -3l127 -60q46 -22 87 -31.5t89 -9.5q29 0 52 2.5t45 7.5q-3 -82 -4.5 -151.5t-1.5 -126.5t1.5 -126.5t4.5 -149.5q-112 -7 -191.5 -33t-136.5 -74
-q64 -34 119 -49.5t106 -15.5q23 0 51.5 4t63.5 12q-16 -26 -24.5 -60t-8.5 -71q0 -81 13 -123t42 -86q-34 5 -71.5 7.5t-81.5 2.5q-112 0 -216.5 -37t-180.5 -104z" />
-    <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1024" 
-d="M557 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM195 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1683" 
-d="M1122 1098h37l2 -316h-43q-32 135 -103 204t-177 69q-119 0 -179.5 -93.5t-60.5 -277.5q0 -187 66.5 -284t193.5 -97q84 0 153.5 44t127.5 132l39 -26q-61 -105 -148 -158t-199 -53q-173 0 -292 124t-119 304q0 183 118.5 307.5t290.5 124.5q75 0 149.5 -33t80.5 -33
-q27 0 42 14.5t21 47.5zM844 1305q-123 0 -238 -49t-203 -138q-88 -90 -134 -202.5t-46 -237.5q0 -127 46.5 -239t136.5 -201q91 -90 201.5 -136.5t234.5 -46.5q126 0 237 46.5t199 136.5q89 90 136.5 204t47.5 236q0 123 -48 241t-134 203q-86 86 -201 134.5t-235 48.5z
-M844 1391q138 0 269 -54.5t230 -152.5q100 -99 154.5 -232t54.5 -274q0 -140 -53.5 -269.5t-155.5 -232.5q-99 -101 -228 -155t-273 -54q-142 0 -270 53.5t-232 155.5q-103 102 -156 229t-53 273q0 141 53.5 270t155.5 232q100 101 230.5 156t273.5 55z" />
-    <glyph glyph-name="ordfeminine" unicode="&#xaa;" horiz-adv-x="651" 
-d="M84 608h520v-96h-520v96zM330 1292q-30 -16 -57 -23t-54 -7q-22 0 -44 4t-44 12l211 -248l-25 -22l-88 106q-20 -28 -29.5 -55.5t-9.5 -59.5q0 -70 40 -114t116 -58l41 29v383q-16 6 -30 19t-27 34zM473 1456q2 -49 23.5 -76.5t58.5 -27.5q12 0 26 3.5t31 10.5
-q-7 -29 -23.5 -49.5t-47.5 -40.5v-322q0 -58 21 -83t69 -25q4 0 12 1t12 1l-127 -150q-54 21 -85 51t-46 76l-139 -123q-102 32 -159.5 91.5t-57.5 132.5q0 67 42 127t116 98l-164 192h8q41 0 83.5 26t92.5 81q19 -64 42.5 -94.5t53.5 -30.5q31 0 70 32.5t88 98.5z" />
-    <glyph glyph-name="guillemotleft" unicode="&#xab;" horiz-adv-x="905" 
-d="M729 68q-85 147 -165 250.5t-163 175.5q94 74 175 177t153 238q-3 -101 -41 -211t-104 -206q64 -102 100.5 -209t44.5 -215zM440 68q-85 147 -165 250.5t-162 175.5q93 74 174.5 177t152.5 238q-3 -100 -41.5 -210t-105.5 -207q65 -104 102.5 -211t44.5 -213z" />
-    <glyph glyph-name="logicalnot" unicode="&#xac;" horiz-adv-x="1706" 
-d="M254 860h1198v-502h-137v363h-1061v139z" />
-    <glyph glyph-name="uni00AD" unicode="&#xad;" horiz-adv-x="797" 
-d="M96 383l105 212q8 -25 20.5 -34.5t44.5 -9.5h47h240q39 0 75 10.5t72 32.5l-88 -191q-18 17 -38 24t-56 7h-37h-241q-25 0 -54.5 -10t-89.5 -41z" />
-    <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1683" 
-d="M738 721q13 -1 28 -1.5t35 -0.5q105 0 163 45t58 127q0 72 -50 116t-134 44q-51 0 -76 -17.5t-25 -52.5zM467 1094h397q144 0 231 -54t87 -141q0 -83 -66 -131.5t-219 -75.5q95 -28 145 -76.5t68 -130.5q1 -9 3 -28q11 -125 67 -125q31 0 47 33.5t16 97.5h45v-19
-q0 -84 -41 -129t-119 -45q-49 0 -84 16t-51 46q-20 37 -22 110t-8 97q-19 71 -66.5 105t-130.5 34h-29v-246q0 -51 25.5 -72t93.5 -27v-44h-389v44q69 4 95 25.5t26 73.5v516q0 53 -26 74.5t-95 26.5v45zM844 1305q-123 0 -238 -49t-203 -138q-88 -90 -134 -202.5
-t-46 -237.5q0 -127 46.5 -239t136.5 -201q89 -90 199.5 -136.5t236.5 -46.5q125 0 237 47t199 136q88 90 135 203t47 237q0 125 -47.5 242t-132.5 202q-86 86 -201 134.5t-235 48.5zM844 1391q140 0 273 -56t233 -157q97 -99 149.5 -230.5t52.5 -275.5q0 -139 -56 -270
-t-161 -234q-100 -99 -228 -150t-276 -51q-134 0 -261.5 54.5t-229.5 154.5q-102 101 -155.5 229t-53.5 273q0 142 53 270.5t154 231.5q100 101 231.5 156t274.5 55z" />
-    <glyph glyph-name="macron" unicode="&#xaf;" horiz-adv-x="1024" 
-d="M219 1174v104h586v-104h-586z" />
-    <glyph glyph-name="degree" unicode="&#xb0;" horiz-adv-x="674" 
-d="M338 1362q-81 0 -138 -56t-57 -137t57 -138.5t138 -57.5t136.5 57.5t55.5 138.5t-55.5 137t-136.5 56zM338 1456q118 0 202.5 -84.5t84.5 -204.5q0 -119 -84 -202.5t-205 -83.5t-204 83t-83 203t85 204.5t204 84.5z" />
-    <glyph glyph-name="plusminus" unicode="&#xb1;" horiz-adv-x="1706" 
-d="M254 170h1198v-141h-1198v141zM782 1192h142v-340h528v-139h-528v-340h-142v340h-528v139h528v340z" />
-    <glyph glyph-name="uni00B2" unicode="&#xb2;" horiz-adv-x="616" 
-d="M510 981v-12q0 -33 6.5 -57t19.5 -39q-28 10 -56.5 15t-59.5 5q-140 0 -221.5 -60.5t-81.5 -164.5v-16q38 4 82 7t96 3q72 -1 125 -6.5t90 -16.5l29 33l12 -17q-30 -33 -53.5 -65.5t-40.5 -61.5q-40 14 -88 21.5t-97 7.5q-35 0 -75.5 -2.5t-101.5 -9.5q-3 16 -4 34t-1 50
-q0 121 46.5 187.5t152.5 98.5q13 5 35 11q65 18 65 90v209l-20 8q-44 -35 -79.5 -51.5t-68.5 -16.5q-51 0 -89.5 31t-51.5 84q14 -8 25.5 -11t25.5 -3q28 0 63.5 16.5t69.5 46.5q52 -49 104 -73.5t103 -24.5q14 0 31.5 2t38.5 6q-17 -22 -24 -43t-7 -61v-154z" />
-    <glyph glyph-name="uni00B3" unicode="&#xb3;" horiz-adv-x="616" 
-d="M229 506q-20 31 -64.5 50t-94.5 19q-13 0 -23.5 -1t-23.5 -4q34 47 79 72.5t97 25.5q49 0 95 -23t79 -63l30 6v295q-32 7 -56 16t-44 21q-17 -10 -30.5 -24t-26.5 -36v90q8 -6 14.5 -9t11.5 -3q14 0 54 19.5t73 27.5v264l-34 6q-27 -52 -63.5 -77t-86.5 -25
-q-49 0 -86.5 24t-62.5 72q15 -8 27.5 -12t23.5 -4q28 0 56 20.5t67 71.5q53 -34 129.5 -52t173.5 -18h8q-12 -17 -19.5 -44.5t-7.5 -57.5v-82q0 -18 4.5 -39.5t18.5 -62.5q-15 2 -31.5 3t-46.5 1q-37 0 -74 -9t-76 -28q29 -19 65 -28t87 -9q31 0 49.5 1t36.5 3
-q-13 -12 -20 -37t-7 -63v-131q0 -33 9.5 -59t25.5 -41q-30 2 -47.5 2.5t-32.5 0.5q-70 0 -132.5 -17t-123.5 -52z" />
-    <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1024" 
-d="M698 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="uni00B5" unicode="&#xb5;" horiz-adv-x="1169" 
-d="M166 195q-33 -143 -64 -355q-37 -260 -116 -260q-43 0 -65.5 24.5t-22.5 69.5q0 44 70 277t110 422l108 512h168l-100 -475q-9 -40 -13.5 -74.5t-4.5 -59.5q0 -70 41.5 -108.5t119.5 -38.5q97 0 154 54.5t82 172.5l112 529h173l-115 -532q-9 -43 -14 -75.5t-5 -52.5
-q0 -48 26.5 -74t76.5 -26q44 0 81 25t58 69q13 27 27 73q17 56 39 56q9 0 15.5 -8t6.5 -21q0 -34 -13.5 -88t-35.5 -100q-39 -78 -92.5 -117t-122.5 -39q-81 0 -125.5 55t-44.5 154v13q-52 -115 -123 -168.5t-172 -53.5q-95 0 -151 56t-68 164z" />
-    <glyph glyph-name="paragraph" unicode="&#xb6;" horiz-adv-x="1024" 
-d="M958 1479v-86h-120v-1393h-111v1393h-176v-1393h-113v782q-170 8 -271 102.5t-101 245.5q0 157 107.5 253t285.5 96h499z" />
-    <glyph glyph-name="periodcentered" unicode="&#xb7;" horiz-adv-x="467" 
-d="M123 659q0 48 32 80.5t78 32.5q48 0 81.5 -33t33.5 -80q0 -45 -34 -78.5t-81 -33.5q-45 0 -77.5 33t-32.5 79z" />
-    <glyph glyph-name="cedilla" unicode="&#xb8;" horiz-adv-x="1024" 
-d="M336 -408l-19 5q6 52 44 85t92 33q28 0 51 -12t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5t-39.5 3.5q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14q-21 0 -35 -13.5t-18 -38.5z" />
-    <glyph glyph-name="uni00B9" unicode="&#xb9;" horiz-adv-x="616" 
-d="M111 551q20 43 52 70t89 47v428q0 77 -25 104t-96 37v20q40 7 78 27.5t88 63.5q43 -30 62.5 -68.5t19.5 -95.5v-518q20 -7 39.5 -15t38.5 -16l26 24l19 -16q-45 -39 -79 -74.5t-52 -62.5q-49 32 -96.5 49.5t-84.5 17.5q-21 0 -41 -5.5t-38 -16.5z" />
-    <glyph glyph-name="ordmasculine" unicode="&#xba;" horiz-adv-x="700" 
-d="M455 1249q-41 11 -69.5 33.5t-39.5 50.5q-22 -7 -42.5 -12t-36.5 -6l-1 -414q45 -18 71 -39.5t36 -48.5q20 5 40 9.5t42 8.5v418zM74 608h549v-96h-549v96zM516 1450q23 -53 50 -76.5t65 -23.5q7 0 28 4q11 3 16 4q-13 -31 -28.5 -50.5t-36.5 -33.5v-307q0 -55 8.5 -91.5
-t26.5 -76.5q-23 4 -49.5 6t-56.5 2q-87 0 -160 -27t-148 -86q-34 40 -72.5 61t-74.5 21q-12 0 -46 -6q-8 -1 -13 -2q6 40 26 68.5t60 52.5v323q0 40 -9.5 69t-29.5 58q6 0 20 -1q43 -3 58 -3q101 0 192.5 28.5t173.5 86.5z" />
-    <glyph glyph-name="guillemotright" unicode="&#xbb;" horiz-adv-x="905" 
-d="M176 68q8 108 44.5 215t101.5 209q-66 96 -104.5 206t-41.5 211q70 -133 152 -237t176 -178q-83 -72 -163 -175.5t-165 -250.5zM465 68q8 106 45 213t102 211q-67 97 -105.5 207t-41.5 210q72 -135 153 -238t175 -177q-83 -72 -163 -175.5t-165 -250.5z" />
-    <glyph glyph-name="onequarter" unicode="&#xbc;" horiz-adv-x="1520" 
-d="M1249 229v379l-20 15q-45 -58 -83 -105t-75 -88v-201h178zM1151 -4q6 36 31 63.5t67 42.5v86h-166q-39 0 -70 -2.5t-50 -7.5v6q4 35 4 47q0 56 -1 79t-3 40q67 64 156 170.5t188 241.5q25 -47 48 -70.5t44 -23.5q5 0 15 5q3 2 5 2q-4 -23 -16.5 -42.5t-34.5 -34.5v-369
-h18q33 0 55 11.5t38 35.5v-20q0 -7 -2 -21t-2 -20q0 -7 2 -23t2 -26v-14q-16 20 -34 29t-42 9q-11 0 -19 -0.5t-16 -1.5v-82q18 -4 35 -11t35 -17l30 22l15 -18q-29 -16 -64 -44t-73 -65q-37 25 -69.5 37.5t-59.5 12.5q-18 0 -34.5 -7t-31.5 -20zM1200 1360h70l-955 -1399
-h-69zM106 604q19 39 50 64t86 45v399q0 70 -24.5 95.5t-92.5 35.5v19q37 6 73.5 25t86.5 59q40 -26 57.5 -62t17.5 -92v-481q17 -6 35.5 -13.5t40.5 -17.5l25 22l18 -12q-43 -38 -75.5 -71.5t-49.5 -59.5q-48 31 -93 48.5t-79 17.5q-18 0 -36 -5t-40 -16z" />
-    <glyph glyph-name="onehalf" unicode="&#xbd;" horiz-adv-x="1520" 
-d="M1417 422v-10q0 -31 6.5 -54t18.5 -36q-29 9 -56 13.5t-55 4.5q-134 0 -212.5 -56.5t-78.5 -154.5l1 -14q38 5 79 7.5t90 2.5q70 0 120.5 -5.5t87.5 -16.5l26 30l12 -14q-34 -40 -56 -68.5t-34 -50.5q-40 13 -85.5 20t-90.5 7q-40 0 -82.5 -2.5t-87.5 -7.5q-2 14 -3 30.5
-t-1 44.5q0 115 44 176.5t145 92.5q13 4 34 10q61 17 61 84v196l-20 6q-37 -31 -71.5 -46t-67.5 -15q-50 0 -87 29t-48 77q12 -7 23.5 -10.5t25.5 -3.5q27 0 60.5 15.5t66.5 44.5q50 -47 99.5 -70t96.5 -23q15 0 32 2.5t36 6.5q-15 -21 -22 -41t-7 -56v-145zM1200 1360h70
-l-955 -1399h-69zM106 604q19 39 50 64t86 45v399q0 70 -24.5 95.5t-92.5 35.5v19q37 6 73.5 25t86.5 59q40 -26 57.5 -62t17.5 -92v-481q17 -6 35.5 -13.5t40.5 -17.5l25 22l18 -12q-43 -38 -75.5 -71.5t-49.5 -59.5q-48 31 -93 48.5t-79 17.5q-18 0 -36 -5t-40 -16z" />
-    <glyph glyph-name="threequarters" unicode="&#xbe;" horiz-adv-x="1520" 
-d="M1248 229v379l-20 15q-45 -58 -83 -105t-75 -88v-201h178zM1150 -4q6 36 31 63.5t67 42.5v86h-166q-39 0 -70 -2.5t-50 -7.5v6q4 35 4 47q0 56 -1 79t-3 40q67 64 156 170.5t188 241.5q25 -47 48 -70.5t44 -23.5q5 0 15 5q3 2 5 2q-4 -23 -16.5 -42.5t-34.5 -34.5v-369
-h18q33 0 55 11.5t38 35.5v-20q0 -7 -2 -21t-2 -20q0 -7 2 -23t2 -26v-14q-16 20 -34 29t-42 9q-11 0 -19 -0.5t-16 -1.5v-82q18 -4 35 -11t35 -17l30 22l15 -18q-29 -16 -64 -44t-73 -65q-37 25 -69.5 37.5t-59.5 12.5q-18 0 -34.5 -7t-31.5 -20zM1199 1360h70l-955 -1399
-h-69zM218 559q-18 30 -61.5 49t-91.5 19q-10 0 -21 -1.5t-24 -4.5q33 44 76 67t93 23q48 0 92 -21.5t72 -58.5l31 6v276q-27 5 -50.5 13.5t-45.5 21.5q-19 -13 -31.5 -26.5t-21.5 -30.5v84l1 -1q16 -9 23 -9q13 0 51 17.5t70 25.5v245l-33 9q-25 -51 -60 -75t-83 -24
-q-45 0 -81.5 23.5t-62.5 68.5q15 -8 27.5 -12t22.5 -4q27 0 54 19t64 67q52 -32 125.5 -48.5t163.5 -16.5h8q-12 -16 -19 -41.5t-7 -53.5v-75q0 -20 4.5 -41t17.5 -56q-4 1 -12 1q-43 3 -61 3q-36 0 -71.5 -9t-72.5 -27q28 -17 63 -25t81 -8q31 0 48.5 1t34.5 3
-q-12 -10 -19 -34t-7 -60v-123q0 -30 8.5 -54t23.5 -38q-28 2 -45 3t-30 1q-66 0 -126 -16.5t-118 -51.5z" />
-    <glyph glyph-name="questiondown" unicode="&#xbf;" 
-d="M209 530q0 42 -8 84t-25 86h33q192 0 268.5 70.5t104.5 271.5q11 -64 16.5 -122.5t5.5 -108.5q0 -125 -44.5 -179t-158.5 -75v-436l50 -12q40 87 96 129.5t131 42.5q73 0 130.5 -41t96.5 -121q-20 13 -39 19.5t-39 6.5q-42 0 -84.5 -33.5t-103.5 -119.5
-q-82 58 -197.5 88.5t-257.5 30.5h-14q19 26 29 69.5t10 98.5v251zM573 1446q33 -40 70 -77t80 -73q-39 -36 -76 -74t-74 -79q-14 13 -43 40q-72 67 -114 103q48 33 87.5 73t69.5 87z" />
-    <glyph glyph-name="Agrave" unicode="&#xc0;" horiz-adv-x="1370" 
-d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
-t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
-t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM457 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="Aacute" unicode="&#xc1;" horiz-adv-x="1370" 
-d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
-t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
-t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM831 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="Acircumflex" unicode="&#xc2;" horiz-adv-x="1370" 
-d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
-t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
-t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM326 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="Atilde" unicode="&#xc3;" horiz-adv-x="1370" 
-d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
-t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
-t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM348 1604q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
-    <glyph glyph-name="Adieresis" unicode="&#xc4;" horiz-adv-x="1370" 
-d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
-t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
-t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM690 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM328 1678l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94
-t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="Aring" unicode="&#xc5;" horiz-adv-x="1370" 
-d="M506 1706q0 -50 35.5 -86.5t85.5 -36.5q51 0 88 36.5t37 86.5t-37 86.5t-88 36.5q-50 0 -85.5 -36.5t-35.5 -86.5zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66
-q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5
-l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM467 647h344l-176 459zM436 1706q0 80 56.5 136t136.5 56t136 -56t56 -136t-56 -136.5t-136 -56.5
-q-79 0 -136 57t-57 136z" />
-    <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1847" 
-d="M801 -53q57 89 151.5 158.5t221.5 115.5v838q0 160 104.5 274.5t259.5 114.5q48 0 95.5 -13t101.5 -40l18 22l27 -14q-44 -58 -79.5 -120.5t-58.5 -121.5q-44 53 -103.5 80t-129.5 27q-100 0 -153.5 -70.5t-53.5 -202.5v-293q56 88 116.5 126t141.5 38q52 0 98.5 -14.5
-t90.5 -44.5l26 31l25 -19q-43 -50 -81.5 -111.5t-74.5 -136.5q-25 56 -79 88.5t-119 32.5q-42 0 -75.5 -13.5t-68.5 -45.5v-406q55 14 102.5 20.5t90.5 6.5q95 0 179.5 -25t162.5 -77l43 63l24 -18q-41 -59 -79.5 -121t-73.5 -127q-73 50 -166.5 74t-216.5 24
-q-128 0 -238.5 -24t-228.5 -76zM-41 -45q34 114 114 180.5t201 81.5l334 672q-39 12 -74.5 18t-64.5 6q-50 0 -82 -21t-53 -68q-2 24 -3 39.5t-1 27.5q0 97 65 158t174 61q32 0 66 -6.5t72 -20.5l53 109q-61 14 -113.5 21.5t-93.5 7.5q-69 0 -119.5 -22.5t-73.5 -63.5
-q16 143 94.5 220t211.5 77q25 0 150.5 -21.5t223.5 -21.5q73 0 121 7.5t86 24.5q-54 -118 -148.5 -177.5t-228.5 -59.5q-20 0 -37.5 0.5t-35.5 1.5l-275 -539h355v252q0 105 51 160.5t194 109.5q-35 -41 -50 -82.5t-15 -101.5v-541q0 -121 -51 -180t-187 -139q31 39 44.5 84
-t13.5 139v125h-445l-125 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-69 -78 -110.5 -134t-65.5 -103q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51z" />
-    <glyph glyph-name="Ccedilla" unicode="&#xc7;" horiz-adv-x="1280" 
-d="M557 264q29 28 41 64t12 127v698l-147 -78l-10 25q199 106 325.5 187.5t214.5 158.5q20 -61 53 -92t78 -31q25 0 47.5 10t42.5 31q-10 -70 -54.5 -119t-112.5 -67v-1002q54 21 112.5 66.5t124.5 117.5q-91 -205 -241.5 -310t-356.5 -105q-260 0 -425 190t-165 488
-q0 250 132 462.5t358 323.5q-146 -131 -217.5 -294t-71.5 -365q0 -306 137 -462.5t406 -156.5q48 0 91.5 8.5t88.5 26.5v1007q-5 -1 -10 -1.5t-15 -0.5q-54 0 -93 31t-62 92l-39 -24v-674q0 -144 -56.5 -220t-187.5 -112zM512 -408l-19 5q6 52 44 85t92 33q28 0 51 -12
-t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5t-39.5 3.5q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14q-21 0 -35 -13.5t-18 -38.5z" />
-    <glyph glyph-name="Egrave" unicode="&#xc8;" horiz-adv-x="1255" 
-d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
-q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
-q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
-t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140zM500 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43
-t52 31z" />
-    <glyph glyph-name="Eacute" unicode="&#xc9;" horiz-adv-x="1255" 
-d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
-q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
-q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
-t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140zM874 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="Ecircumflex" unicode="&#xca;" horiz-adv-x="1255" 
-d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
-q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
-q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
-t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140zM369 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z
-" />
-    <glyph glyph-name="Edieresis" unicode="&#xcb;" horiz-adv-x="1255" 
-d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
-q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
-q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
-t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140zM733 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM371 1678
-l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="Igrave" unicode="&#xcc;" horiz-adv-x="1090" 
-d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
-q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
-q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM478 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12
-q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="Iacute" unicode="&#xcd;" horiz-adv-x="1090" 
-d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
-q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
-q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM852 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5
-q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="Icircumflex" unicode="&#xce;" horiz-adv-x="1090" 
-d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
-q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
-q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM347 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145
-q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="Idieresis" unicode="&#xcf;" horiz-adv-x="1090" 
-d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
-q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
-q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM711 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94
-t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM349 1678l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="Eth" unicode="&#xd0;" horiz-adv-x="1200" 
-d="M575 608v-385q62 0 121.5 -22.5t120.5 -69.5l49 27v942q0 60 -25.5 85t-107.5 25h-158v-401q8 0 20.5 -1t16.5 -1q53 0 75 16t22 54q23 -23 34 -53t11 -68q0 -78 -37 -113t-119 -35h-23zM82 -49q56 121 178.5 192.5t286.5 77.5v387h-115v-125q0 -111 -54 -173.5
-t-194 -114.5q30 37 43 85t13 128v200h-68q-45 0 -63.5 -15t-18.5 -52q-23 23 -34 52.5t-11 68.5q0 80 37 114.5t123 34.5q6 0 17 -1t18 -1q-1 2 -1 6q-3 46 -3 70q0 128 55.5 189t193.5 89q-28 -38 -40.5 -73.5t-12.5 -100.5v-180h115v401h-260q-119 0 -171.5 55.5
-t-51.5 180.5q19 -11 41.5 -16t60.5 -5h616q159 0 218 -61.5t59 -210.5v-864q0 -56 9.5 -90.5t31.5 -67.5q-17 0 -38 2h-5q-90 0 -187.5 -47.5t-197.5 -140.5q-75 39 -159 59.5t-169 20.5q-67 0 -130.5 -18t-131.5 -56z" />
-    <glyph glyph-name="Ntilde" unicode="&#xd1;" horiz-adv-x="1219" 
-d="M1055 260v592q-34 -16 -73.5 -24.5t-82.5 -8.5q-36 0 -63.5 5t-53.5 16l14 -37q167 -453 259 -543zM313 518q53 23 100.5 34t90.5 11q40 0 87.5 -10t106.5 -31l-32 82q-223 566 -353 627v-713zM12 -51q34 119 100 186t173 88v379l-6 2q-23 6 -33 6q-36 0 -58 -20.5
-t-22 -54.5q0 -1 -2 -2.5t-2 -2.5q-21 24 -30 53t-9 70q0 69 31 109.5t82 40.5q8 0 18.5 -1t29.5 -3l1 440q-12 4 -22.5 6t-22.5 2q-65 0 -114.5 -49.5t-49.5 -120.5q-14 32 -20.5 61.5t-6.5 57.5q0 111 71 181.5t183 70.5q130 0 233 -123.5t234 -450.5q38 -12 73 -18t66 -6
-q39 0 75 9.5t71 29.5v287h-8q-53 0 -104.5 16.5t-111.5 52.5l-51 -43l-16 19q73 65 125.5 122.5t79.5 102.5q50 -39 91 -55.5t83 -16.5q44 0 81.5 15.5t71.5 48.5q0 -88 -57.5 -158.5t-155.5 -101.5v-1241q-80 10 -166 135.5t-204 408.5q-50 25 -99.5 36t-103.5 11
-q-59 0 -107 -11t-90 -34v-256h45q65 0 133 -22t119 -60l27 29l22 -18q-64 -68 -106 -121t-68 -98q-55 44 -114.5 67t-120.5 23q-55 0 -113 -19t-125 -59zM405 1604q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43
-q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
-    <glyph glyph-name="Ograve" unicode="&#xd2;" horiz-adv-x="1421" 
-d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
-t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
-t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
-q0 -125 -52.5 -180t-187.5 -84zM562 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="Oacute" unicode="&#xd3;" horiz-adv-x="1421" 
-d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
-t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
-t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
-q0 -125 -52.5 -180t-187.5 -84zM936 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="Ocircumflex" unicode="&#xd4;" horiz-adv-x="1421" 
-d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
-t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
-t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
-q0 -125 -52.5 -180t-187.5 -84zM431 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="Otilde" unicode="&#xd5;" horiz-adv-x="1421" 
-d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
-t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
-t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
-q0 -125 -52.5 -180t-187.5 -84zM453 1604q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
-    <glyph glyph-name="Odieresis" unicode="&#xd6;" horiz-adv-x="1421" 
-d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
-t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
-t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
-q0 -125 -52.5 -180t-187.5 -84zM795 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM433 1678l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5
-t-56.5 56.5z" />
-    <glyph glyph-name="multiply" unicode="&#xd7;" horiz-adv-x="1706" 
-d="M391 1178l469 -469l469 469l98 -99l-469 -469l469 -469l-98 -96l-469 467l-469 -467l-98 96l469 469l-469 469z" />
-    <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1421" 
-d="M240 -96l100 164q-139 108 -215 262.5t-76 328.5q0 248 125 467.5t322 317.5q-117 -128 -169.5 -305t-52.5 -455q0 -191 27 -316t86 -218l150 266v706l-91 -39v31q186 85 330 166.5t262 167.5l60 -41l80 137l24 -12l-84 -143q114 -83 177 -229t63 -331
-q0 -368 -191.5 -619t-470.5 -251q-93 0 -178.5 23.5t-152.5 68.5l-99 -164zM1012 1204l-144 -262q26 -14 55 -20.5t72 -6.5q39 0 71.5 7t57.5 21q-14 73 -41.5 137t-70.5 124zM487 174q26 34 38 75t12 93v14l-131 -229q53 -62 128 -95.5t162 -33.5q166 0 278 106t148 299
-q-51 15 -108 22t-125 7q-44 0 -83.5 -4.5t-78.5 -14.5v-18q0 -89 -60 -144t-180 -77zM727 440q45 12 93 17.5t104 5.5q64 0 114.5 -8.5t89.5 -26.5q14 61 20.5 126.5t6.5 143.5q0 64 -5.5 117t-17.5 98q-29 -14 -63 -21t-70 -7q-46 0 -81.5 6.5t-67.5 21.5l-123 -219v-254z
-M727 750l266 477q-17 30 -37.5 54.5t-44.5 43.5l-184 -104v-471z" />
-    <glyph glyph-name="Ugrave" unicode="&#xd9;" horiz-adv-x="1233" 
-d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
-q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
-q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
-q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5zM449 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="Uacute" unicode="&#xda;" horiz-adv-x="1233" 
-d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
-q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
-q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
-q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5zM823 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="Ucircumflex" unicode="&#xdb;" horiz-adv-x="1233" 
-d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
-q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
-q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
-q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5zM318 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="Udieresis" unicode="&#xdc;" horiz-adv-x="1233" 
-d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
-q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
-q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
-q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5zM682 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM320 1678l106 127q43 -58 65.5 -73
-t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="Yacute" unicode="&#xdd;" horiz-adv-x="1186" 
-d="M586 883q31 -21 60.5 -30t62.5 -9q28 0 55 9t53 28v272q-40 15 -68.5 37.5t-54.5 58.5l-108 -90v-276zM586 475q35 12 62.5 18.5t47.5 6.5q28 0 58.5 -7t62.5 -20v373q-33 -16 -60 -23.5t-50 -7.5q-22 0 -48 7t-73 28v-375zM586 25q13 -3 24.5 -5t20.5 -2
-q91 0 138.5 50.5t47.5 146.5v221q-32 18 -61.5 26.5t-59.5 8.5t-57.5 -8.5t-52.5 -26.5v-411zM557 35v1102l-115 -76v-746q0 -134 26 -191t89 -89zM752 -385l6 26q14 -5 26 -7.5t23 -2.5q46 0 80.5 31t34.5 70q0 24 -18.5 39.5t-49.5 15.5q-25 0 -70 -22.5t-90 -59.5l-6 -5
-q-121 -99 -203 -99q-80 0 -131 52.5t-51 133.5q0 70 46.5 115t158.5 82q-147 21 -201.5 78.5t-54.5 240.5v362q-14 3 -24.5 4t-20.5 1q-43 0 -68 -21.5t-39 -70.5q-15 33 -21.5 62t-6.5 58q0 82 35.5 124t105.5 42q12 0 21 -0.5t18 -0.5v237q0 74 -23.5 111.5t-70.5 37.5
-q-37 0 -64 -31t-39 -88q-8 36 -11 55.5t-3 35.5q0 94 60 159.5t151 65.5q98 0 144 -76.5t46 -239.5v-32l115 76v272h29v-250q67 53 135.5 116.5t136.5 137.5q25 -74 62.5 -110.5t89.5 -36.5q28 0 50.5 10t43.5 33v-11q0 -45 -24 -85t-74 -79v-911q0 -127 -64.5 -185.5
-t-265.5 -92.5q-191 -33 -257.5 -67.5t-66.5 -90.5q0 -29 22 -48.5t56 -19.5q42 0 165 85t202 85q68 0 117 -49t49 -119q0 -65 -45.5 -111t-110.5 -46q-15 0 -44 10q-8 3 -11 4zM901 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12
-t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="Thorn" unicode="&#xde;" horiz-adv-x="1233" 
-d="M877 784v224q-29 15 -54 36.5t-49 51.5l-160 -107l1 -205q31 -11 64.5 -16.5t72.5 -5.5q29 0 59.5 5.5t65.5 16.5zM614 756v-289q34 9 64.5 13.5t58.5 4.5q41 0 75 -4.5t64 -13.5l1 287q-28 -11 -57 -16t-72 -5q-38 0 -70.5 5.5t-63.5 17.5zM614 434v-170q68 -21 124 -57
-t106 -88l33 18v297q-32 11 -66 16t-76 5q-29 0 -59.5 -5.5t-61.5 -15.5zM487 909v-968q0 -135 23 -193.5t76 -103.5v1325zM295 75q-58 -1 -99.5 -39t-58.5 -106q-15 33 -21.5 61.5t-6.5 55.5q0 92 49 154t137 82v327q-12 1 -24 1.5t-25 0.5q-52 0 -74 -22t-22 -74
-q-22 29 -31.5 58.5t-9.5 64.5q0 79 37.5 117.5t113.5 38.5q14 0 21 -0.5t14 -1.5v284q0 85 -18.5 117.5t-65.5 32.5q-43 0 -71.5 -28.5t-53.5 -98.5q-15 26 -23 48.5t-8 41.5q0 113 64.5 182.5t169.5 69.5q100 0 149 -74.5t49 -228.5v-195l99 60v442h28v-422
-q108 71 189.5 135t146.5 129q38 -53 77 -78.5t83 -25.5q25 0 44 7t32 21v-6q0 -49 -29 -94.5t-86 -87.5v-721q0 -67 9.5 -113t29.5 -88q-17 1 -33 1.5t-30 0.5q-127 0 -211.5 -39.5t-145.5 -127.5l-76 61v-404q-35 9 -81 40t-111 92q-30 -41 -67 -74t-85 -62q12 81 18.5 147
-t6.5 103v235z" />
-    <glyph glyph-name="germandbls" unicode="&#xdf;" horiz-adv-x="952" 
-d="M326 -35q-39 50 -91 77.5t-106 27.5q-14 0 -44 -7q-6 -1 -9 -2q21 48 53 81.5t80 60.5v678h-166v104h166q0 104 -17.5 161.5t-58.5 106.5q16 -1 29 -1.5t24 -0.5q81 0 184.5 39.5t219.5 114.5q81 -51 124.5 -120.5t43.5 -149.5q0 -74 -37.5 -127t-106.5 -80
-q130 -24 182 -101t52 -256v-446q0 -68 8.5 -111t26.5 -65q-72 -11 -157.5 -54.5t-112.5 -47.5q28 38 42.5 96.5t14.5 140.5v416q0 203 -53 289.5t-178 95.5q73 57 110 112.5t37 110.5q0 52 -27 99.5t-84 97.5l-86 -41v-1071q28 -17 49 -38t39 -51q-34 -25 -70 -58.5
-t-81 -80.5z" />
-    <glyph glyph-name="agrave" unicode="&#xe0;" horiz-adv-x="868" 
-d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
-q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM296 1350
-q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="aacute" unicode="&#xe1;" horiz-adv-x="868" 
-d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
-q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM670 1350q22 -15 52 -31
-t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="acircumflex" unicode="&#xe2;" horiz-adv-x="868" 
-d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
-q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM165 1069q116 85 194.5 161.5
-t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="atilde" unicode="&#xe3;" horiz-adv-x="868" 
-d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
-q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM187 1110q19 79 80 126.5
-t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
-    <glyph glyph-name="adieresis" unicode="&#xe4;" horiz-adv-x="868" 
-d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
-q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM529 1184l106 126l3 -2
-q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM167 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="aring" unicode="&#xe5;" horiz-adv-x="868" 
-d="M340 1245q0 -49 33.5 -83t81.5 -34q49 0 82.5 34t33.5 83q0 48 -34 81.5t-82 33.5q-49 0 -82 -33t-33 -82zM270 1246q0 74 54.5 129t130.5 55q75 0 130.5 -55t55.5 -130q0 -76 -55 -131t-131 -55q-75 0 -129 54.5t-56 132.5zM528 188v541q-26 13 -45.5 33t-38.5 53
-q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4q48 0 101.5 34.5t111.5 102.5
-q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114z" />
-    <glyph glyph-name="ae" unicode="&#xe6;" horiz-adv-x="1151" 
-d="M530 188v541q-26 11 -46.5 31.5t-39.5 54.5q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM596 983q26 -47 54.5 -67.5t66.5 -20.5q40 0 106.5 30.5t120.5 78.5q33 -101 83.5 -188.5
-t119.5 -164.5l-436 -295v-135q67 -6 134.5 -29t129.5 -61l57 43l19 -24l-222 -195q-78 71 -161 115t-162 57l-166 -156q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4q48 0 101.5 34.5t111.5 102.5q26 -88 56.5 -126.5t72.5 -38.5
-q29 0 63.5 26.5t116.5 120.5zM711 393l233 164l-178 315l-55 -6v-473z" />
-    <glyph glyph-name="ccedilla" unicode="&#xe7;" horiz-adv-x="735" 
-d="M338 222q76 -5 145 -29t117 -62l57 47l21 -24l-223 -199q-80 60 -150 88.5t-139 28.5q-29 0 -57 -6t-58 -19q0 52 26 90.5t77 63.5v491q0 65 -12.5 101t-40.5 69q13 -1 27.5 -1.5t41.5 -0.5q98 0 201.5 38.5t160.5 96.5q32 -52 72.5 -80t83.5 -28q13 0 39 3q4 1 6 1
-q-42 -65 -91.5 -98t-102.5 -33q-59 0 -101 28.5t-57 79.5l-43 -14v-632zM194 -408l-19 5q6 52 44 85t92 33q28 0 51 -12t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5t-39.5 3.5q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14
-q-21 0 -35 -13.5t-18 -38.5z" />
-    <glyph glyph-name="egrave" unicode="&#xe8;" horiz-adv-x="786" 
-d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
-t-51.5 -16zM206 1350q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="eacute" unicode="&#xe9;" horiz-adv-x="786" 
-d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
-t-51.5 -16zM580 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="ecircumflex" unicode="&#xea;" horiz-adv-x="786" 
-d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
-t-51.5 -16zM75 1069q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="edieresis" unicode="&#xeb;" horiz-adv-x="786" 
-d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
-t-51.5 -16zM439 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM77 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="igrave" unicode="&#xec;" horiz-adv-x="508" 
-d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z
-M67 1350q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="iacute" unicode="&#xed;" horiz-adv-x="508" 
-d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z
-M441 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="icircumflex" unicode="&#xee;" horiz-adv-x="508" 
-d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z
-M-64 1069q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="idieresis" unicode="&#xef;" horiz-adv-x="508" 
-d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z
-M300 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM-62 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="eth" unicode="&#xf0;" 
-d="M342 236q51 -19 87 -49t63 -74q21 7 50 14.5t78 17.5l1 590q0 52 -7.5 95t-21.5 79q-56 -27 -119 -47t-131 -33v-593zM311 -37q-43 53 -94.5 82t-103.5 29q-15 0 -56 -7q-5 -1 -8 -1q8 48 35.5 86t77.5 69v465q0 49 -10.5 88t-34.5 80q15 -1 32.5 -1.5t49.5 -0.5
-q105 0 200.5 21.5t178.5 64.5q-25 52 -59.5 96t-78.5 82l-264 -117l-41 43l262 117q-52 40 -103.5 75t-105.5 66l156 60q41 -21 96.5 -57t116.5 -82l219 90l43 -43l-215 -88q102 -93 149.5 -204t47.5 -257v-387q0 -66 10 -118t32 -105q-36 5 -67 7.5t-57 2.5
-q-114 0 -211.5 -37t-196.5 -119z" />
-    <glyph glyph-name="ntilde" unicode="&#xf1;" horiz-adv-x="948" 
-d="M297 -31q-40 64 -100.5 100.5t-124.5 36.5h-20t-15 -1q20 34 50 60t73 46v442q0 88 -28 116.5t-112 37.5q73 46 121 94t82 109q63 -36 90 -103t27 -192v-19l367 305q23 -64 56.5 -94t80.5 -30q5 0 12 1t20 4q-11 -33 -31.5 -58.5t-53.5 -47.5v-465q0 -79 35 -114.5
-t114 -38.5q-47 -41 -89 -88.5t-79 -100.5q-91 24 -126.5 79t-35.5 194v501q-22 13 -42 31t-40 41l-188 -162v-440q55 -18 86 -39.5t53 -54.5q-57 -26 -101 -62.5t-81 -87.5zM198 1110q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119
-t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
-    <glyph glyph-name="ograve" unicode="&#xf2;" 
-d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
-q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM307 1350q68 -113 161.5 -166.5t223.5 -53.5h22
-q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="oacute" unicode="&#xf3;" 
-d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
-q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM681 1350q22 -15 52 -31t86 -43l-5 -16l-28 12
-q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="ocircumflex" unicode="&#xf4;" 
-d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
-q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM176 1069q116 85 194.5 161.5t128.5 153.5
-q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="otilde" unicode="&#xf5;" 
-d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
-q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM198 1110q19 79 80 126.5t143 47.5q41 0 126 -20.5
-t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
-    <glyph glyph-name="odieresis" unicode="&#xf6;" 
-d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
-q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM540 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5
-t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM178 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="divide" unicode="&#xf7;" horiz-adv-x="1706" 
-d="M854 367q51 0 88 -37t37 -88q0 -52 -36.5 -88.5t-88.5 -36.5q-53 0 -89 36t-36 89q0 51 37 88t88 37zM254 680h1198v-139h-1198v139zM854 1106q51 0 88 -37.5t37 -89.5q0 -51 -36.5 -88t-88.5 -37t-88.5 36.5t-36.5 88.5t37 89.5t88 37.5z" />
-    <glyph glyph-name="oslash" unicode="&#xf8;" 
-d="M342 305l272 440q-44 13 -78 40t-69 77q-31 -9 -61.5 -17t-63.5 -16v-524zM342 233q52 -19 88.5 -49t61.5 -73q20 6 46.5 13t82.5 19v553l-279 -442v-21zM49 66q8 48 35.5 86t77.5 67v459q0 55 -11 95t-36 81q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t224.5 115.5
-q3 -4 7 -13q20 -44 33 -68l115 182l26 -14l-117 -187q25 -19 46 -28t43 -9q7 0 17 2t29 6q-12 -32 -31 -56t-48 -44v-452q0 -67 10 -117.5t33 -102.5q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-22 27 -46 47t-52 35l-125 -201l-27 23l123 194q-3 1 -11 3
-q-41 10 -60 10q-14 0 -29 -1.5t-33 -4.5z" />
-    <glyph glyph-name="ugrave" unicode="&#xf9;" horiz-adv-x="948" 
-d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
-q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5zM319 1350q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37
-t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
-    <glyph glyph-name="uacute" unicode="&#xfa;" horiz-adv-x="948" 
-d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
-q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5zM693 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5
-t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="ucircumflex" unicode="&#xfb;" horiz-adv-x="948" 
-d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
-q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5zM188 1069q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145
-q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="udieresis" unicode="&#xfc;" horiz-adv-x="948" 
-d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
-q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5zM552 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5
-q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM190 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="yacute" unicode="&#xfd;" horiz-adv-x="948" 
-d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-20 -35 -49 -61t-71 -47v-633q16 -35 23 -67t7 -66q0 -160 -129 -270.5t-317 -110.5q-94 0 -175 56.5t-98 56.5q-28 0 -47 -16.5t-34 -55.5q-3 26 -4 38t-1 21q0 66 42 113t100 47q40 0 75 -23.5t80 -82.5q46 -63 81 -85t81 -22
-q79 0 138 57t59 136q0 34 -31 121.5t-31 181.5v84l-295 -264q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q11 35 32 60t56 47v452q0 88 -35 125.5t-116 41.5l7 6q104 91 160 184q91 -24 127.5 -84t36.5 -197v-496q23 -13 47 -35t57 -63l166 139v488q-44 16 -63 26
-t-31 21l-39 -29l-14 25q76 50 127 98.5t86 102.5zM662 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="thorn" unicode="&#xfe;" horiz-adv-x="901" 
-d="M313 676v-416q71 -16 127 -55.5t92 -98.5l62 25v614q-26 14 -49.5 34.5t-44.5 47.5zM135 -166v1268q0 84 -14.5 121t-52.5 71q80 9 153.5 47t151.5 111l14 -14q-40 -46 -57 -105t-17 -211v-401l346 289q23 -62 63.5 -97.5t88.5 -35.5q10 0 34 5q7 2 11 3
-q-12 -33 -32.5 -57.5t-49.5 -43.5v-440q0 -61 11 -118t34 -113q-7 0 -22 1q-40 3 -54 3q-82 0 -183.5 -37.5t-151.5 -89.5q-19 27 -41.5 45t-53.5 28v-188q0 -68 8.5 -111t26.5 -65q-70 -9 -156.5 -53.5t-113.5 -48.5q29 38 43 96.5t14 140.5z" />
-    <glyph glyph-name="ydieresis" unicode="&#xff;" horiz-adv-x="948" 
-d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-20 -35 -49 -61t-71 -47v-633q16 -35 23 -67t7 -66q0 -160 -129 -270.5t-317 -110.5q-94 0 -175 56.5t-98 56.5q-28 0 -47 -16.5t-34 -55.5q-3 26 -4 38t-1 21q0 66 42 113t100 47q40 0 75 -23.5t80 -82.5q46 -63 81 -85t81 -22
-q79 0 138 57t59 136q0 34 -31 121.5t-31 181.5v84l-295 -264q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q11 35 32 60t56 47v452q0 88 -35 125.5t-116 41.5l7 6q104 91 160 184q91 -24 127.5 -84t36.5 -197v-496q23 -13 47 -35t57 -63l166 139v488q-44 16 -63 26
-t-31 21l-39 -29l-14 25q76 50 127 98.5t86 102.5zM521 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM159 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30
-q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="Cacute" unicode="&#x106;" horiz-adv-x="1280" 
-d="M557 264q29 28 41 64t12 127v698l-147 -78l-10 25q199 106 325.5 187.5t214.5 158.5q20 -61 53 -92t78 -31q25 0 47.5 10t42.5 31q-10 -70 -54.5 -119t-112.5 -67v-1002q54 21 112.5 66.5t124.5 117.5q-91 -205 -241.5 -310t-356.5 -105q-260 0 -425 190t-165 488
-q0 250 132 462.5t358 323.5q-146 -131 -217.5 -294t-71.5 -365q0 -306 137 -462.5t406 -156.5q48 0 91.5 8.5t88.5 26.5v1007q-5 -1 -10 -1.5t-15 -0.5q-54 0 -93 31t-62 92l-39 -24v-674q0 -144 -56.5 -220t-187.5 -112zM960 1844q22 -15 52 -31t86 -43l-5 -16l-28 12
-q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="cacute" unicode="&#x107;" horiz-adv-x="735" 
-d="M338 222q76 -5 145 -29t117 -62l57 47l21 -24l-223 -199q-80 60 -150 88.5t-139 28.5q-29 0 -57 -6t-58 -19q0 52 26 90.5t77 63.5v491q0 65 -12.5 101t-40.5 69q13 -1 27.5 -1.5t41.5 -0.5q98 0 201.5 38.5t160.5 96.5q32 -52 72.5 -80t83.5 -28q13 0 39 3q4 1 6 1
-q-42 -65 -91.5 -98t-102.5 -33q-59 0 -101 28.5t-57 79.5l-43 -14v-632zM609 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
-    <glyph glyph-name="Ccaron" unicode="&#x10c;" horiz-adv-x="1280" 
-d="M557 264q29 28 41 64t12 127v698l-147 -78l-10 25q199 106 325.5 187.5t214.5 158.5q20 -61 53 -92t78 -31q25 0 47.5 10t42.5 31q-10 -70 -54.5 -119t-112.5 -67v-1002q54 21 112.5 66.5t124.5 117.5q-91 -205 -241.5 -310t-356.5 -105q-260 0 -425 190t-165 488
-q0 250 132 462.5t358 323.5q-146 -131 -217.5 -294t-71.5 -365q0 -306 137 -462.5t406 -156.5q48 0 91.5 8.5t88.5 26.5v1007q-5 -1 -10 -1.5t-15 -0.5q-54 0 -93 31t-62 92l-39 -24v-674q0 -144 -56.5 -220t-187.5 -112zM1093 1878q-116 -84 -194.5 -161t-128.5 -154
-q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
-    <glyph glyph-name="ccaron" unicode="&#x10d;" horiz-adv-x="735" 
-d="M338 222q76 -5 145 -29t117 -62l57 47l21 -24l-223 -199q-80 60 -150 88.5t-139 28.5q-29 0 -57 -6t-58 -19q0 52 26 90.5t77 63.5v491q0 65 -12.5 101t-40.5 69q13 -1 27.5 -1.5t41.5 -0.5q98 0 201.5 38.5t160.5 96.5q32 -52 72.5 -80t83.5 -28q13 0 39 3q4 1 6 1
-q-42 -65 -91.5 -98t-102.5 -33q-59 0 -101 28.5t-57 79.5l-43 -14v-632zM742 1384q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
-    <glyph glyph-name="dcroat" unicode="&#x111;" 
-d="M348 211q51 -15 88.5 -41t59.5 -59q24 10 52.5 18t63.5 14v607l-116 122q-40 -29 -78 -48t-70 -25v-588zM62 58q5 39 29.5 70t78.5 65v446q0 77 -12.5 108.5t-42.5 57.5q15 -1 29 -1.5t30 -0.5q97 0 166.5 21.5t136.5 70.5l-104 119h-324v69h260l-35 39
-q-69 75 -112.5 112t-89.5 66q98 4 167 28.5t109 70.5v-29q0 -32 15.5 -62t66.5 -85l127 -140h317v-69h-253l120 -125q5 -5 14 -15q39 -43 83 -53q-24 -28 -34.5 -58.5t-10.5 -74.5v-428q0 -58 9 -90.5t29 -65.5q-4 1 -12 2q-73 11 -102 11q-123 0 -219 -38t-162 -112
-q-55 56 -103 83.5t-92 27.5q-16 0 -35 -5t-44 -15z" />
-    <glyph glyph-name="Gbreve" unicode="&#x11e;" horiz-adv-x="1360" 
-d="M729 659l381 621q-70 -60 -110.5 -81t-77.5 -21q-42 0 -70.5 20.5t-50.5 67.5l-72 -52v-555zM840 25q77 26 126 75.5t72 124.5q-27 13 -51 19t-49 6q-28 0 -51.5 -5.5t-46.5 -17.5v-202zM840 262q28 8 54 12.5t50 4.5q43 0 91 -18q7 -2 9 -3q9 36 13 70t4 65
-q0 25 -2.5 53.5t-7.5 60.5q-23 -16 -49.5 -24t-57.5 -8t-55 5.5t-49 17.5v-236zM840 526q29 -12 55.5 -18t50.5 -6q28 0 53 8t48 25q-21 96 -75 154.5t-132 70.5v-234zM498 162q19 30 28 59t9 70v10v795l-86 -47v34q126 59 256 149t266 214q20 -48 49 -72t65 -24
-q19 0 43.5 13.5t57.5 41.5l22 -14l-360 -594q6 0 17.5 1t17.5 1q176 0 288.5 -105.5t112.5 -265.5q0 -191 -172.5 -334t-409.5 -143q-270 0 -460.5 195t-190.5 475q0 231 148.5 449t375.5 321q-154 -140 -229.5 -324.5t-75.5 -425.5q0 -289 121 -467t311 -178q27 0 54 4.5
-t57 14.5v730l-84 -137v-69q0 -189 -52.5 -261.5t-178.5 -115.5zM512 1827h51q15 -63 73 -93t165 -30q105 0 162.5 30.5t73.5 92.5h53q-20 -120 -94 -184t-195 -64q-120 0 -193.5 63.5t-95.5 184.5z" />
-    <glyph glyph-name="gbreve" unicode="&#x11f;" 
-d="M606 262v483q-46 12 -82 40t-69 77q-38 -14 -68.5 -22t-56.5 -11v-557q41 -19 73 -46.5t58 -65.5q13 9 61.5 45.5t83.5 56.5zM786 203q52 -27 77.5 -63t25.5 -83q0 -51 -33 -97t-141 -126l-252 -186q-36 43 -85 64.5t-114 21.5q-25 0 -56 -5.5t-71 -17.5q65 91 128 129.5
-t145 38.5q54 0 102.5 -18t93.5 -56q66 36 96.5 73t30.5 81q0 71 -88 133q-9 6 -13 9q-13 9 -19.5 32t-6.5 66v22q-83 -57 -159.5 -114.5t-143.5 -112.5q-47 56 -98.5 85.5t-104.5 29.5q-9 0 -22.5 -2l-40.5 -6q8 49 34.5 86.5t75.5 68.5v426q0 59 -10.5 96.5t-33.5 75.5
-q15 -1 33.5 -1.5t51.5 -0.5q135 0 257 39.5t225 116.5q25 -67 65 -102.5t88 -35.5q10 0 34 6q8 2 11 3q-12 -33 -32 -57.5t-50 -43.5v-575zM179 1333h51q15 -63 73 -93t165 -30q105 0 162.5 30.5t73.5 92.5h53q-20 -120 -94 -184t-195 -64q-120 0 -193.5 63.5t-95.5 184.5z
-" />
-    <glyph glyph-name="Idotaccent" unicode="&#x130;" horiz-adv-x="1090" 
-d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
-q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
-q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM514 1659l119 144q40 -57 69 -79t62 -22q11 0 23.5 3t28.5 10q-39 -78 -75.5 -110
-t-84.5 -32q-40 0 -77.5 23t-64.5 63z" />
-    <glyph glyph-name="dotlessi" unicode="&#x131;" horiz-adv-x="508" 
-d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z" />
-    <glyph glyph-name="Lslash" unicode="&#x141;" horiz-adv-x="1280" 
-d="M53 1184q32 109 97 171t147 62q41 0 122 -21.5t126 -21.5q24 0 46.5 5.5t51.5 19.5q-46 -101 -101.5 -147t-131.5 -46q-36 0 -110.5 16.5t-115.5 16.5q-50 0 -120 -48q-7 -5 -11 -7zM506 287q31 33 44 75.5t13 139.5v151l-112 -69v-72q0 -137 -60 -217t-211 -154
-q44 52 62 109t18 172v41l-227 -139v106l227 141v271q0 113 47 172.5t195 130.5q-28 -38 -39.5 -88t-11.5 -144v-223l112 70v225q0 113 32 178t107 133q79 73 157 111.5t147 38.5q53 0 96.5 -19t87.5 -61l39 35l18 -19q-45 -40 -84.5 -87.5t-95.5 -133.5q-98 96 -141 124
-t-78 28q-54 0 -76 -32.5t-22 -113.5v-288l272 168v-109l-272 -170v-139q0 -162 -55.5 -237t-188.5 -105zM180 -63q76 136 254 224.5t383 88.5q63 0 125 -9t125 -28v481q-14 6 -21.5 18t-7.5 27q0 23 13 38.5t30 15.5q21 0 33 -14t12 -38q0 -15 -6.5 -25t-21.5 -20v-493
-l80 -35l36 41l23 -19q-49 -61 -91 -123t-79 -128q-111 54 -225.5 82t-227.5 28q-111 0 -217.5 -27.5t-216.5 -84.5z" />
-    <glyph glyph-name="lslash" unicode="&#x142;" horiz-adv-x="516" 
-d="M55 51q11 44 39 75.5t74 51.5v424l-166 -117v88l166 117v416q0 79 -15 116.5t-53 71.5q83 9 156.5 46t153.5 112l12 -14q-39 -45 -55.5 -102.5t-16.5 -192.5v-21v-331l166 116v-88l-166 -117v-481q43 -16 73 -40t54 -60l51 37l19 -27q-81 -58 -137.5 -108.5t-73.5 -77.5
-q-26 52 -79 85t-112 33q-18 0 -41 -3t-49 -9z" />
-    <glyph glyph-name="OE" unicode="&#x152;" horiz-adv-x="1847" 
-d="M616 389q25 8 55 12.5t66 4.5t70 -7.5t67 -21.5v481q-31 -12 -66 -18t-71 -6q-33 0 -62.5 5t-58.5 15v-465zM588 1176v10q0 96 69 167.5t164 71.5q67 0 169.5 -20.5t139.5 -20.5q25 0 48 7.5t43 21.5q-40 -114 -94 -161.5t-142 -47.5q-58 0 -151.5 23.5t-126.5 23.5
-q-50 0 -76.5 -17t-42.5 -58zM1651 -51q-74 51 -175.5 74.5t-256.5 23.5q-104 0 -282.5 -40t-260.5 -40q-241 0 -409.5 194.5t-168.5 479.5q0 251 133.5 477t339.5 324q-123 -116 -188.5 -319.5t-65.5 -475.5q0 -258 72.5 -423.5t198.5 -198.5v1007h28v-143q27 -13 57.5 -19
-t67.5 -6t69 6.5t64 20.5q-1 8 -1.5 15.5t-0.5 19.5q0 79 56 136t194 114q-37 -49 -52 -92t-15 -97v-547q0 -115 -49.5 -172t-186.5 -139q30 38 42.5 82.5t12.5 114.5v22q-38 14 -74.5 21.5t-70.5 7.5q-28 0 -56 -4.5t-57 -14.5l1 -340q25 -3 45 -4.5t36 -1.5q90 0 244 91
-t234 120v783q0 207 97 324.5t265 117.5q48 0 95.5 -13t101.5 -40l18 22l27 -14q-44 -58 -79.5 -120.5t-58.5 -121.5q-44 53 -103.5 80t-129.5 27q-101 0 -153 -68.5t-52 -202.5v-292q48 82 110.5 121.5t145.5 39.5q51 0 97.5 -14t91.5 -43l26 29l25 -17q-43 -52 -82 -114
-t-74 -136q-25 57 -78.5 89t-119.5 32q-44 0 -77 -13.5t-65 -43.5v-406q50 13 96.5 19t92.5 6q99 0 183.5 -25t160.5 -77l43 65l24 -20q-64 -96 -98.5 -152t-54.5 -96z" />
-    <glyph glyph-name="oe" unicode="&#x153;" horiz-adv-x="1249" 
-d="M860 872l-59 -8v-469l241 164zM340 233q57 -19 95.5 -51.5t58.5 -77.5q35 14 65 23t57 14v604q-44 14 -79.5 41t-69.5 76q-33 -12 -65 -20t-62 -13v-596zM49 66q8 48 34.5 85t76.5 68v467q0 52 -11 90t-34 78q16 -1 34.5 -1.5t49.5 -0.5q143 0 259 39.5t197 116.5
-q36 -62 71 -87.5t83 -25.5q41 0 89 24.5t122 86.5q57 -124 111 -212.5t106 -142.5l-436 -295v-135q78 -9 146 -33t116 -59l57 45l21 -22l-226 -197q-49 50 -287 147l-11 4q-79 -13 -157.5 -50t-150.5 -95q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5z" />
-    <glyph glyph-name="Scedilla" unicode="&#x15e;" horiz-adv-x="1374" 
-d="M807 1028l63 90q-41 120 -115.5 186t-166.5 66q-95 0 -159 -49.5t-64 -118.5q0 -76 107.5 -118.5t334.5 -55.5zM16 0q78 128 231.5 206.5t325.5 78.5q100 0 182.5 -26.5t149.5 -80.5q173 186 219.5 264.5t46.5 149.5q0 113 -100 167.5t-360 78.5l-52 -88
-q221 -12 306.5 -58t85.5 -145q0 -62 -29 -113t-84 -88q5 19 7.5 34t2.5 28q0 68 -81 101.5t-316 53.5q-65 -126 -130 -188t-132 -62q-51 0 -85 34.5t-34 84.5q0 47 26.5 77t67.5 30q35 0 57.5 -26t22.5 -67q0 -20 -7.5 -39.5t-23.5 -39.5q3 -1 7 -1.5t8 -0.5q43 0 92 52
-t98 150q-215 17 -303 69.5t-88 160.5q0 48 17.5 89.5t54.5 82.5v-8q0 -92 92.5 -137.5t339.5 -67.5l47 88q-231 16 -327.5 71.5t-96.5 167.5q0 152 129 259.5t322 107.5q125 0 216 -36.5t140 -104.5l59 39l13 -29q-86 -59 -160 -132.5t-133 -160.5q252 -13 362.5 -84
-t110.5 -219q0 -86 -44 -171.5t-167 -221.5q-24 -27 -76 -83q-164 -178 -244 -294q-101 84 -201.5 121t-230.5 37q-82 0 -164 -27t-170 -84zM494 -408l-19 5q6 52 44 85t92 33q28 0 51 -12t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5
-t-39.5 3.5q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14q-21 0 -35 -13.5t-18 -38.5z" />
-    <glyph glyph-name="scedilla" unicode="&#x15f;" horiz-adv-x="887" 
-d="M385 487q53 59 146 155q169 174 186 239q-40 -45 -80.5 -67.5t-79.5 -22.5q-40 0 -74.5 24t-58.5 70l-88 -23v-375h49zM123 145q43 32 95.5 51t94.5 19q48 0 90 -24t86 -76l84 18v379h-100q-72 -81 -197.5 -199.5t-152.5 -167.5zM65 -31h-24q0 4 1 13t1 14q0 71 56.5 160
-t203.5 239h-186q21 33 30 65t9 79v245q0 27 -10.5 52t-30.5 47q10 -1 44.5 -3.5t55.5 -2.5q103 0 192 30.5t166 91.5q28 -35 56 -52t57 -17q30 0 47 17.5t21 51.5h32q-12 -86 -54.5 -166t-170.5 -229h227q-17 -15 -25.5 -48t-8.5 -87v-233q0 -59 8.5 -93t28.5 -67
-q-39 12 -77.5 18t-78.5 6q-95 0 -170.5 -33t-138.5 -102q-52 62 -88 86.5t-74 24.5q-41 0 -67.5 -28.5t-31.5 -78.5zM269 -408l-19 5q6 52 44 85t92 33q28 0 51 -12t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5t-39.5 3.5
-q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14q-21 0 -35 -13.5t-18 -38.5z" />
-    <glyph glyph-name="Scaron" unicode="&#x160;" horiz-adv-x="1374" 
-d="M807 1028l63 90q-41 120 -115.5 186t-166.5 66q-95 0 -159 -49.5t-64 -118.5q0 -76 107.5 -118.5t334.5 -55.5zM16 0q78 128 231.5 206.5t325.5 78.5q100 0 182.5 -26.5t149.5 -80.5q173 186 219.5 264.5t46.5 149.5q0 113 -100 167.5t-360 78.5l-52 -88
-q221 -12 306.5 -58t85.5 -145q0 -62 -29 -113t-84 -88q5 19 7.5 34t2.5 28q0 68 -81 101.5t-316 53.5q-65 -126 -130 -188t-132 -62q-51 0 -85 34.5t-34 84.5q0 47 26.5 77t67.5 30q35 0 57.5 -26t22.5 -67q0 -20 -7.5 -39.5t-23.5 -39.5q3 -1 7 -1.5t8 -0.5q43 0 92 52
-t98 150q-215 17 -303 69.5t-88 160.5q0 48 17.5 89.5t54.5 82.5v-8q0 -92 92.5 -137.5t339.5 -67.5l47 88q-231 16 -327.5 71.5t-96.5 167.5q0 152 129 259.5t322 107.5q125 0 216 -36.5t140 -104.5l59 39l13 -29q-86 -59 -160 -132.5t-133 -160.5q252 -13 362.5 -84
-t110.5 -219q0 -86 -44 -171.5t-167 -221.5q-24 -27 -76 -83q-164 -178 -244 -294q-101 84 -201.5 121t-230.5 37q-82 0 -164 -27t-170 -84zM1128 1878q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5
-t165.5 34.5z" />
-    <glyph glyph-name="scaron" unicode="&#x161;" horiz-adv-x="887" 
-d="M385 487q53 59 146 155q169 174 186 239q-40 -45 -80.5 -67.5t-79.5 -22.5q-40 0 -74.5 24t-58.5 70l-88 -23v-375h49zM123 145q43 32 95.5 51t94.5 19q48 0 90 -24t86 -76l84 18v379h-100q-72 -81 -197.5 -199.5t-152.5 -167.5zM65 -31h-24q0 4 1 13t1 14q0 71 56.5 160
-t203.5 239h-186q21 33 30 65t9 79v245q0 27 -10.5 52t-30.5 47q10 -1 44.5 -3.5t55.5 -2.5q103 0 192 30.5t166 91.5q28 -35 56 -52t57 -17q30 0 47 17.5t21 51.5h32q-12 -86 -54.5 -166t-170.5 -229h227q-17 -15 -25.5 -48t-8.5 -87v-233q0 -59 8.5 -93t28.5 -67
-q-39 12 -77.5 18t-78.5 6q-95 0 -170.5 -33t-138.5 -102q-52 62 -88 86.5t-74 24.5q-41 0 -67.5 -28.5t-31.5 -78.5zM764 1384q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
-    <glyph glyph-name="Ydieresis" unicode="&#x178;" horiz-adv-x="1186" 
-d="M586 883q31 -21 60.5 -30t62.5 -9q28 0 55 9t53 28v272q-40 15 -68.5 37.5t-54.5 58.5l-108 -90v-276zM586 475q35 12 62.5 18.5t47.5 6.5q28 0 58.5 -7t62.5 -20v373q-33 -16 -60 -23.5t-50 -7.5q-22 0 -48 7t-73 28v-375zM586 25q13 -3 24.5 -5t20.5 -2
-q91 0 138.5 50.5t47.5 146.5v221q-32 18 -61.5 26.5t-59.5 8.5t-57.5 -8.5t-52.5 -26.5v-411zM557 35v1102l-115 -76v-746q0 -134 26 -191t89 -89zM752 -385l6 26q14 -5 26 -7.5t23 -2.5q46 0 80.5 31t34.5 70q0 24 -18.5 39.5t-49.5 15.5q-25 0 -70 -22.5t-90 -59.5l-6 -5
-q-121 -99 -203 -99q-80 0 -131 52.5t-51 133.5q0 70 46.5 115t158.5 82q-147 21 -201.5 78.5t-54.5 240.5v362q-14 3 -24.5 4t-20.5 1q-43 0 -68 -21.5t-39 -70.5q-15 33 -21.5 62t-6.5 58q0 82 35.5 124t105.5 42q12 0 21 -0.5t18 -0.5v237q0 74 -23.5 111.5t-70.5 37.5
-q-37 0 -64 -31t-39 -88q-8 36 -11 55.5t-3 35.5q0 94 60 159.5t151 65.5q98 0 144 -76.5t46 -239.5v-32l115 76v272h29v-250q67 53 135.5 116.5t136.5 137.5q25 -74 62.5 -110.5t89.5 -36.5q28 0 50.5 10t43.5 33v-11q0 -45 -24 -85t-74 -79v-911q0 -127 -64.5 -185.5
-t-265.5 -92.5q-191 -33 -257.5 -67.5t-66.5 -90.5q0 -29 22 -48.5t56 -19.5q42 0 165 85t202 85q68 0 117 -49t49 -119q0 -65 -45.5 -111t-110.5 -46q-15 0 -44 10q-8 3 -11 4zM760 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30
-q-36 0 -68.5 19.5t-56.5 56.5zM398 1678l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
-    <glyph glyph-name="Zcaron" unicode="&#x17d;" horiz-adv-x="1042" 
-d="M825 807q26 0 55.5 5t63.5 15q-45 -46 -71 -89.5t-42 -94.5q-14 15 -36.5 22t-63.5 7h-92q-72 -181 -210.5 -344t-381.5 -346q19 10 55 30q372 205 553 205q62 0 128 -15t137 -44l41 45l26 -23q-60 -61 -108.5 -122.5t-79.5 -116.5q-73 42 -164.5 64t-198.5 22
-q-95 0 -204 -21.5t-228 -62.5l-12 24q118 65 343 543q49 105 77 162h-105q-45 0 -142 -20l-5 -1q32 38 53 83.5t31 96.5q30 -12 56 -18t46 -6h131q99 259 425 539l42 36q-47 -24 -134 -74q-282 -161 -460 -161q-60 0 -113.5 17t-111.5 55l-43 -45l-21 22q70 76 117 139
-t74 117q35 -61 122.5 -93t221.5 -32q124 0 225.5 29.5t190.5 91.5l16 -27q-142 -110 -332 -609l-1 -5h130zM962 1878q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
-    <glyph glyph-name="zcaron" unicode="&#x17e;" horiz-adv-x="807" 
-d="M41 -27l-31 4q75 119 153 233t161 224h-101q-25 0 -53.5 -3t-56.5 -9q24 34 40 66.5t24 62.5h233l237 328q-95 -67 -175 -98t-157 -31q-74 0 -138.5 22.5t-117.5 67.5q61 37 115.5 83t104.5 101q16 -66 66.5 -100.5t129.5 -34.5q98 0 178.5 36.5t100.5 88.5l22 -15
-q-69 -112 -144.5 -224t-158.5 -226h123q29 0 46.5 4.5t35.5 13.5q-22 -33 -42 -67t-40 -70h-205l-239 -317q89 61 173.5 89.5t176.5 28.5q66 0 121 -15.5t106 -49.5l43 53l27 -26q-50 -52 -94 -108t-82 -118q-66 54 -147 80.5t-177 26.5q-98 0 -157 -23t-101 -78zM723 1384
-q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
-    <glyph glyph-name="florin" unicode="&#x192;" 
-d="M467 -68q33 -11 66.5 -32.5t66.5 -53.5l64 37l16 -24q-55 -34 -112 -77.5t-115 -96.5q-59 55 -107.5 81.5t-91.5 26.5q-22 0 -45 -5.5t-49 -16.5q13 39 41.5 75.5t74.5 73.5v899h-155v90h155v21q0 78 -13 127t-42 80h23q106 0 212 57t201 166q37 -71 65.5 -99t59.5 -28
-q20 0 39.5 7t46.5 26q-25 -76 -82 -122t-122 -46q-45 0 -86 21.5t-74 62.5l-37 -23v-249q16 -2 34.5 -2.5t53.5 -0.5q53 0 94 3.5t74 10.5v-585q14 -10 20.5 -20t6.5 -25q0 -22 -13.5 -36.5t-34.5 -14.5q-16 0 -27 14t-11 37q0 16 6 26.5t20 18.5v483h-223v-887z" />
-    <glyph glyph-name="circumflex" unicode="&#x2c6;" horiz-adv-x="1024" 
-d="M193 1069q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
-    <glyph glyph-name="caron" unicode="&#x2c7;" horiz-adv-x="1024" 
-d="M831 1384q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
-    <glyph glyph-name="breve" unicode="&#x2d8;" horiz-adv-x="1024" 
-d="M223 1333h51q15 -63 73 -93t165 -30q105 0 162.5 30.5t73.5 92.5h53q-20 -120 -94 -184t-195 -64q-120 0 -193.5 63.5t-95.5 184.5z" />
-    <glyph glyph-name="dotaccent" unicode="&#x2d9;" horiz-adv-x="1024" 
-d="M360 1165l119 144q40 -57 69 -79t62 -22q11 0 23.5 3t28.5 10q-39 -78 -75.5 -110t-84.5 -32q-40 0 -77.5 23t-64.5 63z" />
-    <glyph glyph-name="ring" unicode="&#x2da;" horiz-adv-x="1024" 
-d="M395 1245q0 -48 34.5 -82.5t82.5 -34.5q49 0 82 34t33 83q0 48 -33.5 81.5t-81.5 33.5q-49 0 -83 -33.5t-34 -81.5zM326 1245q0 75 55 130t131 55q75 0 129.5 -55t54.5 -130q0 -76 -54 -131t-130 -55q-75 0 -129 54.5t-57 131.5z" />
-    <glyph glyph-name="ogonek" unicode="&#x2db;" horiz-adv-x="1024" 
-d="M578 0q-54 -70 -79.5 -126t-25.5 -101q0 -40 22 -64t56 -24q24 0 47 8.5t51 30.5q-7 -74 -47.5 -113t-107.5 -39q-62 0 -97 32.5t-35 90.5q0 61 38 132t126 173h52z" />
-    <glyph glyph-name="tilde" unicode="&#x2dc;" horiz-adv-x="1024" 
-d="M215 1110q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
-    <glyph glyph-name="hungarumlaut" unicode="&#x2dd;" horiz-adv-x="1024" 
-d="M483 1356q28 -12 62 -22.5t86 -24.5v-17l-31 6q-43 -112 -117 -166t-190 -59q83 54 125.5 117.5t64.5 165.5zM725 1356q26 -11 59 -21.5t90 -25.5v-17l-30 6q-43 -113 -117.5 -167t-189.5 -58q81 54 123.5 117t64.5 166z" />
-    <glyph glyph-name="Omega" unicode="&#x3a9;" horiz-adv-x="1569" 
-d="M1112 231v-26h311l60 184h61l-117 -389h-505q120 216 181.5 435t61.5 427q0 277 -95.5 418t-283.5 141q-189 0 -284.5 -140t-95.5 -419q0 -209 61 -426t182 -436h-506l-116 389h61l59 -184h312v26q-165 183 -237 335t-72 311q0 267 183 443.5t453 176.5t452.5 -177
-t182.5 -443q0 -158 -71.5 -309t-237.5 -337z" />
-    <glyph glyph-name="pi" unicode="&#x3c0;" horiz-adv-x="1389" 
-d="M1370 885l-43 -199h-340q-33 -137 -37 -401q-1 -58 -2 -87q-3 -125 -32.5 -183t-90.5 -58q-42 0 -64 28t-22 83q0 58 77 259t114 359h-387q-35 -142 -40 -414q-1 -49 -1 -73q-4 -127 -33 -184.5t-90 -57.5q-42 0 -63 28t-21 83q0 59 76 260t112 358h-188
-q-91 0 -135.5 -41.5t-67.5 -152.5h-57q40 218 124 305.5t251 87.5h960z" />
-    <glyph glyph-name="endash" unicode="&#x2013;" horiz-adv-x="1024" 
-d="M0 440v111h1038v-111h-1038z" />
-    <glyph glyph-name="emdash" unicode="&#x2014;" horiz-adv-x="2048" 
-d="M0 440v111h2048v-111h-2048z" />
-    <glyph glyph-name="quoteleft" unicode="&#x2018;" horiz-adv-x="467" 
-d="M305 1464q-29 -30 -42 -60.5t-13 -66.5t15.5 -68.5t49.5 -66.5l31 23l16 -23l-176 -133q-38 43 -56.5 86t-18.5 86q0 73 57.5 140t136.5 83z" />
-    <glyph glyph-name="quoteright" unicode="&#x2019;" horiz-adv-x="467" 
-d="M168 1049q29 30 42 60.5t13 66.5q0 35 -15 66.5t-50 66.5l-31 -21l-16 23l176 131q38 -43 56.5 -85t18.5 -85q0 -73 -57.5 -140t-136.5 -83z" />
-    <glyph glyph-name="quotesinglbase" unicode="&#x201a;" horiz-adv-x="467" 
-d="M168 -219q29 30 42 60.5t13 66.5t-15.5 68.5t-49.5 66.5l-31 -20l-16 22l176 131q38 -43 56.5 -85t18.5 -85q0 -73 -57.5 -141t-136.5 -84z" />
-    <glyph glyph-name="quotedblleft" unicode="&#x201c;" horiz-adv-x="825" 
-d="M305 1464q-29 -30 -42 -60.5t-13 -66.5t15.5 -68.5t49.5 -66.5l31 23l16 -23l-176 -133q-38 43 -56.5 86t-18.5 86q0 73 57.5 140t136.5 83zM657 1464q-28 -30 -41.5 -60.5t-13.5 -66.5t15.5 -68.5t50.5 -66.5l30 23l17 -23l-176 -133q-38 43 -57 86t-19 86
-q0 73 57.5 140t136.5 83z" />
-    <glyph glyph-name="quotedblright" unicode="&#x201d;" horiz-adv-x="825" 
-d="M520 1049q29 30 42 60.5t13 66.5q0 35 -15 66.5t-50 66.5l-31 -21l-16 23l176 131q37 -42 55.5 -84t18.5 -86q0 -74 -57 -140.5t-136 -82.5zM168 1049q29 30 42 60.5t13 66.5q0 35 -15 66.5t-50 66.5l-31 -21l-16 23l176 131q38 -43 56.5 -85t18.5 -85q0 -73 -57.5 -140
-t-136.5 -83z" />
-    <glyph glyph-name="quotedblbase" unicode="&#x201e;" horiz-adv-x="825" 
-d="M520 -219q29 30 42 60.5t13 66.5t-15.5 68.5t-49.5 66.5l-31 -20l-16 22l176 131q37 -42 55.5 -84t18.5 -86q0 -73 -57 -141t-136 -84zM168 -219q29 30 42 60.5t13 66.5t-15.5 68.5t-49.5 66.5l-31 -20l-16 22l176 131q38 -43 56.5 -85t18.5 -85q0 -73 -57.5 -141
-t-136.5 -84z" />
-    <glyph glyph-name="dagger" unicode="&#x2020;" horiz-adv-x="1024" 
-d="M642 1464l27 -14q-47 -48 -70.5 -160.5t-34.5 -359.5h197q45 0 74.5 6t56.5 18q-3 -22 -4.5 -42t-1.5 -38q0 -16 1.5 -35t4.5 -44q-26 18 -61 26t-93 8h-174l49 -1148l-229 149l29 999h-160q-51 0 -89.5 -8.5t-61.5 -25.5q2 25 4 45.5t2 29.5q0 18 -2 40.5t-4 43.5
-q26 -13 58 -18.5t85 -5.5h168l-6 121q-5 90 -27.5 159t-54.5 95q82 6 154.5 41.5t162.5 117.5z" />
-    <glyph glyph-name="daggerdbl" unicode="&#x2021;" horiz-adv-x="1024" 
-d="M613 -319l-229 149l10 426h-141q-56 0 -92.5 -8t-58.5 -24q2 25 4 45.5t2 29.5q0 17 -2 38.5t-4 43.5q25 -12 53.5 -17.5t70.5 -5.5h19h153l15 469h-160q-56 0 -92.5 -7.5t-58.5 -24.5q2 25 4 45.5t2 29.5q0 18 -2 40.5t-4 43.5q27 -12 57.5 -18t85.5 -6h168l-6 121
-q-5 90 -27.5 159t-54.5 95q82 6 154.5 41.5t162.5 117.5l27 -14q-47 -48 -70.5 -160.5t-34.5 -359.5h197q43 0 73 6t58 18q-3 -22 -4.5 -42t-1.5 -38q0 -16 1.5 -35t4.5 -44q-26 17 -58 24.5t-96 7.5h-174l21 -469h188q40 0 67 5.5t52 16.5q-3 -22 -4.5 -41t-1.5 -36
-q0 -16 1.5 -35t3.5 -44q-25 17 -57 24.5t-96 7.5h-149z" />
-    <glyph glyph-name="bullet" unicode="&#x2022;" horiz-adv-x="1208" 
-d="M307 762q0 123 87 209t210 86q122 0 208.5 -86.5t86.5 -208.5t-87.5 -209.5t-209.5 -87.5q-123 0 -209 87t-86 210z" />
-    <glyph glyph-name="ellipsis" unicode="&#x2026;" horiz-adv-x="2048" 
-d="M160 74l146 174q45 -66 81.5 -93.5t75.5 -27.5q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5zM842 74l146 174q45 -66 81.5 -93.5t75.5 -27.5q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5zM1526 74
-l146 174q45 -66 81.5 -93.5t75.5 -27.5q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5z" />
-    <glyph glyph-name="perthousand" unicode="&#x2030;" horiz-adv-x="2339" 
-d="M1163 1362h47l-796 -1399h-49zM1845 195q40 -16 68 -42t47 -65q28 10 50 17t42 12v516q-33 11 -59 34t-51 66q-31 -11 -54 -18t-43 -10v-510zM1626 52q6 43 27 75.5t57 56.5v400q0 42 -8 76t-27 69h5q40 -4 59 -4q100 0 191.5 34.5t168.5 100.5q22 -61 50.5 -89t68.5 -28
-q2 0 7 1t22 6q-10 -28 -24.5 -49t-34.5 -37l-1 -420q0 -35 8 -75t22 -83q-29 5 -51.5 7.5t-41.5 2.5q-84 0 -157 -32.5t-146 -102.5q-33 46 -72 71t-76 25q-8 0 -20 -1.5t-27 -3.5zM922 51q6 44 26.5 76.5t57.5 56.5v400q0 45 -8 78.5t-25 66.5h5q40 -4 58 -4
-q100 0 190.5 34t168.5 101q22 -61 50 -89t68 -28q3 0 10.5 1.5t20.5 4.5q-9 -27 -23.5 -48t-35.5 -38v-419q0 -35 7.5 -75t22.5 -83q-30 5 -52 7.5t-42 2.5q-83 0 -156.5 -32.5t-146.5 -102.5q-32 46 -71 71t-76 25q-9 0 -22 -1.5t-27 -4.5zM1143 195q39 -16 67.5 -42
-t46.5 -65q28 10 50.5 17t42.5 12v516q-34 11 -59.5 34t-51.5 66q-30 -11 -53 -18t-43 -10v-510zM244 709q39 -16 67.5 -42t46.5 -65q24 8 48 15.5t46 13.5l1 516q-35 11 -61.5 35t-51.5 65q-30 -11 -53 -18t-43 -10v-510zM25 566q6 43 26.5 75.5t57.5 56.5v400q0 45 -8 78.5
-t-25 66.5h5q40 -4 58 -4q100 0 190.5 34t168.5 101q22 -61 50 -89t68 -28q8 0 15.5 1.5t15.5 3.5q-9 -27 -23 -47t-36 -37v-422q0 -35 7.5 -74t22.5 -82q-31 6 -52.5 8t-41.5 2q-83 0 -156.5 -32.5t-146.5 -102.5q-32 46 -71 71t-76 25q-9 0 -22 -1.5t-27 -3.5z" />
-    <glyph glyph-name="guilsinglleft" unicode="&#x2039;" horiz-adv-x="616" 
-d="M440 68q-85 147 -165 250.5t-162 175.5q93 74 174.5 177t152.5 238q-3 -100 -41.5 -210t-105.5 -207q65 -104 102.5 -211t44.5 -213z" />
-    <glyph glyph-name="guilsinglright" unicode="&#x203a;" horiz-adv-x="616" 
-d="M176 68q8 108 44.5 215t101.5 209q-66 96 -104.5 206t-41.5 211q70 -133 152 -237t176 -178q-83 -72 -163 -175.5t-165 -250.5z" />
-    <glyph glyph-name="franc" unicode="&#x20a3;" horiz-adv-x="1903" 
-d="M86 1200q6 103 70 172.5t149 69.5q53 0 152.5 -30t156.5 -30q50 0 93 12.5t86 39.5q-57 -104 -148 -171t-170 -67q-54 0 -148.5 33t-131.5 33q-36 0 -60 -14t-49 -48zM346 219q22 34 31.5 69t9.5 91v14v250h-45q-63 0 -91.5 -20t-41.5 -72q-14 30 -20.5 55t-6.5 49
-q0 100 39 143.5t127 43.5q15 0 23 -0.5t16 -1.5v34v39q0 128 237 259l6 3q-29 -38 -42 -79.5t-13 -118.5v-465q0 -107 -50.5 -166.5t-178.5 -126.5zM889 829h190v350q-43 2 -82.5 25.5t-70.5 67.5q-19 -14 -28 -32.5t-9 -41.5v-369zM-74 -16q49 108 116 167.5t142 59.5
-q60 0 183.5 -85t175.5 -85q72 0 111.5 48t39.5 136v867q0 44 12 71.5t42 48.5q14 11 56 37q161 97 275 197q49 -55 75.5 -70.5t57.5 -15.5q22 0 43.5 7.5t42.5 23.5q-18 -82 -64.5 -133.5t-125.5 -77.5v-1037h-29v500h-190v-342q0 -75 -14 -106.5t-50 -61.5
-q-99 -84 -225.5 -136t-230.5 -52q-82 0 -185.5 39t-138.5 39q-30 0 -59.5 -10t-59.5 -29zM1536 -31q-40 64 -100.5 100.5t-124.5 36.5h-20t-15 -1q20 34 50 60t73 46v440q0 90 -27.5 119t-111.5 37q64 37 114.5 87.5t87.5 115.5q61 -39 89 -97.5t28 -150.5l184 248
-q24 -64 47 -89.5t56 -25.5q15 0 30.5 6t32.5 19q-8 -80 -50.5 -130.5t-96.5 -50.5q-37 0 -69.5 18.5t-59.5 55.5l-74 -100v-500q41 -14 70 -30t49 -36l37 27l20 -20q-76 -50 -131 -96t-88 -89z" />
-    <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1683" 
-d="M780 1442h191l137 -391l143 391h181v-25l-30 -2q-21 -2 -31.5 -15t-10.5 -38v-375q0 -25 10.5 -38t31.5 -15l30 -2v-29h-240v29l31 2q21 2 32 15.5t11 37.5v387l-172 -473h-21l-172 475v-389q0 -24 11 -37.5t32 -15.5l33 -2v-29h-197v29l34 2q20 2 31 15.5t11 37.5v371
-q0 24 -11 37.5t-31 15.5l-34 4v27zM250 1442h444l11 -182h-27q-8 78 -40.5 114.5t-94.5 36.5h-17v-424q0 -24 10.5 -37.5t30.5 -15.5l33 -2v-29h-254v29l31 2q21 2 32 15.5t11 37.5v424h-17q-64 0 -96.5 -36t-40.5 -115h-26z" />
-    <glyph glyph-name="partialdiff" unicode="&#x2202;" horiz-adv-x="1059" 
-d="M756 621q15 87 22.5 168.5t7.5 156.5q0 129 -36.5 194.5t-108.5 65.5q-55 0 -127 -58t-108 -58t-60 22t-24 53q0 62 72 111t173 49q180 0 287 -155t107 -418q0 -335 -144.5 -556t-357.5 -221q-152 0 -253.5 108t-101.5 271q0 198 110.5 326.5t272.5 128.5
-q101 0 166 -45.5t103 -142.5zM707 494q0 116 -43.5 178.5t-122.5 62.5q-109 0 -179.5 -129t-70.5 -336q0 -116 43 -177.5t123 -61.5q109 0 179.5 130t70.5 333z" />
-    <glyph glyph-name="uni2206" unicode="&#x2206;" horiz-adv-x="1350" 
-d="M602 1174l-389 -957h768zM666 1497h30l600 -1497h-1243z" />
-    <glyph glyph-name="product" unicode="&#x220f;" horiz-adv-x="1630" 
-d="M53 1473h1522v-74h-191v-1718h191v-74h-596v74h192v1718h-714v-1718h192v-74h-596v74h191v1718h-191v74z" />
-    <glyph glyph-name="summation" unicode="&#x2211;" horiz-adv-x="1462" 
-d="M16 1473h1162l110 -365h-78l-73 227q-11 34 -41.5 49t-98.5 15h-690l809 -832v-37l-825 -735h887q61 0 79 13t29 51l72 229h78l-148 -481h-1272v41l920 815l-920 956v54z" />
-    <glyph glyph-name="minus" unicode="&#x2212;" horiz-adv-x="1706" 
-d="M254 682h1198v-141h-1198v141z" />
-    <glyph glyph-name="uni2215" unicode="&#x2215;" horiz-adv-x="342" 
-d="M612 1360h70l-954 -1399h-70z" />
-    <glyph glyph-name="uni2219" unicode="&#x2219;" horiz-adv-x="467" 
-d="M123 659q0 48 32 80.5t78 32.5q48 0 81.5 -33t33.5 -80q0 -45 -34 -78.5t-81 -33.5q-45 0 -77.5 33t-32.5 79z" />
-    <glyph glyph-name="radical" unicode="&#x221a;" horiz-adv-x="1305" 
-d="M1116 1661h189v-96h-115l-594 -1606h-66l-319 883l-125 -45l-25 80l283 98l256 -709z" />
-    <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1706" 
-d="M915 559q50 -89 116.5 -133.5t150.5 -44.5q101 0 165 67.5t64 172.5q0 101 -59 168t-148 67q-81 0 -146.5 -66.5t-142.5 -230.5zM793 666q-49 88 -115.5 132t-151.5 44q-101 0 -165 -66.5t-64 -171.5q0 -101 59 -168t148 -67q81 0 146.5 66t142.5 231zM864 483
-q-71 -136 -148.5 -199t-172.5 -63q-135 0 -228.5 112t-93.5 277q0 175 83.5 283t217.5 108q95 0 170 -61.5t150 -202.5q68 138 147 203.5t176 65.5q133 0 227.5 -113t94.5 -279q0 -174 -83.5 -281.5t-217.5 -107.5q-95 0 -168.5 58.5t-153.5 199.5z" />
-    <glyph glyph-name="integral" unicode="&#x222b;" horiz-adv-x="1067" 
-d="M311 -262q106 0 120 688q2 108 3 165q12 515 107 737t297 222q80 0 130 -42t50 -107q0 -54 -32 -85.5t-87 -31.5q-42 0 -70 19t-40 54q-6 15 -10.5 51t-20.5 36q-107 0 -121 -619q-4 -193 -8 -303q-17 -479 -111.5 -686t-290.5 -207q-79 0 -129.5 41.5t-50.5 106.5
-q0 56 34 87.5t95 31.5q33 0 57 -14.5t39 -42.5q10 -18 15 -59.5t24 -41.5z" />
-    <glyph glyph-name="approxequal" unicode="&#x2248;" horiz-adv-x="1706" 
-d="M1530 586v-156q-105 -73 -199.5 -107t-189.5 -34t-285 67.5t-293 67.5q-82 0 -171.5 -36t-213.5 -122v156q108 73 204 109t183 36q115 0 305 -68.5t273 -68.5q88 0 177 35.5t210 120.5zM1530 954v-155q-105 -73 -199.5 -107.5t-189.5 -34.5t-285 68t-293 68
-q-83 0 -171.5 -36t-213.5 -122v156q106 72 202 107.5t185 35.5q116 0 305.5 -67.5t272.5 -67.5q87 0 175 34.5t212 120.5z" />
-    <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1706" 
-d="M1208 1194l105 -82l-187 -235h326v-136h-416l-205 -262h621v-135h-709l-249 -317l-105 84l184 233h-319v135h408l204 262h-612v136h702z" />
-    <glyph glyph-name="lessequal" unicode="&#x2264;" horiz-adv-x="1706" 
-d="M262 162h1184v-139h-1184v139zM1444 1206v-147l-936 -309l936 -306v-149l-1182 395v121z" />
-    <glyph glyph-name="greaterequal" unicode="&#x2265;" horiz-adv-x="1706" 
-d="M262 162h1184v-139h-1184v139zM262 1206l1184 -395v-121l-1184 -395v149l938 306l-938 309v147z" />
-    <glyph glyph-name="lozenge" unicode="&#x25ca;" horiz-adv-x="1012" 
-d="M506 1409l-385 -817l385 -825l385 825zM506 1653l500 -1061l-500 -1069l-500 1069z" />
-    <glyph glyph-name="uniF000" unicode="&#xf000;" horiz-adv-x="1618" 
-d="M836 1216q-1 6 -1.5 14t-0.5 23q0 124 95 229.5t236 131.5q1 -10 1.5 -23t0.5 -39q0 -131 -103.5 -234.5t-203.5 -103.5h-8q-3 0 -7.5 1t-8.5 1zM1505 403q-114 -247 -205 -342.5t-204 -95.5q-50 0 -131.5 33t-122.5 33q-45 0 -131 -33t-127 -33q-64 0 -128.5 44
-t-129.5 132q-102 140 -157.5 295.5t-55.5 300.5q0 219 125 356.5t323 137.5q68 0 155 -34t124 -34q34 0 121.5 35t152.5 35q110 0 198 -40t161 -124q-102 -65 -151.5 -145.5t-49.5 -182.5q0 -113 60 -200t173 -138z" />
-    <glyph glyph-name="uniF001" unicode="&#xf001;" horiz-adv-x="1042" 
-d="M389 819v-604q49 -15 114 -69q15 -12 21 -17l64 37l14 -25q-63 -35 -118.5 -79t-106.5 -99q-48 54 -102 84.5t-101 30.5q-20 0 -39.5 -6t-42.5 -19q13 40 41.5 76.5t75.5 73.5v614h-152v92h152v49q0 58 -14.5 104.5t-40.5 74.5h16q106 0 211 57t201 166q45 -71 87.5 -101
-t94.5 -30q21 0 43.5 8.5t48.5 25.5q-26 -82 -91 -127.5t-157 -45.5q-56 0 -99.5 22t-82.5 70l-37 -23v-250h186q71 0 116.5 20t92.5 64q23 -49 56.5 -75.5t72.5 -26.5q8 0 21.5 4.5t35.5 13.5q-1 -47 -26.5 -83t-77.5 -64v-428q0 -99 32.5 -135t114.5 -40q-35 -27 -77 -73.5
-t-86 -105.5q-91 24 -127.5 97t-36.5 253v450l-41 39h-256z" />
-    <glyph glyph-name="uniF001" unicode="&#xfb01;" horiz-adv-x="1042" 
-d="M389 819v-604q49 -15 114 -69q15 -12 21 -17l64 37l14 -25q-63 -35 -118.5 -79t-106.5 -99q-48 54 -102 84.5t-101 30.5q-20 0 -39.5 -6t-42.5 -19q13 40 41.5 76.5t75.5 73.5v614h-152v92h152v49q0 58 -14.5 104.5t-40.5 74.5h16q106 0 211 57t201 166q45 -71 87.5 -101
-t94.5 -30q21 0 43.5 8.5t48.5 25.5q-26 -82 -91 -127.5t-157 -45.5q-56 0 -99.5 22t-82.5 70l-37 -23v-250h186q71 0 116.5 20t92.5 64q23 -49 56.5 -75.5t72.5 -26.5q8 0 21.5 4.5t35.5 13.5q-1 -47 -26.5 -83t-77.5 -64v-428q0 -99 32.5 -135t114.5 -40q-35 -27 -77 -73.5
-t-86 -105.5q-91 24 -127.5 97t-36.5 253v450l-41 39h-256z" />
-    <glyph glyph-name="uniF002" unicode="&#xf002;" horiz-adv-x="1024" 
-d="M707 1233q45 13 93 43.5t124 97.5l14 -14q-40 -46 -57 -105t-17 -211v-829q29 -8 58.5 -26.5t76.5 -59.5l64 37l16 -25q-53 -28 -110 -71.5t-119 -104.5q-95 81 -160.5 113t-131.5 35q-72 -52 -112.5 -86t-68.5 -64q-59 59 -108.5 87t-94.5 28q-20 0 -40 -6t-42 -19
-q14 42 43.5 79t75.5 71v614h-154v94h154v19q0 77 -13.5 127t-41.5 82h12q115 0 225.5 55.5t210.5 165.5q25 -45 50 -76t53 -51zM680 817h-291v-602q42 -13 82.5 -32.5t85.5 -47.5l123 66v616zM389 911h291v184q-60 2 -119.5 22.5t-128.5 64.5l-43 -21v-250z" />
-    <glyph glyph-name="uniF002" unicode="&#xfb02;" horiz-adv-x="1024" 
-d="M707 1233q45 13 93 43.5t124 97.5l14 -14q-40 -46 -57 -105t-17 -211v-829q29 -8 58.5 -26.5t76.5 -59.5l64 37l16 -25q-53 -28 -110 -71.5t-119 -104.5q-95 81 -160.5 113t-131.5 35q-72 -52 -112.5 -86t-68.5 -64q-59 59 -108.5 87t-94.5 28q-20 0 -40 -6t-42 -19
-q14 42 43.5 79t75.5 71v614h-154v94h154v19q0 77 -13.5 127t-41.5 82h12q115 0 225.5 55.5t210.5 165.5q25 -45 50 -76t53 -51zM680 817h-291v-602q42 -13 82.5 -32.5t85.5 -47.5l123 66v616zM389 911h291v184q-60 2 -119.5 22.5t-128.5 64.5l-43 -21v-250z" />
-  </font>
-</defs></svg>

BIN
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.ttf


BIN
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff


BIN
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff2


BIN
ruoyi-admin/src/main/resources/static/assets/img/logo.jpg


BIN
ruoyi-admin/src/main/resources/static/assets/img/logo1.jpg


BIN
ruoyi-admin/src/main/resources/static/assets/img/logo2.jpg


BIN
ruoyi-admin/src/main/resources/static/assets/img/logo3.jpg


+ 0 - 38
ruoyi-admin/src/main/resources/static/assets/js/bing.js

@@ -1,38 +0,0 @@
-const https = require('https')
-const fs = require('fs')
-
-const options = {
-  hostname: 'www.bing.com',
-  port: 443,
-  path: '/HPImageArchive.aspx?format=js&idx=0&n=8',
-  method: 'GET'
-}
-
-const req = https.request(options, bing_res => {
-  let bing_body = [], bing_data = {};
-  bing_res.on('data', (chunk) => {
-    bing_body.push(chunk);
-  });
-  bing_res.on('end', () => {
-    bing_body = Buffer.concat(bing_body);
-    bing_data = JSON.parse(bing_body.toString());
-    let img_array = bing_data.images;
-    let img_url = [];
-    img_array.forEach(img => {
-      img_url.push(img.url);
-    });
-    var jsonpStr = "getBingImages(" + JSON.stringify(img_url) + ")";
-    fs.writeFile('./assets/json/images.json', jsonpStr, (err) => {
-      if (err) {
-        throw err;
-      }
-      console.log("JSON data is saved: " + jsonpStr);
-    });
-  });
-})
-
-req.on('error', error => {
-  console.error(error)
-})
-
-req.end()

+ 0 - 104
ruoyi-admin/src/main/resources/static/assets/js/main.js

@@ -1,104 +0,0 @@
-var iUp = (function () {
-	var time = 0,
-		duration = 150,
-		clean = function () {
-			time = 0;
-		},
-		up = function (element) {
-			setTimeout(function () {
-				element.classList.add("up");
-			}, time);
-			time += duration;
-		},
-		down = function (element) {
-			element.classList.remove("up");
-		},
-		toggle = function (element) {
-			setTimeout(function () {
-				element.classList.toggle("up");
-			}, time);
-			time += duration;
-		};
-	return {
-		clean: clean,
-		up: up,
-		down: down,
-		toggle: toggle
-	};
-})();
-
-function getBingImages(imgUrls) {
-	/**
-	 * 获取Bing壁纸
-	 * 先使用 GitHub Action 每天获取 Bing 壁纸 URL 并更新 images.json 文件
-	 * 然后读取 images.json 文件中的数据
-	 */
-	var indexName = "bing-image-index";
-	var index = sessionStorage.getItem(indexName);
-	var panel = document.querySelector('#panel');
-	if (isNaN(index) || index == 7) index = 0;
-	else index++;
-	var imgUrl = imgUrls[index];
-	var url = "https://www.cn.bing.com" + imgUrl;
-	panel.style.background = "url('" + url + "') center center no-repeat #666";
-	panel.style.backgroundSize = "cover";
-	sessionStorage.setItem(indexName, index);
-}
-
-function decryptEmail(encoded) {
-	var address = atob(encoded);
-	window.location.href = "mailto:" + address;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
-	// 获取一言数据
-	var xhr = new XMLHttpRequest();
-	xhr.onreadystatechange = function () {
-		if (this.readyState == 4 && this.status == 200) {
-			var res = JSON.parse(this.responseText);
-			document.getElementById('description').innerHTML = res.hitokoto + "<br/> -「<strong>" + res.from + "</strong>」";
-		}
-	};
-	xhr.open("GET", "https://v1.hitokoto.cn", true);
-	xhr.send();
-
-	var iUpElements = document.querySelectorAll(".iUp");
-	iUpElements.forEach(function (element) {
-		iUp.up(element);
-	});
-
-	var avatarElement = document.querySelector(".js-avatar");
-	avatarElement.addEventListener('load', function () {
-		avatarElement.classList.add("show");
-	});
-});
-
-var btnMobileMenu = document.querySelector('.btn-mobile-menu__icon');
-var navigationWrapper = document.querySelector('.navigation-wrapper');
-
-btnMobileMenu.addEventListener('click', function () {
-	if (navigationWrapper.style.display == "block") {
-		navigationWrapper.addEventListener('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () {
-			navigationWrapper.classList.toggle('visible');
-			navigationWrapper.classList.toggle('animated');
-			navigationWrapper.classList.toggle('bounceOutUp');
-			navigationWrapper.removeEventListener('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', arguments.callee);
-		});
-		navigationWrapper.classList.toggle('animated');
-		navigationWrapper.classList.toggle('bounceInDown');
-		navigationWrapper.classList.toggle('animated');
-		navigationWrapper.classList.toggle('bounceOutUp');
-	} else {
-		navigationWrapper.classList.toggle('visible');
-		navigationWrapper.classList.toggle('animated');
-		navigationWrapper.classList.toggle('bounceInDown');
-	}
-	btnMobileMenu.classList.toggle('social');
-	btnMobileMenu.classList.toggle('iconfont');
-	btnMobileMenu.classList.toggle('icon-list');
-	btnMobileMenu.classList.toggle('social');
-	btnMobileMenu.classList.toggle('iconfont');
-	btnMobileMenu.classList.toggle('icon-angleup');
-	btnMobileMenu.classList.toggle('animated');
-	btnMobileMenu.classList.toggle('fadeIn');
-});

+ 0 - 1
ruoyi-admin/src/main/resources/static/assets/json/images.json

@@ -1 +0,0 @@
-getBingImages(["/th?id=OHR.TheRoachesPeakDistrict_EN-US9733115206_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.SanMiguelAllende_EN-US9621237021_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.JediMonastery_EN-US9398447907_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.SonoranSpring_EN-US9207877073_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.CratersOfTheMoon_EN-US6516727783_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.HawaiianLei_EN-US6290126556_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.CheetahRain_EN-US6179670004_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.TulouFujian_EN-US6009679228_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp"])

+ 0 - 1
ruoyi-admin/src/main/resources/static/assets/svg/favicon.svg

@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1714852590465" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1571" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M263.1 844.8h497.7c22.9 0 41.5 18.6 41.5 41.5s-18.6 41.5-41.5 41.5H263.1c-22.9 0-41.5-18.6-41.5-41.5s18.6-41.5 41.5-41.5zM138.7 98.2h746.6c22.9 0 41.5 18.6 41.5 41.5v580.7c0 11-4.4 21.6-12.1 29.3-7.8 7.8-18.3 12.1-29.3 12.1H138.7c-11 0-21.6-4.4-29.3-12.1-7.8-7.8-12.1-18.3-12.1-29.3V139.7c-0.1-22.9 18.5-41.5 41.4-41.5z m331.8 478.9v60.4h83v-60.3c8.5-5.8 17.4-12.8 26.5-20.5l49.4 49.4 58.7-58.7-49.5-49.4c7.7-9 14.6-18 20.5-26.5h60.3v-83h-60.3c-6.4-9.1-13.3-18-20.5-26.5l49.4-49.4-58.7-58.6-49.4 49.4c-8.5-7.3-17.3-14.1-26.5-20.5v-60.3h-83V283c-8.5 5.8-17.4 12.8-26.5 20.5l-49.4-49.4-58.5 58.6 49.4 49.4c-7.2 8.5-14.1 17.3-20.5 26.5h-60.3v83h60.3c5.8 8.5 12.8 17.4 20.5 26.5L336 547.3l58.7 58.7 49.4-49.4c9.1 7.7 18 14.6 26.4 20.5z m0 0" p-id="1572"></path></svg>

+ 0 - 45
ruoyi-admin/src/test/java/com/xmzs/test/AssertUnitTest.java

@@ -1,45 +0,0 @@
-package com.xmzs.test;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-
-/**
- * 断言单元测试案例
- *
- * @author Lion Li
- */
-@DisplayName("断言单元测试案例")
-public class AssertUnitTest {
-
-    @DisplayName("测试 assertEquals 方法")
-    @Test
-    public void testAssertEquals() {
-        Assertions.assertEquals("666", new String("666"));
-        Assertions.assertNotEquals("666", new String("666"));
-    }
-
-    @DisplayName("测试 assertSame 方法")
-    @Test
-    public void testAssertSame() {
-        Object obj = new Object();
-        Object obj1 = obj;
-        Assertions.assertSame(obj, obj1);
-        Assertions.assertNotSame(obj, obj1);
-    }
-
-    @DisplayName("测试 assertTrue 方法")
-    @Test
-    public void testAssertTrue() {
-        Assertions.assertTrue(true);
-        Assertions.assertFalse(true);
-    }
-
-    @DisplayName("测试 assertNull 方法")
-    @Test
-    public void testAssertNull() {
-        Assertions.assertNull(null);
-        Assertions.assertNotNull(null);
-    }
-
-}

+ 0 - 70
ruoyi-admin/src/test/java/com/xmzs/test/DemoUnitTest.java

@@ -1,70 +0,0 @@
-package com.xmzs.test;
-
-import com.xmzs.common.core.config.RuoYiConfig;
-import org.junit.jupiter.api.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * 单元测试案例
- *
- * @author Lion Li
- */
-@SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件
-@DisplayName("单元测试案例")
-public class DemoUnitTest {
-
-    @Autowired
-    private RuoYiConfig ruoYiConfig;
-
-    @DisplayName("测试 @SpringBootTest @Test @DisplayName 注解")
-    @Test
-    public void testTest() {
-        System.out.println(ruoYiConfig);
-    }
-
-    @Disabled
-    @DisplayName("测试 @Disabled 注解")
-    @Test
-    public void testDisabled() {
-        System.out.println(ruoYiConfig);
-    }
-
-    @Timeout(value = 2L, unit = TimeUnit.SECONDS)
-    @DisplayName("测试 @Timeout 注解")
-    @Test
-    public void testTimeout() throws InterruptedException {
-        Thread.sleep(3000);
-        System.out.println(ruoYiConfig);
-    }
-
-
-    @DisplayName("测试 @RepeatedTest 注解")
-    @RepeatedTest(3)
-    public void testRepeatedTest() {
-        System.out.println(666);
-    }
-
-    @BeforeAll
-    public static void testBeforeAll() {
-        System.out.println("@BeforeAll ==================");
-    }
-
-    @BeforeEach
-    public void testBeforeEach() {
-        System.out.println("@BeforeEach ==================");
-    }
-
-    @AfterEach
-    public void testAfterEach() {
-        System.out.println("@AfterEach ==================");
-    }
-
-    @AfterAll
-    public static void testAfterAll() {
-        System.out.println("@AfterAll ==================");
-    }
-
-}

+ 0 - 72
ruoyi-admin/src/test/java/com/xmzs/test/ParamUnitTest.java

@@ -1,72 +0,0 @@
-package com.xmzs.test;
-
-import com.xmzs.common.core.enums.UserType;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.EnumSource;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.junit.jupiter.params.provider.NullSource;
-import org.junit.jupiter.params.provider.ValueSource;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Stream;
-
-/**
- * 带参数单元测试案例
- *
- * @author Lion Li
- */
-@DisplayName("带参数单元测试案例")
-public class ParamUnitTest {
-
-    @DisplayName("测试 @ValueSource 注解")
-    @ParameterizedTest
-    @ValueSource(strings = {"t1", "t2", "t3"})
-    public void testValueSource(String str) {
-        System.out.println(str);
-    }
-
-    @DisplayName("测试 @NullSource 注解")
-    @ParameterizedTest
-    @NullSource
-    public void testNullSource(String str) {
-        System.out.println(str);
-    }
-
-    @DisplayName("测试 @EnumSource 注解")
-    @ParameterizedTest
-    @EnumSource(UserType.class)
-    public void testEnumSource(UserType type) {
-        System.out.println(type.getUserType());
-    }
-
-    @DisplayName("测试 @MethodSource 注解")
-    @ParameterizedTest
-    @MethodSource("getParam")
-    public void testMethodSource(String str) {
-        System.out.println(str);
-    }
-
-    public static Stream<String> getParam() {
-        List<String> list = new ArrayList<>();
-        list.add("t1");
-        list.add("t2");
-        list.add("t3");
-        return list.stream();
-    }
-
-    @BeforeEach
-    public void testBeforeEach() {
-        System.out.println("@BeforeEach ==================");
-    }
-
-    @AfterEach
-    public void testAfterEach() {
-        System.out.println("@AfterEach ==================");
-    }
-
-
-}

+ 0 - 54
ruoyi-admin/src/test/java/com/xmzs/test/TagUnitTest.java

@@ -1,54 +0,0 @@
-package com.xmzs.test;
-
-import org.junit.jupiter.api.*;
-import org.springframework.boot.test.context.SpringBootTest;
-
-/**
- * 标签单元测试案例
- *
- * @author Lion Li
- */
-@SpringBootTest
-@DisplayName("标签单元测试案例")
-public class TagUnitTest {
-
-    @Tag("dev")
-    @DisplayName("测试 @Tag dev")
-    @Test
-    public void testTagDev() {
-        System.out.println("dev");
-    }
-
-    @Tag("prod")
-    @DisplayName("测试 @Tag prod")
-    @Test
-    public void testTagProd() {
-        System.out.println("prod");
-    }
-
-    @Tag("local")
-    @DisplayName("测试 @Tag local")
-    @Test
-    public void testTagLocal() {
-        System.out.println("local");
-    }
-
-    @Tag("exclude")
-    @DisplayName("测试 @Tag exclude")
-    @Test
-    public void testTagExclude() {
-        System.out.println("exclude");
-    }
-
-    @BeforeEach
-    public void testBeforeEach() {
-        System.out.println("@BeforeEach ==================");
-    }
-
-    @AfterEach
-    public void testAfterEach() {
-        System.out.println("@AfterEach ==================");
-    }
-
-
-}

+ 0 - 0
ruoyi-admin/src/test/java/org/ruoyi/test/AssertUnitTest.java → ruoyi-admin/src/test/java/org/biada/test/AssertUnitTest.java


+ 0 - 0
ruoyi-admin/src/test/java/org/ruoyi/test/DemoUnitTest.java → ruoyi-admin/src/test/java/org/biada/test/DemoUnitTest.java


+ 0 - 0
ruoyi-admin/src/test/java/org/ruoyi/test/ParamUnitTest.java → ruoyi-admin/src/test/java/org/biada/test/ParamUnitTest.java


+ 0 - 0
ruoyi-admin/src/test/java/org/ruoyi/test/TagUnitTest.java → ruoyi-admin/src/test/java/org/biada/test/TagUnitTest.java


+ 1 - 0
ruoyi-common/pom.xml

@@ -33,6 +33,7 @@
         <module>ruoyi-common-tenant</module>
         <module>ruoyi-common-chat</module>
         <module>ruoyi-common-pay</module>
+        <module>ruoyi-common-wechat</module>
     </modules>
 
     <artifactId>ruoyi-common</artifactId>

+ 7 - 0
ruoyi-common/ruoyi-common-bom/pom.xml

@@ -159,6 +159,13 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 微信模块 -->
+            <dependency>
+                <groupId>org.ruoyi</groupId>
+                <artifactId>ruoyi-common-wechat</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
             <!-- AI绘画 -->
             <dependency>
                 <groupId>org.ruoyi</groupId>

+ 23 - 5
ruoyi-common/ruoyi-common-chat/pom.xml

@@ -26,6 +26,18 @@
             <artifactId>ruoyi-common-core</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.azure</groupId>
+            <artifactId>azure-ai-openai</artifactId>
+            <version>1.0.0-beta.12</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.github.ollama4j</groupId>
+            <artifactId>ollama4j</artifactId>
+            <version>1.0.79</version>
+        </dependency>
+
         <!-- 序列化模块 -->
         <dependency>
             <groupId>org.ruoyi</groupId>
@@ -42,11 +54,6 @@
             <artifactId>ruoyi-common-satoken</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-websocket</artifactId>
-        </dependency>
-
         <dependency>
             <groupId>com.squareup.retrofit2</groupId>
             <artifactId>retrofit</artifactId>
@@ -74,5 +81,16 @@
             <artifactId>hutool-all</artifactId>
             <version>5.8.12</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 </project>

+ 0 - 49
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/config/ChatConfig.java

@@ -1,49 +0,0 @@
-package com.xmzs.common.chat.config;
-
-
-import okhttp3.OkHttpClient;
-import okhttp3.logging.HttpLoggingInterceptor;
-import com.xmzs.common.chat.openai.OpenAiStreamClient;
-import com.xmzs.common.chat.openai.function.KeyRandomStrategy;
-import com.xmzs.common.chat.openai.interceptor.OpenAILogger;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * chat配置类
- *
- * @author: wangle
- * @date: 2023/5/16
- */
-@Configuration
-public class ChatConfig {
-    @Value("${chat.apiKey}")
-    private List<String> apiKey;
-    @Value("${chat.apiHost}")
-    private String apiHost;
-
-    @Bean(name = "openAiStreamClient")
-    public OpenAiStreamClient openAiStreamClient() {
-        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());
-        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
-        OkHttpClient okHttpClient = new OkHttpClient
-            .Builder()
-            .addInterceptor(httpLoggingInterceptor)
-            .connectTimeout(30, TimeUnit.SECONDS)
-            .writeTimeout(600, TimeUnit.SECONDS)
-            .readTimeout(600, TimeUnit.SECONDS)
-            .build();
-        return OpenAiStreamClient
-            .builder()
-            .apiHost(apiHost)
-            .apiKey(apiKey)
-            //自定义key使用策略 默认随机策略
-            .keyStrategy(new KeyRandomStrategy())
-            .okHttpClient(okHttpClient)
-            .build();
-    }
-}

+ 0 - 36
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/config/LocalCache.java

@@ -1,36 +0,0 @@
-package com.xmzs.common.chat.config;
-
-import cn.hutool.cache.CacheUtil;
-import cn.hutool.cache.impl.TimedCache;
-import cn.hutool.core.date.DateUnit;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @date 2023-03-10
- */
-@Slf4j
-public class LocalCache {
-    /**
-     * 缓存时长
-     */
-    public static final long TIMEOUT = 30 * DateUnit.MINUTE.getMillis();
-    /**
-     * 清理间隔
-     */
-    private static final long CLEAN_TIMEOUT = 30 * DateUnit.MINUTE.getMillis();
-
-    /**
-     * 缓存对象
-     */
-    public static final TimedCache<String, Object> CACHE = CacheUtil.newTimedCache(TIMEOUT);
-
-
-    static {
-        //启动定时任务
-        CACHE.schedulePrune(CLEAN_TIMEOUT);
-    }
-
-}

+ 0 - 61
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/config/WebSocketConfig.java

@@ -1,61 +0,0 @@
-package com.xmzs.common.chat.config;
-
-import cn.hutool.core.util.StrUtil;
-import com.xmzs.common.chat.config.properties.WebSocketProperties;
-import com.xmzs.common.chat.handler.PlusWebSocketHandler;
-import com.xmzs.common.chat.interceptor.PlusWebSocketInterceptor;
-import com.xmzs.common.chat.listener.WebSocketTopicListener;
-import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-
-import org.springframework.web.socket.WebSocketHandler;
-import org.springframework.web.socket.config.annotation.EnableWebSocket;
-import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
-import org.springframework.web.socket.server.HandshakeInterceptor;
-
-/**
- * WebSocket 配置
- *
- * @author zendwang
- */
-@AutoConfiguration
-@ConditionalOnProperty(value = "websocket.enabled", havingValue = "true")
-@EnableConfigurationProperties(WebSocketProperties.class)
-@EnableWebSocket
-public class WebSocketConfig {
-
-    @Bean
-    public WebSocketConfigurer webSocketConfigurer(HandshakeInterceptor handshakeInterceptor,
-                                                   WebSocketHandler webSocketHandler,
-                                                   WebSocketProperties webSocketProperties) {
-        if (StrUtil.isBlank(webSocketProperties.getPath())) {
-            webSocketProperties.setPath("/websocket");
-        }
-
-        if (StrUtil.isBlank(webSocketProperties.getAllowedOrigins())) {
-            webSocketProperties.setAllowedOrigins("*");
-        }
-
-        return registry -> registry
-            .addHandler(webSocketHandler, webSocketProperties.getPath())
-            .addInterceptors(handshakeInterceptor)
-            .setAllowedOrigins(webSocketProperties.getAllowedOrigins());
-    }
-
-    @Bean
-    public HandshakeInterceptor handshakeInterceptor() {
-        return new PlusWebSocketInterceptor();
-    }
-
-    @Bean
-    public WebSocketHandler webSocketHandler() {
-        return new PlusWebSocketHandler();
-    }
-
-    @Bean
-    public WebSocketTopicListener topicListener() {
-        return new WebSocketTopicListener();
-    }
-}

+ 0 - 26
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/config/properties/WebSocketProperties.java

@@ -1,26 +0,0 @@
-package com.xmzs.common.chat.config.properties;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-/**
- * WebSocket 配置项
- *
- * @author zendwang
- */
-@ConfigurationProperties("websocket")
-@Data
-public class WebSocketProperties {
-
-    private Boolean enabled;
-
-    /**
-     * 路径
-     */
-    private String path;
-
-    /**
-     *  设置访问源地址
-     */
-    private String allowedOrigins;
-}

+ 0 - 38
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/constant/OpenAIConst.java

@@ -1,38 +0,0 @@
-package com.xmzs.common.chat.constant;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @since  2023-03-06
- */
-public class OpenAIConst {
-
-    public final static String OPENAI_HOST = "https://api.openai.com/";
-
-    public final static int SUCCEED_CODE = 200;
-
-    /** GPT3扣除费用 */
-    public final static double GPT3_COST = 0.05;
-
-    /** GPT4扣除费用 */
-    public final static double GPT4_COST = 0.2;
-
-    /** DALL普通绘图扣除费用 */
-    public final static double DALL3_COST = 0.3;
-
-    /** DALL高清绘图扣除费用 */
-    public final static double DALL3_HD_COST = 0.5;
-
-    /** MJ操作类型1(变化、变焦、文生图、图生图、局部重绘、混图)扣除费用 */
-    public final static double MJ_COST_TYPE1 = 0.3;
-
-    /** MJ操作类型2(换脸、放大、图生文、prompt分析)扣除费用 */
-    public final static double MJ_COST_TYPE2 = 0.1;
-
-    /** MJ操作类型3(查询任务进度、获取seed)扣除费用 */
-    public final static double MJ_COST_TYPE3 = 0.0;
-
-    /** 默认账户余额 */
-    public final static double USER_BALANCE = 5;
-}

+ 0 - 28
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/constant/WebSocketConstants.java

@@ -1,28 +0,0 @@
-package com.xmzs.common.chat.constant;
-
-/**
- * websocket的常量配置
- *
- * @author zendwang
- */
-public interface WebSocketConstants {
-    /**
-     * websocketSession中的参数的key
-     */
-    String LOGIN_USER_KEY = "loginUser";
-
-    /**
-     * 订阅的频道
-     */
-    String WEB_SOCKET_TOPIC = "global:websocket";
-
-    /**
-     * 前端心跳检查的命令
-     */
-    String PING = "ping";
-
-    /**
-     * 服务端心跳恢复的字符串
-     */
-    String PONG = "pong";
-}

+ 0 - 31
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/ChatProcessRequest.java

@@ -1,31 +0,0 @@
-package com.xmzs.common.chat.domain.request;
-
-
-import lombok.Data;
-
-/**
- * @author hncboy
- * @date 2023/3/23 13:17
- * 消息处理请求
- */
-@Data
-public class ChatProcessRequest {
-
-    private String prompt;
-
-    private Options options;
-
-    private String systemMessage;
-
-    @Data
-    public static class Options {
-
-        private String conversationId;
-
-        /**
-         * 这里的父级消息指的是回答的父级消息 id
-         * 前端发送问题,需要上下文的话传回答的父级消息 id
-         */
-        private String parentMessageId;
-    }
-}

+ 0 - 55
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/ChatRequest.java

@@ -1,55 +0,0 @@
-package com.xmzs.common.chat.domain.request;
-
-import com.xmzs.common.chat.entity.chat.Content;
-import com.xmzs.common.chat.entity.chat.Message;
-import jakarta.validation.constraints.NotEmpty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @sine 2023-04-08
- */
-@Data
-public class ChatRequest {
-
-    @NotEmpty(message = "传入的模型不能为空")
-    private String model;
-
-    @NotEmpty(message = "对话消息不能为空")
-    List<Message> messages;
-
-    List<Content> imageContent;
-
-    private String prompt;
-
-    private String userId;
-
-    /**
-     * 知识库id
-     */
-    private String kid;
-
-    /**
-     * gpt的默认设置
-     */
-    private String systemMessage = "";
-
-    private double top_p = 1;
-
-    private double temperature = 0.2;
-
-    /**
-     * 上下文的条数
-     */
-    private Integer contentNumber = 10;
-
-    /**
-     * 是否携带上下文
-     */
-    private Boolean usingContext = Boolean.TRUE;
-
-}

+ 0 - 33
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/Dall3Request.java

@@ -1,33 +0,0 @@
-package com.xmzs.common.chat.domain.request;
-
-import jakarta.validation.constraints.NotEmpty;
-import lombok.Data;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @sine 2023-04-08
- */
-@Data
-public class Dall3Request {
-
-    @NotEmpty(message = "传入的模型不能为空")
-    private String model;
-
-    @NotEmpty(message = "提示词不能为空")
-    private String prompt;
-
-    /** 图片大小 */
-    @NotEmpty(message = "图片大小不能为空")
-    private String size ;
-
-    /** 图片质量 */
-    @NotEmpty(message = "图片质量不能为空")
-    private String quality;
-
-    /** 图片风格 */
-    @NotEmpty(message = "图片风格不能为空")
-    private String style;
-
-}

+ 0 - 15
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/MjTaskRequest.java

@@ -1,15 +0,0 @@
-package com.xmzs.common.chat.domain.request;
-
-import jakarta.validation.constraints.NotEmpty;
-import lombok.Data;
-
-/**
- * mj任务请求实体类
- *
- * @author WangLe
- */
-@Data
-public class MjTaskRequest {
-
-    private String prompt;
-}

+ 0 - 34
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/RoleRequest.java

@@ -1,34 +0,0 @@
-package com.xmzs.common.chat.domain.request;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class RoleRequest {
-
-    /**
-     * 角色名称
-     */
-    private String name;
-
-    /**
-     * 角色描述
-     */
-    private String description;
-
-    /**
-     * 音频地址
-     */
-    private String prompt;
-
-    /**
-     * 头像
-     */
-    private String avatar;
-
-
-    private String preProcess;
-
-}

+ 0 - 21
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/SaveMsgRequest.java

@@ -1,21 +0,0 @@
-package com.xmzs.common.chat.domain.request;
-
-import jakarta.validation.constraints.NotEmpty;
-import lombok.Data;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @sine 2023-04-08
- */
-@Data
-public class SaveMsgRequest {
-
-    @NotEmpty(message = "传入的模型不能为空")
-    private String model;
-
-    @NotEmpty(message = "对话消息不能为空")
-    private String msg;
-
-}

+ 0 - 35
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/request/SimpleGenerateRequest.java

@@ -1,35 +0,0 @@
-package com.xmzs.common.chat.domain.request;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class SimpleGenerateRequest {
-
-    /**
-     * 要使用的模型ID (目前统一为reecho-neural-voice-001)
-     */
-    private String model = "reecho-neural-voice-001";
-
-    /**
-     * 多样性 (0-100,默认为97)
-     */
-    private Integer randomness;
-
-    /**
-     * 稳定性过滤 (0-100,默认为0)
-     */
-    private Integer stability_boost;
-
-    /**
-     * 角色ID
-     */
-    private String voiceId;
-
-    /**
-     * 要生成的文本内容
-     */
-    private String text;
-}

+ 0 - 19
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/ChatResponse.java

@@ -1,19 +0,0 @@
-package com.xmzs.common.chat.domain.response;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @sine 2023-04-08
- */
-@Data
-public class ChatResponse {
-    /**
-     * 问题消耗tokens
-     */
-    @JsonProperty("question_tokens")
-    private long questionTokens = 0;
-}

+ 0 - 14
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/MetadataResponse.java

@@ -1,14 +0,0 @@
-package com.xmzs.common.chat.domain.response;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class MetadataResponse {
-    private String promptMP3StorageUrl;
-    private String promptOriginAudioStorageUrl;
-    private String description;
-    private boolean preProcess;
-}

+ 0 - 20
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/RoleDataResponse.java

@@ -1,20 +0,0 @@
-package com.xmzs.common.chat.domain.response;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class RoleDataResponse {
-    private String id;
-    private String name;
-    private String status;
-    private String from;
-    private String originId;
-    private MetadataResponse metadata;
-    private String createdAt;
-    private String updatedAt;
-    private String deletedAt;
-    private String userId;
-}

+ 0 - 13
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/RoleResponse.java

@@ -1,13 +0,0 @@
-package com.xmzs.common.chat.domain.response;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class RoleResponse {
-    private String status;
-    private String message;
-    private RoleDataResponse data;
-}

+ 0 - 25
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/SimpleGenerateDataResponse.java

@@ -1,25 +0,0 @@
-package com.xmzs.common.chat.domain.response;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class SimpleGenerateDataResponse {
-
-    /**
-     * 本次生成的ID
-     */
-    private String id;
-
-    /**
-     * 本次生成结果的音频文件地址
-     */
-    private String audio;
-
-    /**
-     * 本次生成所消耗的点数
-     */
-    private Integer credit_used;
-}

+ 0 - 25
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/domain/response/SimpleGenerateResponse.java

@@ -1,25 +0,0 @@
-package com.xmzs.common.chat.domain.response;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class SimpleGenerateResponse {
-
-    /**
-     * 状态码,失败时则为500
-     */
-    private String status;
-
-    /**
-     * 状态消息
-     */
-    private String message;
-
-    /**
-     * 生成详情
-     */
-    private SimpleGenerateDataResponse data;
-}

+ 0 - 48
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/Tts/TextToSpeech.java

@@ -1,48 +0,0 @@
-package com.xmzs.common.chat.entity.Tts;
-
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.*;
-
-@Data
-@Builder
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@NoArgsConstructor
-@AllArgsConstructor
-public class TextToSpeech {
-
-    @Builder.Default
-    private String model = Model.TTS_1.getName();
-    /**
-     * 音频声音源
-     *
-     * @see TtsVoice
-     */
-    private String voice;
-    /**
-     * 输入内容
-     */
-    private String input;
-    /**
-     * 输出音频文件格式
-     *
-     * @see TtsFormat
-     */
-    @JsonProperty("response_format")
-    private String responseFormat;
-    /**
-     * 速度调节,默认是1,取值范围0.25——4.0
-     */
-    private Double speed;
-
-
-    @Getter
-    @AllArgsConstructor
-    public enum Model {
-        TTS_1("tts-1"),
-        TTS_1_HD("tts-1-hd"),
-        ;
-        private final String name;
-    }
-}

+ 0 - 15
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/Tts/TtsFormat.java

@@ -1,15 +0,0 @@
-package com.xmzs.common.chat.entity.Tts;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-@Getter
-@AllArgsConstructor
-public enum TtsFormat {
-    MP3("mp3"),
-    OPUS("opus"),
-    AAC("aac"),
-    FLAC("flac"),
-    ;
-    private final String name;
-}

+ 0 - 23
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/Tts/TtsVoice.java

@@ -1,23 +0,0 @@
-package com.xmzs.common.chat.entity.Tts;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 生成不同声音的音频
- * <p>具体语音效果参考:https://platform.openai.com/docs/guides/text-to-speech</p>
- */
-@Getter
-@AllArgsConstructor
-public enum TtsVoice {
-
-    ALLOY("alloy"),
-    ECHO("echo"),
-    FABLE("fable"),
-    ONYX("onyx"),
-    NOVA("nova"),
-    SHIMMER("shimmer"),
-    ;
-
-    private final String name;
-}

+ 0 - 33
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/BillingUsage.java

@@ -1,33 +0,0 @@
-package com.xmzs.common.chat.entity.billing;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 描述:金额消耗信息
- *
- * @author https:www.unfbx.com
- * @since 2023-04-08
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class BillingUsage {
-
-    @JsonProperty("object")
-    private String object;
-    /**
-     * 账号金额消耗明细
-     */
-    @JsonProperty("daily_costs")
-    private List<DailyCost> dailyCosts;
-    /**
-     * 总使用金额:美分
-     */
-    @JsonProperty("total_usage")
-    private BigDecimal totalUsage;
-
-}

+ 0 - 39
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/CreditGrantsResponse.java

@@ -1,39 +0,0 @@
-package com.xmzs.common.chat.entity.billing;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-/**
- * 描述:余额查询接口返回值
- *
- * @author https:www.unfbx.com
- * @since 2023-03-18
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class CreditGrantsResponse implements Serializable {
-    private String object;
-    /**
-     * 总金额:美元
-     */
-    @JsonProperty("total_granted")
-    private BigDecimal totalGranted;
-    /**
-     * 总使用金额:美元
-     */
-    @JsonProperty("total_used")
-    private BigDecimal totalUsed;
-    /**
-     * 总剩余金额:美元
-     */
-    @JsonProperty("total_available")
-    private BigDecimal totalAvailable;
-    /**
-     * 余额明细
-     */
-    private Grants grants;
-}

+ 0 - 28
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/DailyCost.java

@@ -1,28 +0,0 @@
-package com.xmzs.common.chat.entity.billing;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * 描述:金额消耗列表
- *
- * @author https:www.unfbx.com
- * @since 2023-04-08
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class DailyCost {
-    /**
-     * 时间戳
-     */
-    @JsonProperty("timestamp")
-    private long timestamp;
-    /**
-     * 模型消耗金额详情
-     */
-    @JsonProperty("line_items")
-    private List<LineItem> lineItems;
-}

+ 0 - 40
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/Datum.java

@@ -1,40 +0,0 @@
-package com.xmzs.common.chat.entity.billing;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @since 2023-03-18
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class Datum {
-    private String object;
-    private String id;
-    /**
-     * 赠送金额:美元
-     */
-    @JsonProperty("grant_amount")
-    private BigDecimal grantAmount;
-    /**
-     * 使用金额:美元
-     */
-    @JsonProperty("used_amount")
-    private BigDecimal usedAmount;
-    /**
-     * 生效时间戳
-     */
-    @JsonProperty("effective_at")
-    private Long effectiveAt;
-    /**
-     * 过期时间戳
-     */
-    @JsonProperty("expires_at")
-    private Long expiresAt;
-}

+ 0 - 21
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/Grants.java

@@ -1,21 +0,0 @@
-package com.xmzs.common.chat.entity.billing;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @since 2023-03-18
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class Grants {
-    private String object;
-    @JsonProperty("data")
-    private List<Datum> data;
-}

+ 0 - 56
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/KeyInfo.java

@@ -1,56 +0,0 @@
-package com.xmzs.common.chat.entity.billing;
-
-import lombok.*;
-
-import java.time.LocalDate;
-
-/**
- * openKey信息
- *
- * @author admin
- * @date 2023/6/15
- */
-@Getter
-@Setter
-@AllArgsConstructor
-@NoArgsConstructor
-@ToString
-public class KeyInfo {
-    /**
-     * 订阅类型
-     */
-    private String planTitle;
-    /**
-     * key值
-     */
-    private String keyValue;
-    /**
-     * 剩余额度
-     */
-    private Double remaining;
-
-    /**
-     * 账户总余额
-     */
-    private Double totalAmount;
-
-    /**
-     * 已使用的额度
-     */
-    private Double totalUsage;
-
-    /**
-     * 截至日期
-     */
-    private LocalDate limitDate;
-
-    /**
-     * 是否绑卡
-     */
-    private Boolean isHasPaymentMethod;
-
-    /**
-     * 最高可用模型
-     */
-    private String model;
-}

+ 0 - 25
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/LineItem.java

@@ -1,25 +0,0 @@
-package com.xmzs.common.chat.entity.billing;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-/**
- * 描述:金额消耗列表
- *
- * @author https:www.unfbx.com
- * @since 2023-04-08
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class LineItem {
-    /**
-     * 模型名称
-     */
-    private String name;
-    /**
-     * 消耗金额
-     */
-    private BigDecimal cost;
-}

+ 0 - 17
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/Plan.java

@@ -1,17 +0,0 @@
-package com.xmzs.common.chat.entity.billing;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.Data;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @since  2023-04-08
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class Plan {
-    private String title;
-    private String id;
-}

+ 0 - 73
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/billing/Subscription.java

@@ -1,73 +0,0 @@
-package com.xmzs.common.chat.entity.billing;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-/**
- * 描述:账户信息
- *
- * @author https:www.unfbx.com
- * @since  2023-04-08
- */
-@Data
-public class Subscription {
-
-    @JsonProperty("object")
-    private String object;
-
-    /**
-     * 付款方式
-     */
-    @JsonProperty("has_payment_method")
-    private boolean hasPaymentMethod;
-
-    @JsonProperty("canceled")
-    private boolean canceled;
-    @JsonProperty("canceled_at")
-    private Object canceledAt;
-
-    @JsonProperty("delinquent")
-    private Object delinquent;
-    @JsonProperty("access_until")
-    private long accessUntil;
-    @JsonProperty("soft_limit")
-    private long softLimit;
-    @JsonProperty("hard_limit")
-    private long hardLimit;
-    @JsonProperty("system_hard_limit")
-    private long systemHardLimit;
-    @JsonProperty("soft_limit_usd")
-    private double softLimitUsd;
-    @JsonProperty("hard_limit_usd")
-    private double hardLimitUsd;
-    @JsonProperty("system_hard_limit_usd")
-    private double systemHardLimitUsd;
-    /**
-     * 计划
-     */
-    @JsonProperty("plan")
-    private Plan plan;
-
-    /**
-     * 账户名称
-     */
-    @JsonProperty("account_name")
-    private String accountName;
-
-    @JsonProperty("po_number")
-    private Object poNumber;
-
-    /**
-     * 账单邮箱
-     */
-    @JsonProperty("billing_email")
-    private Object billingEmail;
-    @JsonProperty("tax_ids")
-    private Object taxIds;
-    @JsonProperty("billing_address")
-    private Object billingAddress;
-    @JsonProperty("business_address")
-    private Object businessAddress;
-    @JsonProperty("primary")
-    private Boolean primary;
-}

+ 0 - 263
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/BaseChatCompletion.java

@@ -1,263 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.xmzs.common.chat.constant.OpenAIConst;
-import com.xmzs.common.chat.entity.chat.tool.Tools;
-import lombok.*;
-import lombok.experimental.SuperBuilder;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-
-import static com.xmzs.common.chat.entity.chat.BaseChatCompletion.Model.GPT_3_5_TURBO;
-
-/**
- * 描述: chat模型基础类
- *
- * @author https:www.unfbx.com
- * @since 1.1.2
- * 2023-11-10
- */
-@Data
-@SuperBuilder
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@NoArgsConstructor
-@AllArgsConstructor
-public class BaseChatCompletion implements Serializable {
-
-    @NonNull
-    @Builder.Default
-    private String model = GPT_3_5_TURBO.getName();
-
-    /**
-     * 指定模型必须输出的格式的对象。
-     *
-     * @since 1.1.2
-     */
-    @JsonProperty("response_format")
-    private ResponseFormat responseFormat;
-
-    /**
-     * 已过时
-     *
-     * @see #tools
-     */
-    @Deprecated
-    private List<Functions> functions;
-
-    /**
-     * 取值:null,auto或者自定义
-     * functions没有值的时候默认为:null
-     * functions存在值得时候默认为:auto
-     * 也可以自定义
-     * <p>已过时</p>
-     *
-     * @see #toolChoice
-     */
-    @Deprecated
-    @JsonProperty("function_call")
-    private Object functionCall;
-
-    /**
-     * 模型可能调用的工具列表。
-     * 当前版本仅支持:functions
-     *
-     * @since 1.1.2
-     */
-    private List<Tools> tools;
-
-    /**
-     * 取值:String或者ToolChoiceObj
-     *
-     * @since 1.1.2
-     */
-    @JsonProperty("tool_choice")
-    private Object toolChoice;
-
-    /**
-     * 使用什么取样温度,0到2之间。较高的值(如0.8)将使输出更加随机,而较低的值(如0.2)将使输出更加集中和确定。
-     * <p>
-     * We generally recommend altering this or but not both.top_p
-     */
-    @Builder.Default
-    private double temperature = 0.2;
-
-    /**
-     * 使用温度采样的替代方法称为核心采样,其中模型考虑具有top_p概率质量的令牌的结果。因此,0.1 意味着只考虑包含前 10% 概率质量的代币。
-     * <p>
-     * 我们通常建议更改此设置,但不要同时更改两者。temperature
-     */
-    @JsonProperty("top_p")
-    @Builder.Default
-    private Double topP = 1d;
-
-
-    /**
-     * 为每个提示生成的完成次数。
-     */
-    @Builder.Default
-    private Integer n = 1;
-
-
-    /**
-     * 是否流式输出.
-     * default:false
-     */
-    @Builder.Default
-    private boolean stream = false;
-    /**
-     * 停止输出标识
-     */
-    private List<String> stop;
-    /**
-     * 最大支持4096
-     */
-    @JsonProperty("max_tokens")
-    @Builder.Default
-    private Integer maxTokens = 2048;
-
-
-    @JsonProperty("presence_penalty")
-    @Builder.Default
-    private double presencePenalty = 0;
-
-    /**
-     * -2.0 ~~ 2.0
-     */
-    @JsonProperty("frequency_penalty")
-    @Builder.Default
-    private double frequencyPenalty = 0;
-
-    @JsonProperty("logit_bias")
-    private Map logitBias;
-    /**
-     * 用户唯一值,确保接口不被重复调用
-     */
-    private String user;
-
-    /**
-     * @since 1.1.2
-     */
-    private Integer seed;
-
-
-    /**
-     * 最新模型参考官方文档:
-     * <a href="https://platform.openai.com/docs/models/model-endpoint-compatibility">官方稳定模型列表</a>
-     */
-    @Getter
-    @AllArgsConstructor
-    public enum Model {
-        /**
-         * gpt-3.5-turbo
-         */
-        GPT_3_5_TURBO("gpt-3.5-turbo"),
-        /**
-         * 临时模型,不建议使用,2023年9 月 13 日将被弃用
-         */
-        @Deprecated
-        GPT_3_5_TURBO_0301("gpt-3.5-turbo-0301"),
-        /**
-         * gpt-3.5-turbo-0613 支持函数
-         */
-        GPT_3_5_TURBO_1106("gpt-3.5-turbo-1106"),
-
-        GPT_3_5_TURBO_0613("gpt-3.5-turbo-0613"),
-        /**
-         * gpt-3.5-turbo-16k 超长上下文
-         */
-        GPT_3_5_TURBO_16K("gpt-3.5-turbo-16k"),
-        /**
-         * gpt-3.5-turbo-16k-0613 超长上下文 支持函数
-         */
-        GPT_3_5_TURBO_16K_0613("gpt-3.5-turbo-16k-0613"),
-        /**
-         * gpt-3.5-turbo-0125 超长上下文 支持函数
-         */
-        GPT_3_5_TURBO_0125("gpt-3.5-turbo-0125"),
-        /**
-         * GPT4.0
-         */
-        GPT_4("gpt-4"),
-        /**
-         * 临时模型,不建议使用,2023年9 月 13 日将被弃用
-         */
-        @Deprecated
-        GPT_4_0314("gpt-4-0314"),
-        /**
-         * GPT4.0 超长上下文
-         */
-        GPT_4_32K("gpt-4-32k"),
-        /**
-         * 临时模型,不建议使用,2023年9 月 13 日将被弃用
-         */
-        @Deprecated
-        GPT_4_32K_0314("gpt-4-32k-0314"),
-
-        /**
-         * gpt-4-0613,支持函数
-         */
-        GPT_4_0613("gpt-4-0613"),
-        /**
-         * gpt-4-0613,支持函数
-         */
-        GPT_4_32K_0613("gpt-4-32k-0613"),
-        /**
-         * 支持数组模式,支持function call,支持可重复输出
-         */
-        GPT_4_1106_PREVIEW("gpt-4-1106-preview"),
-        /**
-         * 支持图片
-         */
-        GPT_4_VISION_PREVIEW("gpt-4-vision-preview"),
-        /**
-         * gpt-4-0613,支持函数
-         */
-        GPT_4_0125_PREVIEW("gpt-4-0125-preview"),
-
-        /**
-         * GPT_4_ALL
-         */
-        GPT_4_ALL("gpt-4-all"),
-
-        GPT_4_GIZMO("gpt-4-gizmo"),
-
-        NET("net"),
-
-        CLAUDE_3_SONNET("claude-3-sonnet-20240229"),
-
-        GEMINI_PRO("gemini-pro"),
-
-        STABLE_DIFFUSION("stable-diffusion"),
-
-        SUNO_V3("suno-v3"),
-        ;
-        private final String name;
-    }
-
-    @Getter
-    @AllArgsConstructor
-    public enum ChatType {
-        /**
-         * 对话类型 - 输入
-         */
-        CHAT_IN("in"),
-        /**
-         * 对话类型 - 输出
-         */
-        CHAT_OUT("out"),
-
-        ;
-        private final String name;
-    }
-
-    public static double getModelCost(String modelName) {
-        if(modelName.startsWith("gpt-3.5")){
-            return OpenAIConst.GPT3_COST;
-        }else {
-            return OpenAIConst.GPT4_COST;
-        }
-    }
-}

+ 0 - 84
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/BaseMessage.java

@@ -1,84 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.unfbx.chatgpt.entity.chat.tool.ToolCalls;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.Getter;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @since 1.1.2
- * 2023-03-02
- */
-@Data
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@JsonIgnoreProperties(ignoreUnknown = true)
-@AllArgsConstructor
-public class BaseMessage implements Serializable {
-
-    /**
-     * 目前支持四个中角色参考官网,进行情景输入:
-     * https://platform.openai.com/docs/guides/chat/introduction
-     */
-    private String role;
-
-
-    private String name;
-
-    /**
-     * The tool calls generated by the model, such as function calls.
-     * @since 1.1.2
-     */
-    @JsonProperty("tool_calls")
-    private List<ToolCalls> toolCalls;
-
-    /**
-     * @since 1.1.2
-     */
-    @JsonProperty("tool_call_id")
-    private String toolCallId;
-
-    @Deprecated
-    @JsonProperty("function_call")
-    private FunctionCall functionCall;
-
-
-    /**
-     * 构造函数
-     *
-     * @param role         角色
-     * @param name         name
-     * @param functionCall functionCall
-     */
-    public BaseMessage(String role, String name, FunctionCall functionCall) {
-        this.role = role;
-        this.name = name;
-        this.functionCall = functionCall;
-    }
-
-    public BaseMessage() {
-    }
-
-
-    @Getter
-    @AllArgsConstructor
-    public enum Role {
-
-        SYSTEM("system"),
-        USER("user"),
-        ASSISTANT("assistant"),
-        FUNCTION("function"),
-        TOOL("tool"),
-        ;
-        private final String name;
-    }
-
-}

+ 0 - 34
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/ChatCompletion.java

@@ -1,34 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import lombok.*;
-import lombok.experimental.SuperBuilder;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 描述: chat模型参数
- *
- * @author https:www.unfbx.com
- * 2023-03-02
- */
-@Data
-@SuperBuilder
-@Slf4j
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@NoArgsConstructor
-@AllArgsConstructor
-public class ChatCompletion extends BaseChatCompletion implements Serializable {
-
-    /**
-     * 问题描述
-     */
-    @NonNull
-    private List<Message> messages;
-
-}

+ 0 - 30
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/ChatCompletionWithPicture.java

@@ -1,30 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import lombok.*;
-import lombok.experimental.SuperBuilder;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 描述: chat模型附带图片的参数
- *
- * @author https:www.unfbx.com
- * @since 1.1.2
- * 2023-11-10
- */
-@Data
-@SuperBuilder
-@Slf4j
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@NoArgsConstructor
-@AllArgsConstructor
-public class ChatCompletionWithPicture extends BaseChatCompletion implements Serializable {
-    /**
-     * 问题描述
-     */
-    private List<MessagePicture> messages;
-
-}

+ 0 - 43
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/Content.java

@@ -1,43 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.*;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 描述:
- *
- * @author https://www.unfbx.com
- * @since 1.1.2
- * 2023-11-10
- */
-@Data
-@Builder
-@Slf4j
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@NoArgsConstructor
-@AllArgsConstructor
-public class Content {
-    /**
-     * 输入类型:text、image_url
-     *
-     * @see Type
-     */
-    private String type;
-    private String text;
-    @JsonProperty("image_url")
-    private ImageUrl imageUrl;
-
-    /**
-     * 生成图片风格
-     */
-    @Getter
-    @AllArgsConstructor
-    public enum Type {
-        TEXT("text"),
-        IMAGE_URL("image_url"),
-        ;
-        private final String name;
-    }
-}

+ 0 - 27
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/FunctionCall.java

@@ -1,27 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * 描述:函数调用返回值
- *
- * @author https://www.unfbx.com
- * @since 2023-06-14
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class FunctionCall {
-    /**
-     * 方法名
-     */
-    private String name;
-    /**
-     * 方法参数
-     */
-    private String arguments;
-}

+ 0 - 46
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/Functions.java

@@ -1,46 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import lombok.Builder;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 描述:方法参数实体类,实例数据如下
- * <pre>
- *     {
- *          "name": "get_current_weather",
- *          "description": "Get the current weather in a given location",
- *          "parameters": {
- *              "type": "object",
- *              "properties": {
- *                  "location": {
- *                      "type": "string",
- *                      "description": "The city and state, e.g. San Francisco, CA"
- *                  },
- *                  "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
- *              },
- *              "required": ["location"]
- *          },
- *     }
- * </pre>
- * @author https:www.unfbx.com
- * @since  2023-06-14
- */
-@Data
-@Builder
-public class Functions implements Serializable {
-    /**
-     * 方法名称
-     */
-    private String name;
-    /**
-     * 方法描述
-     */
-    private String description;
-    /**
-     * 方法参数
-     * 扩展参数可以继承Parameters自己实现,json格式的数据
-     */
-    private Parameters parameters;
-}

+ 0 - 28
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/ImageUrl.java

@@ -1,28 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 描述:
- *
- * @author https://www.unfbx.com
- * 2023-11-10
- */
-@Data
-@Builder
-@Slf4j
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@NoArgsConstructor
-@AllArgsConstructor
-public class ImageUrl {
-    /**
-     * 图片地址,支持base64. eg: data:image/jpeg;base64,{base64_image}   <p\>
-     * https://platform.openai.com/docs/guides/vision
-     */
-    private String url;
-}

+ 0 - 117
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/Message.java

@@ -1,117 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.Getter;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @since 2023-03-02
- */
-@Data
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class Message implements Serializable {
-
-    /**
-     * 目前支持四个中角色参考官网,进行情景输入:
-     * https://platform.openai.com/docs/guides/chat/introduction
-     */
-    private String role;
-
-    private String content;
-
-    private String name;
-
-    @JsonProperty("function_call")
-    private FunctionCall functionCall;
-
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * 构造函数
-     *
-     * @param role         角色
-     * @param content      描述主题信息
-     * @param name         name
-     * @param functionCall functionCall
-     */
-    public Message(String role, String content, String name, FunctionCall functionCall) {
-        this.role = role;
-        this.content = content;
-        this.name = name;
-        this.functionCall = functionCall;
-    }
-
-    public Message() {
-    }
-
-    private Message(Builder builder) {
-        setRole(builder.role);
-        setContent(builder.content);
-        setName(builder.name);
-        setFunctionCall(builder.functionCall);
-    }
-
-
-    @Getter
-    @AllArgsConstructor
-    public enum Role {
-
-        SYSTEM("system"),
-        USER("user"),
-        ASSISTANT("assistant"),
-        FUNCTION("function"),
-        ;
-        private String name;
-    }
-
-    public static final class Builder {
-        private String role;
-        private String content;
-        private String name;
-        private FunctionCall functionCall;
-
-        public Builder() {
-        }
-
-        public Builder role(Role role) {
-            this.role = role.getName();
-            return this;
-        }
-
-        public Builder role(String role) {
-            this.role = role;
-            return this;
-        }
-
-        public Builder content(String content) {
-            this.content = content;
-            return this;
-        }
-
-        public Builder name(String name) {
-            this.name = name;
-            return this;
-        }
-
-        public Builder functionCall(FunctionCall functionCall) {
-            this.functionCall = functionCall;
-            return this;
-        }
-
-        public Message build() {
-            return new Message(this);
-        }
-    }
-}

+ 0 - 114
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/MessagePicture.java

@@ -1,114 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.unfbx.chatgpt.entity.chat.tool.ToolCalls;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- * @since 2023-03-02
- */
-@Data
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@JsonIgnoreProperties(ignoreUnknown = true)
-@AllArgsConstructor
-public class MessagePicture extends BaseMessage implements Serializable {
-    /**
-     * Content数组支持多图片输入
-     * https://platform.openai.com/docs/guides/vision
-     */
-    private List<Content> content;
-
-
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * 构造函数
-     *
-     * @param role         角色
-     * @param name         name
-     * @param content      content
-     * @param functionCall functionCall
-     */
-    public MessagePicture(String role, String name, List<Content> content, List<ToolCalls> toolCalls, String toolCallId, FunctionCall functionCall) {
-        this.content = content;
-        super.setRole(role);
-        super.setName(name);
-        super.setToolCalls(toolCalls);
-        super.setToolCallId(toolCallId);
-        super.setFunctionCall(functionCall);
-    }
-
-    public MessagePicture() {
-    }
-
-    private MessagePicture(Builder builder) {
-        setContent(builder.content);
-        super.setRole(builder.role);
-        super.setName(builder.name);
-        super.setFunctionCall(builder.functionCall);
-        super.setToolCalls(builder.toolCalls);
-        super.setToolCallId(builder.toolCallId);
-    }
-
-    public static final class Builder {
-        private String role;
-        private List<Content> content;
-        private String name;
-        private String toolCallId;
-        private List<ToolCalls> toolCalls;
-        private FunctionCall functionCall;
-
-        public Builder() {
-        }
-
-        public Builder role(Role role) {
-            this.role = role.getName();
-            return this;
-        }
-
-        public Builder role(String role) {
-            this.role = role;
-            return this;
-        }
-
-        public Builder content(List<Content> content) {
-            this.content = content;
-            return this;
-        }
-
-        public Builder name(String name) {
-            this.name = name;
-            return this;
-        }
-
-        public Builder functionCall(FunctionCall functionCall) {
-            this.functionCall = functionCall;
-            return this;
-        }
-
-        public Builder toolCalls(List<ToolCalls> toolCalls) {
-            this.toolCalls = toolCalls;
-            return this;
-        }
-
-        public Builder toolCallId(String toolCallId) {
-            this.toolCallId = toolCallId;
-            return this;
-        }
-
-        public MessagePicture build() {
-            return new MessagePicture(this);
-        }
-    }
-
-}

+ 0 - 42
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/Parameters.java

@@ -1,42 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import lombok.Builder;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-/**
- * 描述:方法参数类,扩展参数可以继承Parameters自己实现
- * 参考:
- * <pre>
- * {
- *     "type": "object",
- *     "properties": {
- *         "location": {
- *             "type": "string",
- *             "description": "The city and state, e.g. San Francisco, CA"
- *         },
- *         "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
- *     },
- *     "required": ["location"]
- * }
- * </pre>
- * @author https:www.unfbx.com
- * @since  2023-06-14
- */
-@Data
-@Builder
-public class Parameters implements Serializable {
-    /**
-     * 参数类型
-     */
-    private String type;
-    /**
-     * 参数属性、描述
-     */
-    private Object properties;
-    /**
-     * 方法必输字段
-     */
-    private List<String> required;
-}

+ 0 - 28
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/ResponseFormat.java

@@ -1,28 +0,0 @@
-package com.xmzs.common.chat.entity.chat;
-
-import lombok.*;
-
-/**
- * 指定模型必须输出的格式的对象。
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class ResponseFormat {
-    /**
-     * 默认:text
-     *
-     * @see Type
-     */
-    private String type;
-
-    @Getter
-    @AllArgsConstructor
-    public enum Type {
-        JSON_OBJECT("json_object"),
-        TEXT("text"),
-        ;
-        private final String name;
-    }
-}

+ 0 - 31
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolCallFunction.java

@@ -1,31 +0,0 @@
-package com.xmzs.common.chat.entity.chat.tool;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-
-/**
- * ToolCall 的 Function参数
- * The function that the model called.
- *
- * @author https:www.unfbx.com
- * @since 1.1.2
- * 2023-11-09
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class ToolCallFunction implements Serializable {
-    /**
-     * 方法名
-     */
-    private String name;
-    /**
-     * 方法参数
-     */
-    private String arguments;
-}

+ 0 - 38
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolCalls.java

@@ -1,38 +0,0 @@
-package com.unfbx.chatgpt.entity.chat.tool;
-
-import com.xmzs.common.chat.entity.chat.tool.ToolCallFunction;
-import lombok.*;
-
-import java.io.Serializable;
-
-/**
- * The tool calls generated by the model, such as function calls.
- *
- * @author <a href="https://www.unfbx.com">unfbx</a>
- * @since 1.1.2
- * 2023-11-09
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class ToolCalls implements Serializable {
-    /**
-     * The ID of the tool call.
-     */
-    private String id;
-    /**
-     * The type of the tool. Currently, only function is supported.
-     */
-    private String type;
-
-    private ToolCallFunction function;
-
-    @Getter
-    @AllArgsConstructor
-    public enum Type {
-        FUNCTION("function"),
-        ;
-        private final String name;
-    }
-}

+ 0 - 25
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolChoice.java

@@ -1,25 +0,0 @@
-package com.xmzs.common.chat.entity.chat.tool;
-
-import lombok.*;
-
-import java.io.Serializable;
-
-/**
- * choice和object同时存在是以object为准
- *
- * @author <a href="https://www.unfbx.com">unfbx</a>
- * @since 1.1.2
- * 2023-11-09
- */
-@Data
-public class ToolChoice implements Serializable {
-
-    @Getter
-    @AllArgsConstructor
-    public enum Choice {
-        NONE("none"),
-        AUTO("auto"),
-        ;
-        private final String name;
-    }
-}

+ 0 - 33
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolChoiceObj.java

@@ -1,33 +0,0 @@
-package com.xmzs.common.chat.entity.chat.tool;
-
-import lombok.*;
-
-/**
- * @author <a href="https://www.unfbx.com">unfbx</a>
- * @since 1.1.2
- * 2023-11-09
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class ToolChoiceObj {
-    /**
-     * 需要调用的方法名称
-     */
-    private ToolChoiceObjFunction function;
-    /**
-     * 工具的类型。目前仅支持函数。
-     *
-     * @see Type
-     */
-    private String type;
-
-    @Getter
-    @AllArgsConstructor
-    public enum Type {
-        FUNCTION("function"),
-        ;
-        private final String name;
-    }
-}

+ 0 - 21
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolChoiceObjFunction.java

@@ -1,21 +0,0 @@
-package com.xmzs.common.chat.entity.chat.tool;
-
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * @author <a href="https://www.unfbx.com">unfbx</a>
- * @since 1.1.2
- * 2023-11-09
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class ToolChoiceObjFunction {
-
-    private String name;
-}

+ 0 - 35
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/Tools.java

@@ -1,35 +0,0 @@
-package com.xmzs.common.chat.entity.chat.tool;
-
-
-import lombok.*;
-
-import java.io.Serializable;
-
-/**
- * @author <a href="https://www.unfbx.com">unfbx</a>
- * @since 1.1.2
- * 2023-11-09
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class Tools implements Serializable {
-
-    /**
-     * 目前只支持:function
-     *
-     * @see Type
-     */
-    private String type;
-
-    private ToolsFunction function;
-
-    @Getter
-    @AllArgsConstructor
-    public enum Type {
-        FUNCTION("function"),
-        ;
-        private final String name;
-    }
-}

+ 0 - 36
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/chat/tool/ToolsFunction.java

@@ -1,36 +0,0 @@
-package com.xmzs.common.chat.entity.chat.tool;
-
-
-import com.xmzs.common.chat.entity.chat.Parameters;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-
-/**
- * @author <a href="https://www.unfbx.com">unfbx</a>
- * @since 1.1.2
- * 2023-11-09
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class ToolsFunction implements Serializable {
-
-    /**
-     * 要调用的函数的名称。必须是 a-z、A-Z、0-9,或包含下划线和破折号,最大长度为 64
-     */
-    private String name;
-    /**
-     * 对函数功能的描述,模型使用它来选择何时以及如何调用该函数。
-     */
-    private String description;
-    /**
-     * 函数接受的参数,描述为 JSON Schema 对象
-     * 扩展参数可以继承Parameters自己实现,json格式的数据
-     */
-    private Parameters parameters;
-}

+ 0 - 23
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/common/Choice.java

@@ -1,23 +0,0 @@
-package com.xmzs.common.chat.entity.common;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- *  2023-02-15
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class Choice implements Serializable {
-    private String text;
-    private long index;
-    private Object logprobs;
-    @JsonProperty("finish_reason")
-    private String finishReason;
-}

+ 0 - 20
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/common/DeleteResponse.java

@@ -1,20 +0,0 @@
-package com.xmzs.common.chat.entity.common;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- *  2023-02-15
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class DeleteResponse implements Serializable {
-    private String id;
-    private String object;
-    private boolean deleted;
-}

+ 0 - 30
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/common/OpenAiResponse.java

@@ -1,30 +0,0 @@
-package com.xmzs.common.chat.entity.common;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-/**
- * 描述:
- *
- * @author https:www.unfbx.com
- *  2023-02-15
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class OpenAiResponse<T> implements Serializable {
-    private String object;
-    private List<T> data;
-    private Error error;
-
-
-    @Data
-    @JsonIgnoreProperties(ignoreUnknown = true)
-    public class Error {
-        private String message;
-        private String type;
-        private String param;
-        private String code;
-    }
-}

+ 0 - 126
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/entity/completions/Completion.java

@@ -1,126 +0,0 @@
-package com.xmzs.common.chat.entity.completions;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.*;
-import lombok.extern.slf4j.Slf4j;
-
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 描述: 问题类
- *
- * @author https:www.unfbx.com
- * 2023-02-11
- */
-@Data
-@Builder
-@Slf4j
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@NoArgsConstructor
-@AllArgsConstructor
-public class Completion implements Serializable {
-
-    @NonNull
-    @Builder.Default
-    private String model = Model.DAVINCI_003.getName();
-    /**
-     * 问题描述
-     */
-    @NonNull
-    private String prompt;
-    /**
-     * 完成输出后的后缀,用于格式化输出结果
-     */
-    private String suffix;
-
-    /**
-     * 最大支持4096
-     */
-    @JsonProperty("max_tokens")
-    @Builder.Default
-    private Integer maxTokens = 2048;
-    /**
-     * 使用什么取样温度,0到2之间。较高的值(如0.8)将使输出更加随机,而较低的值(如0.2)将使输出更加集中和确定。
-     * <p>
-     * We generally recommend altering this or but not both.top_p
-     */
-    @Builder.Default
-    private double temperature = 0;
-
-    /**
-     * 使用温度采样的替代方法称为核心采样,其中模型考虑具有top_p概率质量的令牌的结果。因此,0.1 意味着只考虑包含前 10% 概率质量的代币。
-     * <p>
-     * 我们通常建议更改此设置,但不要同时更改两者。temperature
-     */
-    @JsonProperty("top_p")
-    @Builder.Default
-    private Double topP = 1d;
-
-    /**
-     * 为每个提示生成的完成次数。
-     */
-    @Builder.Default
-    private Integer n = 1;
-
-    @Builder.Default
-    private boolean stream = false;
-    /**
-     * 最大值:5
-     */
-    private Integer logprobs;
-
-    @Builder.Default
-    private boolean echo = false;
-
-    private List<String> stop;
-
-    @JsonProperty("presence_penalty")
-    @Builder.Default
-    private double presencePenalty = 0;
-
-    /**
-     * -2.0 ~~ 2.0
-     */
-    @JsonProperty("frequency_penalty")
-    @Builder.Default
-    private double frequencyPenalty = 0;
-
-    @JsonProperty("best_of")
-    @Builder.Default
-    private Integer bestOf = 1;
-
-    @JsonProperty("logit_bias")
-    private Map logitBias;
-    /**
-     * 用户唯一值,确保接口不被重复调用
-     */
-    private String user;
-
-    /**
-     * 获取当前参数的tokens数
-     * @return  token数量
-     */
-//    public long tokens() {
-//        if (StrUtil.isBlank(this.prompt) || StrUtil.isBlank(this.model)) {
-//            log.warn("参数异常model:{},prompt:{}", this.model, this.prompt);
-//            return 0;
-//        }
-//        return TikTokensUtil.tokens(this.model, this.prompt);
-//    }
-
-    @Getter
-    @AllArgsConstructor
-    public enum Model {
-        DAVINCI_003("text-davinci-003"),
-        DAVINCI_002("text-davinci-002"),
-        DAVINCI("davinci"),
-        ;
-        private String name;
-    }
-}
-
-

Неке датотеке нису приказане због велике количине промена