sumor 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/.eslintignore +6 -0
  2. package/.eslintrc.yml +4 -0
  3. package/.gitattributes +1 -0
  4. package/.github/workflows/audit.yml +22 -0
  5. package/.github/workflows/available.yml +22 -0
  6. package/.github/workflows/ci.yml +45 -0
  7. package/.github/workflows/coverage.yml +23 -0
  8. package/.github/workflows/publish.yml +31 -0
  9. package/.github/workflows/ut.yml +24 -0
  10. package/.husky/pre-commit +10 -0
  11. package/.husky/pre-push +10 -0
  12. package/.prettierrc.yml +7 -0
  13. package/LICENSE +21 -0
  14. package/demo/api/error.js +3 -0
  15. package/demo/api/file.js +4 -0
  16. package/demo/api/file.yaml +11 -0
  17. package/demo/api/hello.js +4 -0
  18. package/demo/api/hello.yaml +13 -0
  19. package/demo/api/login.js +4 -0
  20. package/demo/api/logout.js +4 -0
  21. package/demo/api/long.js +9 -0
  22. package/demo/api/long.yaml +2 -0
  23. package/demo/api/user/admin.js +12 -0
  24. package/demo/api/user/info.js +8 -0
  25. package/demo/config/config.yaml +2 -0
  26. package/demo/i18n/demo.yaml +1 -0
  27. package/demo/package.json +6 -0
  28. package/i18n/README.md +32 -0
  29. package/i18n/sumor_api.yaml +16 -0
  30. package/i18n/sumor_app.yaml +3 -0
  31. package/i18n/sumor_internal.yaml +1 -0
  32. package/i18n/sumor_token.yaml +2 -0
  33. package/i18nExt/sumor_api.de.yaml +3 -0
  34. package/i18nExt/sumor_api.en.yaml +3 -0
  35. package/i18nExt/sumor_api.es.yaml +3 -0
  36. package/i18nExt/sumor_api.fr.yaml +3 -0
  37. package/i18nExt/sumor_api.it.yaml +3 -0
  38. package/i18nExt/sumor_api.ja.yaml +3 -0
  39. package/i18nExt/sumor_api.ko.yaml +3 -0
  40. package/i18nExt/sumor_api.pt.yaml +3 -0
  41. package/i18nExt/sumor_api.zh-TW.yaml +3 -0
  42. package/i18nExt/sumor_api.zh.yaml +3 -0
  43. package/i18nExt/sumor_app.de.yaml +3 -0
  44. package/i18nExt/sumor_app.en.yaml +3 -0
  45. package/i18nExt/sumor_app.es.yaml +3 -0
  46. package/i18nExt/sumor_app.zh-TW.yaml +3 -0
  47. package/i18nExt/sumor_app.zh.yaml +3 -0
  48. package/i18nExt/sumor_internal.de.yaml +1 -0
  49. package/i18nExt/sumor_internal.en.yaml +1 -0
  50. package/i18nExt/sumor_internal.es.yaml +1 -0
  51. package/i18nExt/sumor_internal.zh-TW.yaml +1 -0
  52. package/i18nExt/sumor_internal.zh.yaml +1 -0
  53. package/i18nExt/sumor_token.de.yaml +2 -0
  54. package/i18nExt/sumor_token.es.yaml +2 -0
  55. package/i18nExt/sumor_token.fr.yaml +2 -0
  56. package/i18nExt/sumor_token.it.yaml +2 -0
  57. package/i18nExt/sumor_token.ja.yaml +2 -0
  58. package/i18nExt/sumor_token.ko.yaml +2 -0
  59. package/i18nExt/sumor_token.pt.yaml +2 -0
  60. package/i18nExt/sumor_token.ru.yaml +2 -0
  61. package/i18nExt/sumor_token.tr.yaml +2 -0
  62. package/i18nExt/sumor_token.zh-TW.yaml +2 -0
  63. package/i18nExt/sumor_token.zh.yaml +2 -0
  64. package/jest.config.json +26 -0
  65. package/modules/alertPage/html/template.html +162 -0
  66. package/modules/alertPage/html/undraw_access-denied.svg +52 -0
  67. package/modules/alertPage/html/undraw_alert.svg +1 -0
  68. package/modules/alertPage/html/undraw_celebration.svg +78 -0
  69. package/modules/alertPage/html/undraw_complete-form.svg +1 -0
  70. package/modules/alertPage/html/undraw_login.svg +1 -0
  71. package/modules/alertPage/index.js +46 -0
  72. package/modules/alertPage/index.test.js +12 -0
  73. package/modules/i18n/README.md +90 -0
  74. package/modules/i18n/convertI18nValue/README.md +31 -0
  75. package/modules/i18n/convertI18nValue/getI18nTemplate.js +26 -0
  76. package/modules/i18n/convertI18nValue/getI18nTemplate.test.js +40 -0
  77. package/modules/i18n/convertI18nValue/index.js +14 -0
  78. package/modules/i18n/convertI18nValue/index.test.js +55 -0
  79. package/modules/i18n/convertI18nValue/stringVariableReplace.js +13 -0
  80. package/modules/i18n/convertI18nValue/stringVariableReplace.test.js +39 -0
  81. package/modules/i18n/index.js +26 -0
  82. package/modules/i18n/index.test.js +13 -0
  83. package/modules/i18n/load/README.md +28 -0
  84. package/modules/i18n/load/load.js +31 -0
  85. package/modules/i18n/load/load.test.js +30 -0
  86. package/modules/i18n/registry.js +48 -0
  87. package/modules/i18n/registry.test.js +84 -0
  88. package/modules/logger/convert/parseFile.js +14 -0
  89. package/modules/logger/convert/parseFile.test.js +28 -0
  90. package/modules/logger/convert/stringifyCMD.js +48 -0
  91. package/modules/logger/convert/stringifyCMD.test.js +37 -0
  92. package/modules/logger/convert/stringifyFile.js +24 -0
  93. package/modules/logger/convert/stringifyFile.test.js +79 -0
  94. package/modules/logger/index.js +82 -0
  95. package/modules/logger/index.test.js +124 -0
  96. package/modules/logger/logFileOperator.js +50 -0
  97. package/modules/logger/logFileOperator.test.js +69 -0
  98. package/modules/middlewares/apiMiddleware/errorCatcher.js +9 -0
  99. package/modules/middlewares/apiMiddleware/exposeApis/index.js +82 -0
  100. package/modules/middlewares/apiMiddleware/index.js +111 -0
  101. package/modules/middlewares/apiMiddleware/index.test.js +145 -0
  102. package/modules/middlewares/apiMiddleware/load/index.js +35 -0
  103. package/modules/middlewares/apiMiddleware/load/index.test.js +30 -0
  104. package/modules/middlewares/apiMiddleware/metadataToSwagger.js +139 -0
  105. package/modules/middlewares/apiMiddleware/prepareData/format/caseSensitive.js +26 -0
  106. package/modules/middlewares/apiMiddleware/prepareData/format/caseSensitive.test.js +36 -0
  107. package/modules/middlewares/apiMiddleware/prepareData/format/convertType.js +48 -0
  108. package/modules/middlewares/apiMiddleware/prepareData/format/convertType.test.js +53 -0
  109. package/modules/middlewares/apiMiddleware/prepareData/format/defaultValue.js +31 -0
  110. package/modules/middlewares/apiMiddleware/prepareData/format/defaultValue.test.js +31 -0
  111. package/modules/middlewares/apiMiddleware/prepareData/format/index.js +18 -0
  112. package/modules/middlewares/apiMiddleware/prepareData/format/index.test.js +40 -0
  113. package/modules/middlewares/apiMiddleware/prepareData/format/precision.js +12 -0
  114. package/modules/middlewares/apiMiddleware/prepareData/format/precision.test.js +33 -0
  115. package/modules/middlewares/apiMiddleware/prepareData/format/trim.js +15 -0
  116. package/modules/middlewares/apiMiddleware/prepareData/format/trim.test.js +24 -0
  117. package/modules/middlewares/apiMiddleware/prepareData/index.js +29 -0
  118. package/modules/middlewares/apiMiddleware/prepareData/index.test.js +121 -0
  119. package/modules/middlewares/apiMiddleware/prepareData/validate/checkLength.js +26 -0
  120. package/modules/middlewares/apiMiddleware/prepareData/validate/checkLength.test.js +52 -0
  121. package/modules/middlewares/apiMiddleware/prepareData/validate/index.js +30 -0
  122. package/modules/middlewares/apiMiddleware/public/favicon.ico +0 -0
  123. package/modules/middlewares/apiMiddleware/response/sendError.js +57 -0
  124. package/modules/middlewares/apiMiddleware/response/sendError.test.js +251 -0
  125. package/modules/middlewares/apiMiddleware/response/sendNotFound.js +26 -0
  126. package/modules/middlewares/apiMiddleware/response/sendResponse.js +25 -0
  127. package/modules/middlewares/apiMiddleware/response/sendSuccess.js +30 -0
  128. package/modules/middlewares/bodyMiddleware/cleanupFiles.js +14 -0
  129. package/modules/middlewares/bodyMiddleware/cleanupFiles.test.js +54 -0
  130. package/modules/middlewares/bodyMiddleware/fileParser.js +69 -0
  131. package/modules/middlewares/bodyMiddleware/fileParser.test.js +163 -0
  132. package/modules/middlewares/bodyMiddleware/index.js +12 -0
  133. package/modules/middlewares/bodyMiddleware/index.test.js +64 -0
  134. package/modules/middlewares/bodyMiddleware/mergeData.js +4 -0
  135. package/modules/middlewares/bodyMiddleware/mergeData.test.js +38 -0
  136. package/modules/middlewares/i18nMiddleware/index.js +82 -0
  137. package/modules/middlewares/i18nMiddleware/index.test.js +75 -0
  138. package/modules/middlewares/tokenMiddleware/Token.js +115 -0
  139. package/modules/middlewares/tokenMiddleware/Token.test.js +67 -0
  140. package/modules/middlewares/tokenMiddleware/index.js +32 -0
  141. package/modules/middlewares/tokenMiddleware/index.test.js +115 -0
  142. package/modules/middlewares/tokenMiddleware/parseCookie.js +24 -0
  143. package/modules/middlewares/tokenMiddleware/parseCookie.test.js +49 -0
  144. package/modules/serve/formatConfig.js +7 -0
  145. package/modules/serve/formatConfig.test.js +28 -0
  146. package/modules/serve/index.js +30 -0
  147. package/modules/serve/index.test.js +69 -0
  148. package/modules/serve/listenApp.js +11 -0
  149. package/modules/system/getSystemLanguage.js +9 -0
  150. package/modules/system/getSystemLanguage.test.js +19 -0
  151. package/modules/utils/getError.js +56 -0
  152. package/modules/utils/getError.test.js +97 -0
  153. package/modules/utils/loadConfig.js +73 -0
  154. package/modules/utils/loadConfig.test.js +129 -0
  155. package/modules/utils/pathUtils.js +43 -0
  156. package/modules/utils/pathUtils.test.js +52 -0
  157. package/modules/utils/type.js +14 -0
  158. package/modules/utils/type.test.js +40 -0
  159. package/package.json +61 -1
  160. package/src/app.js +40 -0
  161. package/src/cli.js +28 -0
  162. package/src/index.js +3 -0
  163. package/test-utils/codeTest/README.md +4 -0
  164. package/test-utils/codeTest/custom.css +47 -0
  165. package/test-utils/codeTest/index.js +80 -0
  166. package/test-utils/codeTest/utils/calculateCoverage.js +55 -0
  167. package/test-utils/codeTest/utils/getTestFiles.js +20 -0
  168. package/test-utils/codeTest/utils/runTests.js +38 -0
  169. package/test-utils/codeTest/utils/startServer.js +23 -0
  170. package/test-utils/tmp.js +15 -0
  171. package/cli.js +0 -3
  172. package/index.es.js +0 -578
  173. package/template/web/AppWithFrame.vue +0 -20
  174. package/template/web/index.html +0 -19
  175. package/template/web/src/App.vue +0 -15
  176. package/template/web/src/entry-client.js +0 -9
  177. package/template/web/src/entry-server.js +0 -69
  178. package/template/web/src/main.js +0 -41
  179. package/template/web/src/style.scss +0 -389
@@ -0,0 +1,162 @@
1
+ <!doctype html>
2
+ <html lang="zh">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
6
+ <title>PLACEHOLDER-TITLE</title>
7
+ <style>
8
+ * {
9
+ box-sizing: border-box;
10
+ transition: all 0.3s;
11
+ }
12
+ body {
13
+ display: flex;
14
+ flex-direction: column;
15
+ align-items: center;
16
+
17
+ font-family: Arial, sans-serif;
18
+ padding: 50px 0;
19
+ margin: 0;
20
+ }
21
+ h1 {
22
+ color: #e2583e;
23
+ user-select: none;
24
+ // PLACEHOLDER-STYLE-COLOR
25
+ }
26
+ p {
27
+ white-space: pre-wrap;
28
+ word-wrap: break-word;
29
+ padding: 0 10px;
30
+ max-width: 600px;
31
+ width: 100%;
32
+ text-align: center;
33
+ }
34
+ a {
35
+ color: #1a73e8;
36
+ text-decoration: none;
37
+ cursor: pointer;
38
+ }
39
+ a:hover {
40
+ text-decoration: none;
41
+ }
42
+ .image{
43
+ display: flex;
44
+ justify-content: center;
45
+ align-items: center;
46
+ width: 100%;
47
+ max-width: 400px;
48
+ height: 300px;
49
+ overflow: hidden;
50
+ background: rgba(0,0,0,0.05);
51
+ border-radius: 4px;
52
+ margin-top: 50px;
53
+ user-select: none;
54
+ }
55
+ img {
56
+ width: 300px;
57
+ height: 250px;
58
+ }
59
+ .more {
60
+ padding-top: 50px;
61
+ }
62
+ .more-box {
63
+ display: none;
64
+ margin-top: 50px;
65
+ background: rgba(0,0,0,0.05);
66
+ border-radius: 4px;
67
+ padding: 10px;
68
+ overflow: auto;
69
+ width: 80%;
70
+ min-width: 400px;
71
+ max-width: 600px;
72
+ min-height: 300px;
73
+ max-height: 400px;
74
+ white-space: pre-wrap;
75
+ word-wrap: break-word;
76
+ cursor: zoom-in;
77
+ }
78
+
79
+ .more-box-fullscreen {
80
+ width: 100vw;
81
+ height: 100vh;
82
+ position: fixed;
83
+ z-index: 1000;
84
+ background: #f9f9f9;
85
+ left: 0;
86
+ top: 0;
87
+ margin: 0;
88
+ max-width: inherit;
89
+ max-height: inherit;
90
+ cursor: zoom-out;
91
+ }
92
+
93
+ @media (prefers-color-scheme: dark) {
94
+ body {
95
+ background-color: #1e1e1e;
96
+ color: #f9f9f9;
97
+ }
98
+ h1 {
99
+ color: #ff6f61;
100
+ // PLACEHOLDER-STYLE-COLOR
101
+ }
102
+ a {
103
+ color: #8ab4f8;
104
+ }
105
+ .image {
106
+ background: rgba(255, 255, 255, 0.3);
107
+ }
108
+ .more-box {
109
+ background: rgba(255, 255, 255, 0.1);
110
+ }
111
+ .more-box-fullscreen {
112
+ background: #1e1e1e;
113
+ }
114
+ }
115
+ @media screen and (max-width: 400px) {
116
+ p {
117
+ width: 100%;
118
+ }
119
+ .image{
120
+ border-radius: 0;
121
+ margin: 0;
122
+ background: transparent;
123
+ }
124
+ .more-box {
125
+ width: calc(100% - 20px);
126
+ height: fit-content;
127
+ min-height: inherit;
128
+ max-height: inherit;
129
+ max-width: inherit;
130
+ min-width: inherit;
131
+ }
132
+ }
133
+ </style>
134
+ </head>
135
+ <body>
136
+ <h1>PLACEHOLDER-MAJOR</h1>
137
+ PLACEHOLDER-MINOR
138
+ <div class="image"><img src="PLACEHOLDER-SVG" alt="Alert Image" /></div>
139
+ <a class="more">PLACEHOLDER-MORE-BUTTON</a>
140
+ <pre class="more-box">PLACEHOLDER-MORE-CONTENT</pre>
141
+ <script>
142
+ var more = document.querySelector('.more')
143
+ var moreBox = document.querySelector('.more-box')
144
+ function clickButton() {
145
+ more.style.display = 'none'
146
+ moreBox.style.display = 'block'
147
+ }
148
+ more.addEventListener('click', function () {
149
+ clickButton()
150
+ })
151
+
152
+ moreBox.addEventListener('click', function () {
153
+ if (moreBox.classList.contains('more-box-fullscreen')) {
154
+ moreBox.classList.remove('more-box-fullscreen')
155
+ } else {
156
+ moreBox.classList.add('more-box-fullscreen')
157
+ }
158
+ })
159
+ </script>
160
+ <!--PLACEHOLDER-SCRIPT-->
161
+ </body>
162
+ </html>
@@ -0,0 +1,52 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="742.417" height="712.723" viewBox="0 0 742.417 712.723" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" artist="Katerina Limpitsouni" source="https://undraw.co/">
2
+ <g id="Group_9" data-name="Group 9" transform="translate(-589 -184)">
3
+ <path id="Path_274-517" data-name="Path 274" d="M449.813,328.006s11.621,38.349,8.135,43,37.187-25.566,37.187-25.566-15.107-10.459-9.3-25.566Z" transform="translate(251.695 108.565)" fill="#9f616a"/>
4
+ <path id="Path_968-518" data-name="Path 968" d="M853.606,262.605h-3.9V155.628a61.915,61.915,0,0,0-61.915-61.915H561.141a61.915,61.915,0,0,0-61.916,61.915V742.511a61.915,61.915,0,0,0,61.915,61.915H787.788A61.915,61.915,0,0,0,849.7,742.511V338.753h3.9Z" transform="translate(360.209 90.287)" fill="#090814"/>
5
+ <path id="Path_969-519" data-name="Path 969" d="M837.006,151.481V746.656a46.958,46.958,0,0,1-46.935,46.952H558.764a46.967,46.967,0,0,1-46.973-46.959V151.482a46.965,46.965,0,0,1,46.971-46.951H586.82a22.329,22.329,0,0,0,20.656,30.74H739.344A22.329,22.329,0,0,0,760,104.53h30.055a46.957,46.957,0,0,1,46.951,46.934Z" transform="translate(360.209 90.287)" fill="#fff"/>
6
+ <circle id="Ellipse_18" data-name="Ellipse 18" cx="96.565" cy="96.565" r="96.565" transform="translate(938 287.564)" fill="#6c63ff"/>
7
+ <path id="Path_39-520" data-name="Path 39" d="M779.672,494.309H574.135a3.81,3.81,0,0,1-3.806-3.806V439.52a3.811,3.811,0,0,1,3.806-3.806H779.672a3.811,3.811,0,0,1,3.806,3.806V490.5a3.811,3.811,0,0,1-3.806,3.806ZM574.135,437.235a2.286,2.286,0,0,0-2.284,2.284V490.5a2.286,2.286,0,0,0,2.284,2.284H779.672a2.286,2.286,0,0,0,2.284-2.284V439.519a2.286,2.286,0,0,0-2.284-2.284Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
8
+ <path id="Path_40-521" data-name="Path 40" d="M637.7,454.074a2.665,2.665,0,0,0,0,5.329H763.3a2.665,2.665,0,0,0,.2-5.326l-.117,0H637.7Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
9
+ <path id="Path_41-522" data-name="Path 41" d="M637.7,470.058a2.664,2.664,0,1,0,0,5.329H763.3a2.665,2.665,0,0,0,.2-5.326l-.117,0H637.7Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
10
+ <path id="Path_42-523" data-name="Path 42" d="M779.672,579.289H574.135a3.81,3.81,0,0,1-3.806-3.806V524.5a3.811,3.811,0,0,1,3.806-3.806H779.672a3.811,3.811,0,0,1,3.806,3.806v50.985a3.811,3.811,0,0,1-3.806,3.8ZM574.135,522.216a2.286,2.286,0,0,0-2.284,2.284v50.985a2.286,2.286,0,0,0,2.284,2.284H779.672a2.286,2.286,0,0,0,2.284-2.284V524.5a2.286,2.286,0,0,0-2.284-2.284Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
11
+ <path id="Path_43-524" data-name="Path 43" d="M637.7,539.33a2.664,2.664,0,0,0,0,5.329H763.3a2.665,2.665,0,1,0,.087-5.329H637.7Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
12
+ <path id="Path_44-525" data-name="Path 44" d="M637.7,555.318a2.664,2.664,0,0,0,0,5.329H763.3a2.665,2.665,0,1,0,.087-5.329H637.7Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
13
+ <path id="Path_39-2-526" data-name="Path 39-2" d="M779.672,664.547H574.135a3.81,3.81,0,0,1-3.806-3.806V609.758a3.811,3.811,0,0,1,3.806-3.806H779.672a3.811,3.811,0,0,1,3.806,3.806v50.985a3.811,3.811,0,0,1-3.806,3.806ZM574.135,607.474a2.286,2.286,0,0,0-2.284,2.284v50.985a2.286,2.286,0,0,0,2.284,2.284H779.672a2.286,2.286,0,0,0,2.284-2.284V609.758a2.286,2.286,0,0,0-2.284-2.284Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
14
+ <path id="Path_40-2-527" data-name="Path 40-2" d="M637.7,624.591a2.664,2.664,0,0,0,0,5.329H763.3a2.665,2.665,0,0,0,.2-5.326l-.117,0H637.7Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
15
+ <path id="Path_41-2-528" data-name="Path 41-2" d="M637.7,640.578a2.664,2.664,0,0,0,0,5.329H763.3a2.665,2.665,0,0,0,.2-5.326l-.117,0H637.7Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
16
+ <path id="Path_970-529" data-name="Path 970" d="M969.27,806.286H230.729c-1.071,0-1.938-.468-1.938-1.045s.868-1.045,1.938-1.045H969.271c1.07,0,1.938.468,1.938,1.045S970.341,806.286,969.27,806.286Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
17
+ <g id="Group_58" data-name="Group 58" transform="translate(589 184)">
18
+ <path id="Path_438-530" data-name="Path 438" d="M937.992,765.521a19.474,19.474,0,0,1-18.806-3.313c-6.587-5.528-8.652-14.636-10.332-23.07l-4.97-24.945,10.405,7.165c7.483,5.152,15.134,10.47,20.316,17.933s7.443,17.651,3.28,25.726" transform="translate(-228.791 -93.713)" fill="#e6e6e6"/>
19
+ <path id="Path_439-531" data-name="Path 439" d="M936.385,797.458c1.31-9.542,2.657-19.206,1.738-28.849-.816-8.565-3.429-16.93-8.749-23.789a39.574,39.574,0,0,0-10.153-9.2c-1.015-.641-1.95.968-.939,1.606a37.622,37.622,0,0,1,14.881,17.956c3.24,8.241,3.76,17.224,3.2,25.977-.338,5.294-1.053,10.553-1.774,15.8a.964.964,0,0,0,.65,1.144.936.936,0,0,0,1.144-.65Z" transform="translate(-228.791 -93.713)" fill="#f2f2f2"/>
20
+ <path id="Path_442-532" data-name="Path 442" d="M926.958,782.148a14.336,14.336,0,0,1-12.491,6.447c-6.323-.3-11.595-4.713-16.34-8.9l-14.035-12.4,9.289-.444c6.68-.32,13.533-.618,19.9,1.442s12.231,7.018,13.394,13.6" transform="translate(-228.791 -93.713)" fill="#e6e6e6"/>
21
+ <path id="Path_443-533" data-name="Path 443" d="M940.086,802.943c-6.3-11.156-13.618-23.555-26.685-27.518a29.779,29.779,0,0,0-11.224-1.159c-1.192.1-.894,1.94.3,1.837a27.665,27.665,0,0,1,17.912,4.739c5.051,3.438,8.983,8.217,12.311,13.286,2.039,3.1,3.865,6.341,5.691,9.573C938.971,804.733,940.677,803.988,940.086,802.943Z" transform="translate(-228.791 -93.713)" fill="#f2f2f2"/>
22
+ </g>
23
+ <g id="Group_59" data-name="Group 59" transform="translate(589 184)">
24
+ <circle id="Ellipse_5" data-name="Ellipse 5" cx="15.986" cy="15.986" r="15.986" transform="translate(355 354.999)" fill="#6c63ff"/>
25
+ <path id="Path_40-3-534" data-name="Path 40-3" d="M592.124,461.712c-.184,0-.333,1.193-.333,2.664s.149,2.665.333,2.665h15.719c.184.024.336-1.149.339-2.62a5.944,5.944,0,0,0-.328-2.708h-15.73Z" transform="translate(-228.791 -93.713)" fill="#e6e6e6"/>
26
+ </g>
27
+ <g id="Group_60" data-name="Group 60" transform="translate(589 184)">
28
+ <circle id="Ellipse_5-2" data-name="Ellipse 5-2" cx="15.986" cy="15.986" r="15.986" transform="translate(355 440.292)" fill="#6c63ff"/>
29
+ <path id="Path_40-4-535" data-name="Path 40-4" d="M592.124,547.005c-.184,0-.333,1.193-.333,2.664s.149,2.665.333,2.665h15.719c.184.024.336-1.149.339-2.62a5.944,5.944,0,0,0-.328-2.708h-15.73Z" transform="translate(-228.791 -93.713)" fill="#e6e6e6"/>
30
+ </g>
31
+ <g id="Group_61" data-name="Group 61" transform="translate(589 184)">
32
+ <circle id="Ellipse_5-3" data-name="Ellipse 5-3" cx="15.986" cy="15.986" r="15.986" transform="translate(355 525.55)" fill="#6c63ff"/>
33
+ <path id="Path_40-5-536" data-name="Path 40-5" d="M592.124,632.263c-.184,0-.333,1.193-.333,2.664s.149,2.665.333,2.665h15.719c.184.024.336-1.149.339-2.62a5.941,5.941,0,0,0-.328-2.708h-15.73Z" transform="translate(-228.791 -93.713)" fill="#e6e6e6"/>
34
+ </g>
35
+ <rect id="Rectangle_117" data-name="Rectangle 117" width="8" height="67" transform="translate(1008.051 363.268) rotate(-45)" fill="#fff"/>
36
+ <rect id="Rectangle_118" data-name="Rectangle 118" width="8" height="67" transform="translate(1055.426 357.616) rotate(45)" fill="#fff"/>
37
+ <path id="Path_254-537" data-name="Path 254" d="M319.051,549.848a10.056,10.056,0,0,0,5.388-14.447L348,508.537,329.608,506l-19.558,25.9a10.11,10.11,0,0,0,9,17.95Z" transform="translate(360.209 90.287)" fill="#9f616a"/>
38
+ <path id="Path_255-538" data-name="Path 255" d="M118.679,694.215H102.244L94.425,630.82h24.257Z" transform="translate(589 184)" fill="#9f616a"/>
39
+ <path id="Path_257-539" data-name="Path 257" d="M204.713,680.461l-15.7,4.873L162.751,627.11l23.166-7.192Z" transform="translate(589 184)" fill="#9f616a"/>
40
+ <path id="Path_973-540" data-name="Path 973" d="M334.884,495.656l-24.341,27.877,19.056,1.715Z" transform="translate(360.209 90.287)" fill="#e6e6e6"/>
41
+ <path id="Path_975-541" data-name="Path 975" d="M325.373,531.589s-8.455,4.227-9.512,23.251,3.171,68.7,3.171,68.7-4.227,22.194,0,42.274-4.227,93,1.057,93,32.762,3.171,33.819,0,2.114-50.729,2.114-50.729,8.455-24.308,0-39.1c0,0,29.521,51.548,48.615,90.889,4.179,8.61,35.933-1.057,30.649-10.569s-17.966-52.843-17.966-52.843-9.512-31.706-26.421-45.445l8.455-67.639s17.967-45.445,7.4-51.786S325.373,531.589,325.373,531.589Z" transform="translate(360.209 90.287)" fill="#090814"/>
42
+ <circle id="Ellipse_182" data-name="Ellipse 182" cx="27.478" cy="27.478" r="27.478" transform="translate(689.809 396.765)" fill="#9f616a"/>
43
+ <path id="Path_976-542" data-name="Path 976" d="M387.727,361.434l-34.16,20.08s-13.08,7.366-17.966,20.08c-5.208,13.55-2.181,32.628,0,36.99,4.227,8.455-1.773,29.592-1.773,29.592l-5.284,48.615s-19.023,17.966-4.227,20.08,41.217-1.057,57.07,0,33.819,3.171,28.535-7.4-11.625-17.967-5.284-39.1c4.962-16.54,4.747-78.383,4.419-104.5A21.025,21.025,0,0,0,398.846,368.1Z" transform="translate(360.209 90.287)" fill="#e5e5e5"/>
44
+ <path id="Path_980-543" data-name="Path 980" d="M372.407,394.727l3.17,64.468-30.726,62.223-5.211-1.983,31.706-58.127Z" transform="translate(360.209 90.287)" opacity="0.1" style="isolation: isolate"/>
45
+ <path id="Path_982-544" data-name="Path 982" d="M407.279,472.932v-7.4L371.35,524.718Z" transform="translate(360.209 90.287)" opacity="0.1" style="isolation: isolate"/>
46
+ <path id="Path_983-545" data-name="Path 983" d="M337.576,306.387l-4.539-1.816s9.5-10.457,22.713-9.548l-3.717-4.092s9.085-3.637,17.345,5.91c4.342,5.019,9.365,10.919,12.5,17.564h4.865l-2.03,4.471,7.106,4.471-7.294-.8a24.74,24.74,0,0,1-.69,11.579l.2,3.534s-8.459-13.089-8.459-14.9V327.3s-4.543-4.092-4.543-6.82l-2.478,3.183-1.239-5-15.28,5,2.476-4.094-9.5,1.364,3.717-5s-10.737,5.91-11.15,10.912-5.781,11.366-5.781,11.366l-2.478-4.547S325.6,313.207,337.576,306.387Z" transform="translate(360.209 92.401)" fill="#090814"/>
47
+ <path id="Path_259-546" data-name="Path 259" d="M355.354,552.839a10.056,10.056,0,0,0,2.738-15.174l18.423-30.62-18.554.768-14.65,28.96a10.11,10.11,0,0,0,12.043,16.067Z" transform="translate(360.209 90.287)" fill="#9f616a"/>
48
+ <path id="Path_981-547" data-name="Path 981" d="M397.24,375.175l7.926-1.585s23.779,17.438,16.381,52.314-40.16,87.719-40.16,87.719-7.4,9.512-9.512,11.625-6.341,0-4.227,3.171-3.171,5.284-3.171,5.284-23.251,0-21.137-8.455,38.047-68.7,38.047-68.7L376.1,400.535S371.874,373.061,397.24,375.175Z" transform="translate(360.209 90.287)" fill="#e5e5e5"/>
49
+ <path id="Path_277-548" data-name="Path 277" d="M514.368,783.067s-10.829-7.941-10.829-3.61-12.273,21.658-12.273,21.658-20.214,14.439-3.61,14.439,23.824-2.888,23.824-2.888l17.327-11.551s4.332-5.054,2.888-10.829-6.5-13.717-6.5-13.717S519.422,784.511,514.368,783.067Z" transform="translate(267.08 81.168)" fill="#090814"/>
50
+ <path id="Path_278-549" data-name="Path 278" d="M409.446,787.859s-1.494-7.471-6.723-3.735S383.3,799.065,383.3,799.065s-26.147,5.976-9.712,13.447,53.787-2.988,53.787-2.988,1.494-23.906,0-23.159S410.193,789.353,409.446,787.859Z" transform="translate(280.5 81.521)" fill="#090814"/>
51
+ </g>
52
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="930.67538" height="521.87593" viewBox="0 0 930.67538 521.87593" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" artist="Katerina Limpitsouni" source="https://undraw.co/"><path id="a08a2523-9d19-4e0c-87cb-6ce1a7fd2fc4-413" data-name="Path 133" d="M213.37258,618.97624a158.39338,158.39338,0,0,0,28.72768,33.86154c.254.23174.515.45361.77586.68127l23.73866-14.10511c-.1756-.23879-.36947-.50634-.57728-.79926-12.39459-17.25583-68.37231-132.05609-68.71437-157.47835C197.28,483.24064,177.17769,562.25219,213.37258,618.97624Z" transform="translate(-134.66231 -189.06204)" fill="#e6e6e6"/><path id="a62b1d0a-4504-46a8-81c8-bbc6043ad63f-414" data-name="Path 134" d="M237.51988,655.55937c.36662.16483.741.3251,1.118.478l17.80937-10.582c-.278-.16053-.60252-.3504-.97444-.56327-6.09666-3.56147-24.23716-14.2625-42.09847-25.91685-19.19136-12.52636-38.071-26.1452-41.34715-33.18782C172.70895,587.40853,193.83961,636.659,237.51988,655.55937Z" transform="translate(-134.66231 -189.06204)" fill="#e6e6e6"/><path id="fd401fbc-93ba-42a5-a9a4-5a6900171ed6-415" data-name="Path 133" d="M989.86254,665.2559a158.39406,158.39406,0,0,1-7.4,43.785c-.1.329-.211.653-.319.982h-27.613c.029-.295.059-.624.088-.982,1.841-21.166-8.677-148.453-21.369-170.483C934.36152,540.3449,992.00352,598.00187,989.86254,665.2559Z" transform="translate(-134.66231 -189.06204)" fill="#e6e6e6"/><path id="eaa08601-a63b-4214-86e2-4a8f8e2c7e12-416" data-name="Path 134" d="M987.79049,709.04088c-.231.329-.471.658-.717.982h-20.716c.157-.28.339-.609.55-.982,3.422-6.176,13.551-24.642,22.953-43.785,10.1-20.572,19.374-41.924,18.593-49.652C1008.69548,617.34587,1015.68746,670.4799,987.79049,709.04088Z" transform="translate(-134.66231 -189.06204)" fill="#e6e6e6"/><path d="M582.73018,709.255H263.402a28.57994,28.57994,0,0,1-28.54766-28.54766V217.6097A28.57994,28.57994,0,0,1,263.402,189.062H582.73018a28.57994,28.57994,0,0,1,28.54766,28.54766V680.70738A28.57994,28.57994,0,0,1,582.73018,709.255Z" transform="translate(-134.66231 -189.06204)" fill="#cacaca"/><path d="M583.29225,691.041H262.83992a8.8102,8.8102,0,0,1-8.80013-8.80013V216.07621a8.8102,8.8102,0,0,1,8.80013-8.80013H583.29225a8.81019,8.81019,0,0,1,8.80013,8.80013V682.24087A8.81019,8.81019,0,0,1,583.29225,691.041Z" transform="translate(-134.66231 -189.06204)" fill="#fff"/><circle cx="287.18951" cy="8.74274" r="2.42854" fill="#fff"/><path d="M1064.147,710.938H135.853a1.19068,1.19068,0,1,1,0-2.38136h928.294a1.19068,1.19068,0,1,1,0,2.38136Z" transform="translate(-134.66231 -189.06204)" fill="#cacaca"/><circle cx="288.40115" cy="355.3465" r="31" fill="#e4e4e4"/><path d="M442.47166,484.90854H403.65538L380.22154,370.27817a43.05942,43.05942,0,1,1,85.69153-.05078Z" transform="translate(-134.66231 -189.06204)" fill="#e4e4e4"/><path d="M575.5801,330.82838H717.454a30.15959,30.15959,0,0,1,29.42119,23.52657l71.68609,317.96779a24.3755,24.3755,0,0,1-22.57916,29.70689L650.1348,709.21552a32.20254,32.20254,0,0,1-33.27305-26.43158L576.197,457.97716l-7.692-42.52344-11.35095-62.75164a18.56906,18.56906,0,0,1,18.426-21.8737Z" transform="translate(-134.66231 -189.06204)" fill="#3f3d56"/><path d="M698.77657,337.68294h16.561a20.84257,20.84257,0,0,1,20.36353,16.39964l68.80881,315.37356a12.91479,12.91479,0,0,1-11.77337,15.64015l-145.37556,9.52782A16.72593,16.72593,0,0,1,629.80607,680.899l-58.715-325.96934a14.64977,14.64977,0,0,1,14.41777-17.24675h15.71067a6.91389,6.91389,0,0,1,6.67617,5.11645h0a6.10376,6.10376,0,0,0,5.89388,4.51694h74.58408a10.43362,10.43362,0,0,0,10.40289-9.6334Z" transform="translate(-134.66231 -189.06204)" fill="#fff"/><path d="M772.14887,438.77577a10.52534,10.52534,0,0,1,1.31643,1.00712l48.05635-12.25059L824.8,415.93891l18.14315,2.66086L839.134,439.6876a8,8,0,0,1-7.03474,6.53394L775.988,452.13061a10.49709,10.49709,0,1,1-3.83908-13.35484Z" transform="translate(-134.66231 -189.06204)" fill="#ffb6b6"/><circle cx="603.19202" cy="262.1948" r="31" fill="#6c63ff"/><path d="M757.26253,391.75684H718.44625L695.01241,277.12647a43.05942,43.05942,0,1,1,85.69153-.05078Z" transform="translate(-134.66231 -189.06204)" fill="#6c63ff"/><polygon points="711.524 240.061 699.144 250.741 681.824 265.671 674.174 226.531 673.374 222.461 672.744 219.231 690.294 188.661 704.924 189.501 705.924 189.561 705.944 189.781 706.174 191.831 709.174 218.811 709.244 219.461 711.524 240.061" fill="#3f3d56"/><polygon points="630.606 507.736 618.346 507.735 612.513 460.447 630.608 460.448 630.606 507.736" fill="#ffb6b6"/><path d="M768.39448,708.6817l-39.53076-.00146v-.5A15.38731,15.38731,0,0,1,744.2502,692.794h.001l24.144.001Z" transform="translate(-134.66231 -189.06204)" fill="#2f2e41"/><polygon points="758.606 508.736 746.346 508.735 740.513 461.447 758.608 461.448 758.606 508.736" fill="#ffb6b6"/><path d="M896.39448,709.6817l-39.53076-.00146v-.5A15.38731,15.38731,0,0,1,872.2502,693.794h.001l24.144.001Z" transform="translate(-134.66231 -189.06204)" fill="#2f2e41"/><path d="M903.06648,676.9734l-33,5-48.00977-162.48-50.99023,163.48-37-5,48-190v-15l6.5-22.5-.68018-6.09-4.73-42.59-2.04981-18.47-.13285-1.19313a4.05551,4.05551,0,0,1,3.19291-4.41685h0l15.39991-3.24H824.7364l14.8501,4.09,1.02.28.46.13-.23,1.92-3.48,29.18-.18994,1.6-3.3601,28.13-.74,6.17c29,21,30,42,30,42Z" transform="translate(-134.66231 -189.06204)" fill="#2f2e41"/><circle cx="674.44747" cy="148.19876" r="24.56103" fill="#ffb6b6"/><rect x="786.56648" y="443.4734" width="49" height="7" transform="matrix(0.99156, -0.12967, 0.12967, 0.99156, -185.77459, -80.11503)" fill="#3f3d56"/><path d="M721.14887,448.77577a10.52534,10.52534,0,0,1,1.31643,1.00712l48.05635-12.25059L773.8,425.93891l18.14315,2.66086L788.134,449.6876a8,8,0,0,1-7.03474,6.53394L724.988,462.13061a10.49709,10.49709,0,1,1-3.83908-13.35484Z" transform="translate(-134.66231 -189.06204)" fill="#ffb6b6"/><path d="M795.06648,383.9734l-8.5-6.5c-2.29817-.87172-5.44731,1.605-6,4l-12,49,25,18,3.5-5.5Z" transform="translate(-134.66231 -189.06204)" fill="#3f3d56"/><g opacity="0.2"><path d="M843.8365,407.87336a67.67557,67.67557,0,0,1-6.48,2.2c-.69995.21-1.41992.41-2.12988.6a66.019,66.019,0,0,1-14.34033,2.32,45.1399,45.1399,0,0,1-6.25977-.17,35.24271,35.24271,0,0,1-6.58984-1.3c-.07031-.02-.15039-.04-.22021-.06a28.90621,28.90621,0,0,1-11.9502-6.79,23.55972,23.55972,0,0,1-2.10986-2.35,21.23879,21.23879,0,0,1-4.56006-16.53,14.15326,14.15326,0,0,1,.34033-1.57,25.10719,25.10719,0,0,1,1.48975-4.1c.27-.62.57031-1.23.89013-1.82995l11.29981-3.82h21.52l14.8501,4.09,1,.06.02.22.46.13-.23,1.92Z" transform="translate(-134.66231 -189.06204)"/></g><path d="M790.2894,316.92681c-4.59329-.563-9.634-.16485-13.21411,2.76738s-4.73558,9.02781-1.34592,12.17829c3.00083,2.7891,7.69329,2.13322,11.71262,2.92632a15.85418,15.85418,0,0,1,12.38363,15.15657c-.05982,10.17413-9.82411,17.87894-11.578,27.90093-1.197,6.83982,1.68772,14.03819,6.675,18.86966s11.84323,7.44255,18.7509,8.1498,13.8926-.373,20.60575-2.14766c6.74127-1.78215,13.3778-4.31055,19.03424-8.388s10.2931-9.82559,12.10928-16.55777.51227-14.45089-4.16774-19.61986c-5.35905-5.919-14.27436-7.95446-18.90989-14.45565-5.19639-7.28778-3.27352-17.66625-7.4792-25.56731-2.80792-5.27513-8.12457-8.87314-13.79191-10.76857s-11.719-2.26953-17.69212-2.4531c-3.13956-.09649-6.37527-.12863-9.30035,1.016s-5.49633,3.75316-5.648,6.89055S790.2894,316.92681,790.2894,316.92681Z" transform="translate(-134.66231 -189.06204)" fill="#2f2e41"/></svg>
@@ -0,0 +1,78 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="837.86522" height="658.41774" viewBox="0 0 837.86522 658.41774"
2
+ xmlns:xlink="http://www.w3.org/1999/xlink" role="img" artist="Katerina Limpitsouni" source="https://undraw.co/">
3
+ <path d="M434.682,374.66791c-4.48375-5.80964-10.82036-11.18521-11.22166-18.35426-.36785-6.57533,4.535-13.10364,2.46735-19.39427-1.59-4.83678-6.8351-7.75525-11.9605-9.30074a46.48536,46.48536,0,0,0-29.873,1.15007l.51886-.3659c-5.83446-2.07832-12.6544.06721-17.24475,4.04111-4.59087,3.97384-7.31895,9.48206-9.43568,15.0019-2.11725,5.51985-3.75745,11.24158-6.69871,16.41649-2.9418,5.17492-7.4454,9.88107-13.38751,11.66953,1.98924,3.968,8.20776,5.32925,11.85495,2.595a14.99561,14.99561,0,0,0,2.49452-2.57884q3.64849-4.43668,7.29752-8.87338c2.50288,4.45149-1.23628,10.59542,1.84032,14.71654,1.58637,2.12522,4.48375,2.93232,7.17473,3.51121a129.78134,129.78134,0,0,0,63.4915-2.355c1.659-.48889,3.48939-1.16216,4.17755-2.66375C436.97225,378.15012,435.86085,376.19563,434.682,374.66791Z"
4
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
5
+ <path d="M494.31719,397.34035a11.2646,11.2646,0,0,0-.25608,1.75514l-45.96973,26.51976-11.1736-6.43244-11.9117,15.59412,18.674,13.3097a8.561,8.561,0,0,0,10.27124-.25024L501.354,410.44007a11.23318,11.23318,0,1,0-7.03684-13.09972Z"
6
+ transform="translate(-181.06739 -120.79113)" fill="#ffb7b7"/>
7
+ <path d="M446.55456,426.87131l-14.8573,19.25575a4.81559,4.81559,0,0,1-7.281.3988l-16.81947-17.4657a13.37376,13.37376,0,0,1,16.40139-21.12864l21.09528,11.79573a4.81558,4.81558,0,0,1,1.46113,7.14406Z"
8
+ transform="translate(-181.06739 -120.79113)" fill="#6c63ff"/>
9
+ <polygon points="245.04 641.589 258.159 641.588 264.4 590.984 245.037 590.985 245.04 641.589" fill="#ffb7b7"/>
10
+ <path d="M422.76046,758.09672l25.83708-.001h.00105A16.46631,16.46631,0,0,1,465.064,774.56082v.53506l-42.30276.00157Z"
11
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
12
+ <polygon points="155.149 641.589 168.269 641.588 174.51 590.984 155.147 590.985 155.149 641.589" fill="#ffb7b7"/>
13
+ <path d="M332.87016,758.09672l25.83709-.001h.001a16.46631,16.46631,0,0,1,16.46542,16.46515v.53506l-42.30276.00157Z"
14
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
15
+ <circle cx="395.69003" cy="365.04012" r="22.67358" transform="translate(-191.4143 597.74424) rotate(-83.73558)"
16
+ fill="#ffb7b7"/>
17
+ <path d="M408.95668,399.03041l13.35756,6.61734s14.92447,25.93654,6.36349,50.54935c-4.15646,11.94983,7.5481,50.04217,7.5481,50.04217s18.13484,172.54332,18.19209,225.79585c-22.52982,3.464-43.93228,7.74446-45.0024-2.95677S396.6313,591.84907,396.6313,591.84907,380.52221,732.28872,367.68074,734.429s-38.52441-1.07012-38.52441-1.07012,20.38958-205.71712,34.30117-218.55859l2.14024-10.70123-.05724-96.05743,16.02786-7.64887Z"
18
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
19
+ <path d="M361.17262,544.85631a11.496,11.496,0,0,0,3.52191-17.27232L380.2292,424.03692l-20.29571-.97433L347.82384,526.18108a11.55829,11.55829,0,0,0,13.34878,18.67523Z"
20
+ transform="translate(-181.06739 -120.79113)" fill="#ffb7b7"/>
21
+ <path d="M379.78818,449.98193l-24.27292-1.53244a4.81556,4.81556,0,0,1-4.40623-5.81012l5.05764-23.71425a13.37376,13.37376,0,0,1,26.68923,1.76352l2.03424,24.08344a4.81559,4.81559,0,0,1-5.102,5.20985Z"
22
+ transform="translate(-181.06739 -120.79113)" fill="#6c63ff"/>
23
+ <path d="M419.45369,350.30133c-.88358-4.008-3.75326-7.32874-7.05925-9.76075a28.91116,28.91116,0,0,0-36.95894,2.24749,18.88671,18.88671,0,0,0-5.708,9.14869,11.22147,11.22147,0,0,0,2.39158,10.21763l.453.28373c-.41071-1.74215.94262-3.483,2.5593-4.25156a20.45,20.45,0,0,1,5.22051-1.17051,19.19262,19.19262,0,0,0,13.0092-9.17991,21.67461,21.67461,0,0,0,12.42136,12.9448c2.99666,1.17189,11.22741,2.78334,14.08037,1.29553C423.50219,360.17874,420.33728,354.30939,419.45369,350.30133Z"
24
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
25
+ <path id="a7292837-b693-4341-9d08-f79d69c00516-514" data-name="Path 438"
26
+ d="M252.62151,731.121a24.21457,24.21457,0,0,0,23.38268-4.11877c8.18977-6.87441,10.758-18.196,12.84671-28.68191l6.17973-31.01657-12.9377,8.90837c-9.30465,6.40641-18.81827,13.01866-25.26011,22.29785s-9.25223,21.94707-4.07792,31.988"
27
+ transform="translate(-181.06739 -120.79113)" fill="#e6e6e6"/>
28
+ <path id="bbe87a9d-22ff-4c97-8b47-e161a95b9ece-515" data-name="Path 439"
29
+ d="M254.61922,770.83157c-1.62839-11.86368-3.30382-23.88078-2.15885-35.87167,1.01467-10.64932,4.26374-21.0488,10.87832-29.57938a49.20624,49.20624,0,0,1,12.62465-11.44039c1.26216-.79647,2.4241,1.20354,1.16733,1.997a46.77947,46.77947,0,0,0-18.50445,22.32562c-4.02858,10.24607-4.67545,21.41582-3.98154,32.3003.41944,6.58218,1.31074,13.1212,2.20588,19.65251a1.19817,1.19817,0,0,1-.808,1.42251,1.16349,1.16349,0,0,1-1.42254-.808Z"
30
+ transform="translate(-181.06739 -120.79113)" fill="#f2f2f2"/>
31
+ <path id="ed3d176e-02dd-4f6a-96fc-dfdec80464da-516" data-name="Path 442"
32
+ d="M266.34024,751.79512a17.82514,17.82514,0,0,0,15.53142,8.01862c7.8644-.37318,14.41806-5.85973,20.31713-11.07027l17.452-15.4088-11.54987-.5528c-8.3062-.39784-16.82672-.771-24.73814,1.79338s-15.20757,8.72638-16.654,16.9154"
33
+ transform="translate(-181.06739 -120.79113)" fill="#e6e6e6"/>
34
+ <path id="ae799342-61c9-47cf-bc03-dd36b89c58fd-517" data-name="Path 443"
35
+ d="M250.01623,777.65126c7.83972-13.87142,16.93235-29.28794,33.18081-34.21552a37.02581,37.02581,0,0,1,13.95544-1.441c1.4819.128,1.1118,2.41174-.367,2.28453a34.39833,34.39833,0,0,0-22.27164,5.89215c-6.27994,4.27454-11.16975,10.21756-15.30782,16.51907-2.5351,3.86051-4.80576,7.88445-7.07641,11.903C251.40406,779.878,249.28223,778.95043,250.01623,777.65126Z"
36
+ transform="translate(-181.06739 -120.79113)" fill="#f2f2f2"/>
37
+ <path d="M779.77819,521.20381c-14.71126-19.68714-41.63634-24.43848-55.016-14.4405s-16.45311,37.16578-1.74185,56.85293c13.61709,18.22289,38.28787,23.19272,51.87646,16.36551a1.70649,1.70649,0,0,0-.008.64695l.76611,3.78748a1.72814,1.72814,0,0,0,2.75776,1.0192l6.48745-5.06824a1.7282,1.7282,0,0,0-.3215-2.92254l-3.48972-1.65969a1.71065,1.71065,0,0,0-.384-.12059C791.17906,564.591,793.42489,539.46631,779.77819,521.20381Z"
38
+ transform="translate(-181.06739 -120.79113)" fill="#ccc"/>
39
+ <path d="M747.5991,513.77089a28.43178,28.43178,0,0,1,23.81222,31.08457c-.15814,1.65975,2.43513,1.6489,2.59221,0a31.0881,31.0881,0,0,0-25.71532-33.58418C746.6565,510.99391,745.95531,513.49146,747.5991,513.77089Z"
40
+ transform="translate(-181.06739 -120.79113)" fill="#fff"/>
41
+ <path d="M803.75721,180.89617c12.86165-20.94237,7.33248-47.71853-6.90025-56.45949s-40.61475-1.56289-53.4764,19.37948c-11.905,19.38475-7.41153,44.14672,3.95179,54.25293a1.70639,1.70639,0,0,0-.60414.23154l-3.23673,2.11082a1.72815,1.72815,0,0,0,.07142,2.9392l7.106,4.15683a1.7282,1.7282,0,0,0,2.59716-1.37818l.25343-3.856a1.71054,1.71054,0,0,0-.02976-.40138C767.64859,207.51564,791.82629,200.32307,803.75721,180.89617Z"
42
+ transform="translate(-181.06739 -120.79113)" fill="#ccc"/>
43
+ <path d="M798.77948,148.24706a28.43177,28.43177,0,0,1-20.09183,33.60938c-1.6008.46606-.63292,2.872.95742,2.40893a31.08812,31.08812,0,0,0,21.71181-36.30114C801.012,146.34545,798.432,146.61629,798.77948,148.24706Z"
44
+ transform="translate(-181.06739 -120.79113)" fill="#fff"/>
45
+ <path d="M575.82414,280.2624c-1.07548-24.553-20.65376-43.63767-37.34031-42.90675S503.96269,258.81,505.03817,283.363c.99549,22.72682,18.58763,40.723,33.66183,42.7303a1.70628,1.70628,0,0,0-.37079.53021l-1.499,3.56158a1.72815,1.72815,0,0,0,1.70547,2.39487l8.215-.53663a1.7282,1.7282,0,0,0,1.37957-2.59642l-1.94985-3.33629a1.711,1.711,0,0,0-.24947-.31583C560.82141,322.53942,576.8218,303.03861,575.82414,280.2624Z"
46
+ transform="translate(-181.06739 -120.79113)" fill="#6c63ff"/>
47
+ <path d="M553.41313,256.0036a28.43178,28.43178,0,0,1,2.18095,39.09624c-1.06507,1.28273,1.08433,2.73368,2.14242,1.45932a31.0881,31.0881,0,0,0-2.34664-42.2335C554.19743,253.17783,552.21188,254.84727,553.41313,256.0036Z"
48
+ transform="translate(-181.06739 -120.79113)" fill="#fff"/>
49
+ <path d="M652.33451,443.14446a40.78437,40.78437,0,0,1-31.9-18.89576c-.96575-1.54387-2.22647-3.24048-1.55793-5.14081a3.37989,3.37989,0,0,1,3.50209-2.339c1.97113.23991,3.24314,2.16819,3.486,4.01584.27545,2.09589-1.20316,3.74123-3.02866,4.52-4.461,1.90287-8.96171-1.03789-12.59546-3.38487-8.27977-5.34782-17.38675-10.18417-27.41958-10.79362-9.28262-.56383-19.23682,3.07583-24.4,11.12566-.90331,1.40833,1.33949,2.70972,2.23831,1.30834,5.12059-7.98343,15.4722-10.85073,24.47281-9.6168a47.5761,47.5761,0,0,1,15.31321,5.199c2.4739,1.28388,4.87325,2.70708,7.2241,4.20318a46.09864,46.09864,0,0,0,7.08548,4.06183c4.1316,1.69718,9.601,1.5646,12.487-2.34292,2.69239-3.64546.61163-9.71453-3.89154-10.7394a6.08493,6.08493,0,0,0-7.128,7.239c.44931,2.14673,2.0658,4.24753,3.31706,6.0022a43.37946,43.37946,0,0,0,32.79526,18.17034c1.66744.08248,1.66309-2.50994,0-2.59222Z"
50
+ transform="translate(-181.06739 -120.79113)" fill="#ccc"/>
51
+ <path d="M901.28453,264.54682c7.097-3.30155,15.81045-4.38389,23.03182-1.316s12.14453,10.93153,9.80947,17.89083c-1.05868,3.15524-3.46989,6.25835-2.5305,9.445.72306,2.45284,3.24546,4.07226,5.72259,5.22372s5.18694,2.11951,6.97841,4.06155,2.1651,5.28532-.07285,6.79138c-.73732.49619-1.65886.7315-2.37376,1.25437a3.772,3.772,0,0,0-1.16432,4.2222,8.89321,8.89321,0,0,0,2.85084,3.75065c2.54053,2.19094,5.89807,4.6985,5.10926,7.80873a5.47836,5.47836,0,0,1-3.697,3.45789,18.36751,18.36751,0,0,1-5.42687.71626L864.5554,330.215a28.4224,28.4224,0,0,1-7.40166-.41344,8.7618,8.7618,0,0,1-5.81294-3.905c-1.4356-2.65728-.49311-5.93057,1.2798-8.41186s4.282-4.43863,6.35524-6.71709,3.76948-5.12271,3.404-8.06748c-.29255-2.35732-1.84718-4.3947-2.9632-6.5366s-1.76428-4.81847-.31887-6.78893c2.03679-2.77665,6.92687-2.52551,9.24285-5.11284,1.74777-1.95255,1.41026-4.76345,1.584-7.28134.418-6.05656,4.61118-11.77645,10.58027-14.43257a20.83057,20.83057,0,0,1,18.95323,1.2908Z"
52
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
53
+ <polygon points="811.513 443.477 811.513 455.737 764.225 461.57 764.226 443.475 811.513 443.477" fill="#9e616a"/>
54
+ <path d="M1004.46466,561.14195l-.00147,39.53076h-.5A15.3873,15.3873,0,0,1,988.577,585.28624v-.001l.001-24.144Z"
55
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
56
+ <polygon points="753.056 464.332 750.046 476.216 702.773 470.262 707.216 452.722 753.056 464.332" fill="#9e616a"/>
57
+ <path d="M946.41118,585.00928l-9.70511,38.32091-.4847-.12274a15.38729,15.38729,0,0,1-11.13852-18.69259l.00024-.00094,5.92763-23.40509Z"
58
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
59
+ <path d="M922.05028,447.63717l2.553,2.66s16.66164,13.06488,4.33455,47.48l-20.16457,58.09,67.58839,2.63549-1.44837,26.54451s-98.0174,5.45217-97.16-10.70137,4.47388-75.96494,4.47388-75.96494l-20.364-16.35371,4.91-27.66Z"
60
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
61
+ <path d="M869.69322,473.99938l-7.83,8.02781-26.2525,72.1651s-4,18,5,22,66.9096,26.37548,66.9096,26.37548l5.91323-21.28278-44.62032-26.78167,20.79749-27.311,3.12992-43.04511Z"
62
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
63
+ <path d="M870.1107,346.69229l66.63531-13.324,1.44808,36.55891-17.26082,36.79,3.67,43.58L864.883,460.73111l1.87031-57.3039s-16.03772-22.62506-6.59015-45.43Z"
64
+ transform="translate(-181.06739 -120.79113)" fill="#e4e4e4"/>
65
+ <path d="M1018.69688,259.96661a10.74263,10.74263,0,0,1-10.09187,13.01927l-63.89979,74.09734-14.85634-18.02989,67.48291-67.16584a10.80091,10.80091,0,0,1,21.36509-1.92088Z"
66
+ transform="translate(-181.06739 -120.79113)" fill="#9e616a"/>
67
+ <path d="M958.618,338.998a4.81171,4.81171,0,0,1-1.59192,3.68145l-17.96772,16.17487a13.37737,13.37737,0,0,1-20.675-16.981l12.542-20.75959a4.81686,4.81686,0,0,1,7.19077-1.22225l18.7543,15.49575A4.81147,4.81147,0,0,1,958.618,338.998Z"
68
+ transform="translate(-181.06739 -120.79113)" fill="#e4e4e4"/>
69
+ <path d="M765.62579,434.10027a10.74268,10.74268,0,0,1,11.93116-11.3576l74.29461-63.6703,11.98277,20.05494L787.03723,435.407a10.80091,10.80091,0,0,1-21.41144-1.30669Z"
70
+ transform="translate(-181.06739 -120.79113)" fill="#9e616a"/>
71
+ <path d="M836.8831,364.97845a4.81166,4.81166,0,0,1,2.1263-3.40091l20.19132-13.2957a13.37737,13.37737,0,0,1,17.89292,19.89105L861.5787,386.81554a4.81689,4.81689,0,0,1-7.29277.12944L838.0691,368.81059A4.81141,4.81141,0,0,1,836.8831,364.97845Z"
72
+ transform="translate(-181.06739 -120.79113)" fill="#e4e4e4"/>
73
+ <circle cx="717.44336" cy="184.2819" r="24.56103" fill="#9e616a"/>
74
+ <path d="M923.63744,301.58116c-7.75643-.62285-14.19624-8.37141-13.38973-16.11089A13.00908,13.00908,0,0,1,899.1065,298.716c-3.55788.392-7.4584-.68443-10.55525,1.11048-3.43,1.988-4.52757,6.81578-8.10091,8.53283-3.45254,1.659-7.8377-.60362-9.54345-4.03331s-1.28713-7.5502-.15669-11.21005a31.65248,31.65248,0,0,1,52.68951-12.97513c3.26142,3.28048,5.851,7.46146,6.271,12.06821s-1.717,9.60534-5.85415,11.67485Z"
75
+ transform="translate(-181.06739 -120.79113)" fill="#2f2e41"/>
76
+ <path d="M563.06739,776.69229h-381a1,1,0,1,1,0-2h381a1,1,0,1,1,0,2Z" transform="translate(-181.06739 -120.79113)"
77
+ fill="#cacaca"/>
78
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800.283" height="459.452" viewBox="0 0 800.283 459.452" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" artist="Katerina Limpitsouni" source="https://undraw.co/"><g transform="translate(-560.001 -310)"><g transform="translate(595.918 441.564)"><path d="M456.278,312.134h0a12.465,12.465,0,0,0-5.2-3.049L436.759,293.47l-7.552,7.24,15.349,15.064a12.238,12.238,0,0,0,3.26,5.033c3.674,3.511,8.544,4.415,10.88,2.017s1.263-7.179-2.4-10.684h-.014Z" transform="translate(-327.646 -170.988)" fill="#9f616a"/><path d="M515.059,270.541l-7.607,9.563-39.318-29.762-.034-.068L445.124,207.4a14.706,14.706,0,1,1,26.7-12.2l14.908,39.019,28.329,36.309Z" transform="translate(-392.397 -136.424)" fill="#d6d6e3"/><path d="M516.754,164.58h16.029v25.429L515.11,184.2Z" transform="translate(-458.837 -129.638)" fill="#9f616a"/><path d="M527.619,140.7a17.6,17.6,0,1,1-17.6-17.6A17.6,17.6,0,0,1,527.619,140.7Z" transform="translate(-438.256 -116.33)" fill="#9f616a"/><path d="M506.612,148.761l-1.718,3.26-7.58-14.405c-4.564-13.978,11.376-22.005,11.376-22.005,5.2-6.126,15.655,1.039,15.655,1.039,15.078-3.348,7.8,9.359,7.8,9.359S527,126.124,527,130.28s-5.6,3.871-5.6,3.871l-4.388,7.682-2.425-2.948C505.573,135.068,506.612,148.761,506.612,148.761Z" transform="translate(-447.31 -113.133)" fill="#2f2e43"/><rect width="14.222" height="20.178" transform="translate(51.423 295.497)" fill="#9f616a"/><path d="M517.326,585.018c-6.242,0-15.356-.652-15.424-.659-2.438.217-14.609,1.175-15.214-1.61a11.96,11.96,0,0,1,.38-5.6c1.175-11.634,1.61-11.77,1.868-11.845.414-.122,1.623.455,3.586,1.718l.122.081.027.143c.034.177.9,4.449,5.026,3.8,2.825-.448,3.742-1.073,4.034-1.379a1.738,1.738,0,0,1-.747-.625,2.185,2.185,0,0,1-.156-1.82,28.807,28.807,0,0,1,2.187-4.91l.183-.326,16.164,10.908,9.984,2.853a2.555,2.555,0,0,1,1.664,1.474h0a2.575,2.575,0,0,1-.652,2.907c-1.813,1.63-5.42,4.422-9.2,4.768-1.005.1-2.336.129-3.831.129h0Z" transform="translate(-437.832 -257.131)" fill="#2f2e43"/><rect width="14.222" height="20.178" transform="matrix(-0.771, -0.637, 0.637, -0.771, 19.411, 289.863)" fill="#9f616a"/><path d="M590.468,550.994c-4.809-3.98-11.417-10.29-11.465-10.337-2.017-1.379-12.008-8.4-10.7-10.935a11.851,11.851,0,0,1,3.865-4.075c8.32-8.225,8.734-8.048,8.986-7.94.4.17.964,1.379,1.671,3.606l.041.136-.068.129c-.1.163-2.146,4.014,1.447,6.133,2.465,1.453,3.566,1.555,3.987,1.508a1.733,1.733,0,0,1-.177-.964,2.19,2.19,0,0,1,1.039-1.5,28.9,28.9,0,0,1,4.815-2.391l.346-.136,5.5,18.7,5.875,8.564a2.577,2.577,0,0,1,.34,2.2h0a2.583,2.583,0,0,1-2.357,1.827c-2.431.1-6.989-.048-10.12-2.187-.829-.571-1.875-1.392-3.029-2.343h0Z" transform="translate(-568.188 -242.919)" fill="#2f2e43"/><path d="M541.479,319.1,519.8,480.358H503.54L492.7,319.1h48.786Z" transform="translate(-452.32 -179.211)" fill="#2f2e43"/><path d="M525.077,407.183,492.7,449.19l13.855,11.444,55.564-52.847,4.965-88.688-9.936,8.884Z" transform="translate(-477.918 -179.211)" fill="#2f2e43"/><path d="M535.992,177.582l9.936,94.861H497.143l-3.783-30.787a88.842,88.842,0,0,1,11.057-54.905L511.9,173.67l24.091,3.912h0Z" transform="translate(-456.763 -132.554)" fill="#d6d6e3"/><path d="M519.414,346.939h0a12.427,12.427,0,0,0-3.464-4.931L509.4,321.85l-9.882,3.457,7.709,20.07a12.168,12.168,0,0,0,.876,5.936c1.881,4.714,5.943,7.559,9.06,6.35s4.123-6.011,2.241-10.724Z" transform="translate(-435.811 -180.093)" fill="#9f616a"/><path d="M542.08,297.425l-10.887,5.542-23.425-43.393V259.5l-3.117-48.541a14.707,14.707,0,1,1,29.354,0l-2.628,41.681,10.7,44.792h0Z" transform="translate(-461.01 -139.496)" fill="#d6d6e3"/></g><path d="M656.482,526.506H144.27c-4.774,0-8.644-3.443-8.649-7.686v-345c.006-4.243,3.875-7.681,8.649-7.686H656.482c4.775,0,8.644,3.443,8.649,7.686v345C665.125,523.063,661.256,526.5,656.482,526.506ZM144.27,167.84c-3.713,0-6.723,2.678-6.727,5.978v345c0,3.3,3.014,5.974,6.727,5.978H656.482c3.713,0,6.723-2.678,6.727-5.978v-345c0-3.3-3.014-5.974-6.727-5.978Z" transform="translate(695.152 143.868)" fill="#e6e6e6"/><path d="M608.538,260.221H196.27a8.659,8.659,0,0,1-8.649-8.649V221.781a8.659,8.659,0,0,1,8.649-8.649H608.538a8.659,8.659,0,0,1,8.649,8.649v29.791a8.659,8.659,0,0,1-8.649,8.649ZM196.27,215.054a6.735,6.735,0,0,0-6.727,6.727v29.791a6.735,6.735,0,0,0,6.727,6.727H608.538a6.735,6.735,0,0,0,6.727-6.727V221.781a6.735,6.735,0,0,0-6.727-6.727Z" transform="translate(693.289 129.81)" fill="#3f3d56"/><path d="M359.64,343.221H196.27a8.659,8.659,0,0,1-8.649-8.649V304.781a8.659,8.659,0,0,1,8.649-8.649H359.64a8.659,8.659,0,0,1,8.649,8.649v29.791A8.659,8.659,0,0,1,359.64,343.221ZM196.27,298.054a6.735,6.735,0,0,0-6.727,6.727v29.791a6.735,6.735,0,0,0,6.727,6.727H359.64a6.735,6.735,0,0,0,6.727-6.727V304.781a6.735,6.735,0,0,0-6.727-6.727Z" transform="translate(693.289 138.798)" fill="#3f3d56"/><path d="M618.64,343.221H455.27a8.659,8.659,0,0,1-8.649-8.649V304.781a8.659,8.659,0,0,1,8.649-8.649H618.64a8.659,8.659,0,0,1,8.649,8.649v29.791a8.659,8.659,0,0,1-8.649,8.649ZM455.27,298.054a6.735,6.735,0,0,0-6.727,6.727v29.791a6.734,6.734,0,0,0,6.727,6.727H618.64a6.735,6.735,0,0,0,6.727-6.727V304.781a6.735,6.735,0,0,0-6.727-6.727Z" transform="translate(683.188 138.798)" fill="#3f3d56"/><path d="M621.343,540.04H511.789a8.178,8.178,0,0,1-8.168-8.169V521.3a8.178,8.178,0,0,1,8.168-8.168H621.343a8.178,8.178,0,0,1,8.168,8.168v10.571A8.178,8.178,0,0,1,621.343,540.04Z" transform="translate(528.053 97.513)" fill="#e6e6e6"/><path d="M215.309,396.508A7.688,7.688,0,1,1,223,388.82a7.688,7.688,0,0,1-7.688,7.688Zm0-13.454a5.766,5.766,0,1,0,5.766,5.766A5.766,5.766,0,0,0,215.309,383.054Z" transform="translate(692.508 135.482)" fill="#e6e6e6"/><path d="M215.309,422.508A7.688,7.688,0,1,1,223,414.82a7.688,7.688,0,0,1-7.688,7.688Zm0-13.454a5.766,5.766,0,1,0,5.766,5.766A5.766,5.766,0,0,0,215.309,409.054Z" transform="translate(692.508 134.469)" fill="#e6e6e6"/><path d="M215.309,448.508A7.688,7.688,0,1,1,223,440.82a7.688,7.688,0,0,1-7.688,7.688Zm0-13.454a5.766,5.766,0,1,0,5.766,5.766,5.766,5.766,0,0,0-5.766-5.766Z" transform="translate(692.508 133.454)" fill="#6c63ff"/><path d="M254.367,382.632a6.246,6.246,0,0,0,0,12.493H343.74a6.246,6.246,0,0,0,0-12.493Z" transform="translate(690.25 135.424)" fill="#e6e6e6"/><path d="M254.367,408.632a6.247,6.247,0,0,0,0,12.493H343.74a6.246,6.246,0,0,0,0-12.493Z" transform="translate(690.25 134.41)" fill="#e6e6e6"/><path d="M254.367,434.632a6.247,6.247,0,0,0,0,12.493H343.74a6.246,6.246,0,0,0,0-12.493Z" transform="translate(690.25 133.527)" fill="#e6e6e6"/><path d="M474.809,396.508a7.688,7.688,0,1,1,7.688-7.688A7.688,7.688,0,0,1,474.809,396.508Zm0-13.454a5.766,5.766,0,1,0,5.766,5.766,5.766,5.766,0,0,0-5.766-5.766Z" transform="translate(682.387 135.482)" fill="#e6e6e6"/><path d="M474.809,422.508a7.688,7.688,0,1,1,7.688-7.688,7.688,7.688,0,0,1-7.688,7.688Zm0-13.454a5.766,5.766,0,1,0,5.766,5.766,5.766,5.766,0,0,0-5.766-5.766Z" transform="translate(682.387 134.469)" fill="#6c63ff"/><path d="M474.809,448.508a7.688,7.688,0,1,1,7.688-7.688A7.688,7.688,0,0,1,474.809,448.508Zm0-13.454a5.766,5.766,0,1,0,5.766,5.766,5.766,5.766,0,0,0-5.766-5.766Z" transform="translate(682.387 133.669)" fill="#e6e6e6"/><path d="M512.867,382.632a6.246,6.246,0,1,0,0,12.493H602.24a6.246,6.246,0,1,0,0-12.493Z" transform="translate(680.848 135.424)" fill="#e6e6e6"/><path d="M512.867,408.632a6.247,6.247,0,1,0,0,12.493H602.24a6.246,6.246,0,1,0,0-12.493Z" transform="translate(680.848 134.41)" fill="#e6e6e6"/><path d="M512.867,434.632a6.247,6.247,0,1,0,0,12.493H602.24a6.246,6.246,0,1,0,0-12.493Z" transform="translate(680.848 133.527)" fill="#e6e6e6"/><path d="M215.494,314.132a6.246,6.246,0,0,0,0,12.493H322.165a6.246,6.246,0,1,0,0-12.493Z" transform="translate(692.445 138.096)" fill="#e6e6e6"/><path d="M215.494,231.132a6.246,6.246,0,0,0,0,12.493H322.165a6.246,6.246,0,1,0,0-12.493Z" transform="translate(692.445 129.107)" fill="#6c63ff"/><path d="M344.984,316.456a.48.48,0,0,0-.416.721l4.079,7.064a.481.481,0,0,0,.832,0l4.079-7.064a.48.48,0,0,0-.416-.721Z" transform="translate(687.17 138.006)" fill="#6c63ff"/><path d="M474.494,314.132a6.246,6.246,0,0,0,0,12.493H581.165a6.246,6.246,0,0,0,0-12.493Z" transform="translate(682.344 138.096)" fill="#e6e6e6"/><path d="M603.984,316.456a.48.48,0,0,0-.416.721l4.079,7.064a.481.481,0,0,0,.833,0l4.078-7.064a.48.48,0,0,0-.416-.721Z" transform="translate(677.068 138.006)" fill="#6c63ff"/><ellipse cx="3.844" cy="3.844" rx="3.844" ry="3.844" transform="translate(1153.354 545.445)" fill="#6c63ff"/><ellipse cx="3.844" cy="3.844" rx="3.844" ry="3.844" transform="translate(903.975 570.562)" fill="#6c63ff"/><path d="M960.05,733.1H742.512a.809.809,0,0,1,0-1.617H960.05a.809.809,0,0,1,0,1.617Z" transform="translate(-181.703 36.347)" fill="#f2f2f2"/><path d="M621.343,540.04H511.789a8.178,8.178,0,0,1-8.168-8.169V521.3a8.178,8.178,0,0,1,8.168-8.168H621.343a8.178,8.178,0,0,1,8.168,8.168v10.571A8.178,8.178,0,0,1,621.343,540.04Z" transform="matrix(0.819, -0.574, 0.574, 0.819, -8.102, 470.589)" fill="#6c63ff"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800.012" height="793.179" viewBox="0 0 800.012 793.179" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" artist="Katerina Limpitsouni" source="https://undraw.co/"><g transform="translate(-571.203 -218.417)"><path d="M981.632,982.127H424.5V410.494c0-121.619,98.944-220.563,220.563-220.563H761.069c121.619,0,220.563,98.944,220.563,220.563Z" transform="translate(244.764 28.486)" fill="#f2f2f2"/><path d="M865.627,982.125H424.5V410.492a218.856,218.856,0,0,1,42.122-129.658c1.013-1.381,2.024-2.744,3.066-4.092a220.511,220.511,0,0,1,46.943-45.564c1.007-.733,2.018-1.453,3.044-2.173a220.046,220.046,0,0,1,48.039-25.123c1.009-.382,2.036-.765,3.063-1.133a219.832,219.832,0,0,1,47.484-11.2c1-.137,2.035-.244,3.065-.352a223.293,223.293,0,0,1,47.479,0c1.028.107,2.059.215,3.074.353a219.788,219.788,0,0,1,47.471,11.2c1.027.367,2.055.75,3.066,1.134A219.5,219.5,0,0,1,769.9,228.635c1.025.7,2.051,1.424,3.062,2.144a222.832,222.832,0,0,1,28.06,23.757,220.263,220.263,0,0,1,19.423,22.21c1.039,1.344,2.049,2.707,3.061,4.086a218.858,218.858,0,0,1,42.124,129.66Z" transform="translate(244.764 28.488)" fill="#ccc"/><circle cx="24.422" cy="24.422" r="24.422" transform="translate(1050.098 564.909)" fill="#6c63ff"/><path d="M1064.222,710.828H266.783c-.71,0-1.286-.814-1.286-1.817s.576-1.818,1.286-1.818h797.439c.71,0,1.286.814,1.286,1.818S1064.933,710.828,1064.222,710.828Z" transform="translate(305.707 300.768)" fill="#e6e6e6"/><path d="M705.852,759.927H507.422a9.869,9.869,0,0,1-9.922-9.792V307.223a9.869,9.869,0,0,1,9.921-9.792H705.852a9.869,9.869,0,0,1,9.921,9.792V750.135a9.869,9.869,0,0,1-9.922,9.792Z" transform="translate(283.19 85.073)" fill="#fff"/><rect width="218.274" height="3.053" transform="translate(780.69 525.816)" fill="#ccc"/><rect width="218.274" height="3.053" transform="translate(781.453 699.995)" fill="#ccc"/><rect width="3.053" height="464.023" transform="translate(849.378 382.505)" fill="#ccc"/><rect width="3.053" height="464.023" transform="translate(925.697 382.505)" fill="#ccc"/><g transform="translate(1075.599 381.07)"><path d="M532.06,220.925a23,23,0,0,1-.621,5.294l-17.588,74.846a19.759,19.759,0,0,1-23.787,14.714l-70.488-21.872-3.442-1.063a20.41,20.41,0,0,1-15.462,3.21c-10.231-1.81-17.314-10.136-15.82-18.609s11-13.862,21.23-12.062a20.45,20.45,0,0,1,13.441,8.294l.052.01.179.032,61.352,7.589,5.157-62.226a22.937,22.937,0,0,1,45.8,1.842Z" transform="translate(-384.654 -92.478)" fill="#ed9da0"/><path d="M523.778,220.925a23,23,0,0,1-.621,5.294l-14.431,78a19.759,19.759,0,0,1-23.787,14.714l-70.488-19.6,3.158-30.523h0l53.679,7.368,6.694-57.1a22.937,22.937,0,0,1,45.8,1.842Z" transform="translate(-376.371 -92.478)" fill="#6c63ff"/><rect width="21.152" height="21.152" transform="translate(221.929 552.023) rotate(-36.399)" fill="#ed9da0"/><path d="M601.519,570.531l-36.191,26.681a25.93,25.93,0,0,1-10.5,4.579l-9.036,1.712a4.978,4.978,0,0,1-4.842-7.965l10.957-13.956,14.423-29.737.083.076c2.085,1.906,5.251,4.772,5.488,4.912,4.454.986,7.875.432,10.167-1.646,4-3.624,3.193-10.733,3.184-10.8l-.007-.055.047-.028a3.561,3.561,0,0,1,3.119-.427c2.082.76,3.168,3.492,3.324,3.911,2.032.285,7.318,6.345,7.743,6.836,3.041.551,5.135,1.693,6.223,3.393a6.917,6.917,0,0,1,.548,5.635A12.556,12.556,0,0,1,601.519,570.531Z" transform="translate(-341.504 3.596)" fill="#2f2e43"/><rect width="21.152" height="21.152" transform="translate(71.799 589.151)" fill="#ed9da0"/><path d="M469.188,615.868H424.225a25.933,25.933,0,0,1-11.168-2.545l-8.289-3.984a4.978,4.978,0,0,1,.829-9.284l17.1-4.732,29.255-15.377.022.111c.547,2.771,1.395,6.957,1.5,7.211,3,3.437,6.082,5.021,9.16,4.708,5.369-.544,8.938-6.744,8.974-6.807l.027-.048.055.006a3.561,3.561,0,0,1,2.764,1.507c1.225,1.847.478,4.691.355,5.12,1.467,1.435,2.125,9.45,2.176,10.1,2.121,2.248,3.129,4.409,3,6.424a6.918,6.918,0,0,1-2.9,4.861,12.557,12.557,0,0,1-7.893,2.733Z" transform="translate(-379.847 13.676)" fill="#2f2e43"/><path d="M550.486,317.714H449.111L432.951,654.023h35.7l23.066-152.868,92.559,122.294,33.792-30.574-67.584-91.721Z" transform="translate(-371.229 -59.214)" fill="#2f2e43"/><path d="M522.94,162.995a37.361,37.361,0,1,0-48.555,35.653l7.223,47.733,36.82-30.683s-7.954-10.131-12.22-21.556A37.321,37.321,0,0,0,522.94,162.995Z" transform="translate(-366.985 -112.605)" fill="#ed9da0"/><path d="M524.276,281.639l16.557,48.79-93.675-1.053,13.967-44.58Z" transform="translate(-367.28 -69.241)" fill="#ed9da0"/><path d="M518.46,184.739l-41.541,14.442L437.647,401.925l80.814,9.867h39.5l-30.18-201.615a67.286,67.286,0,0,0-9.323-25.438h0Z" transform="translate(-369.923 -96.176)" fill="#6c63ff"/><path d="M497.342,378.487l.723-33.325-19.458-.422-.723,33.325a20.428,20.428,0,0,0-6.155,14.543c-.225,10.388,6.561,18.96,15.158,19.147s15.749-8.083,15.974-18.471a20.428,20.428,0,0,0-5.519-14.8Z" transform="translate(-360.452 -51.702)" fill="#ed9da0"/><path d="M421.883,197.209c1.943.331,4.223-4.377,6.4-8.963,4.562-9.6,7.462-15.7,7.682-24.328.188-7.352-1.854-5.422-3.841-21.767-.655-5.391-9.865-5.381-11.74-7.941-3.166-4.324,1.692-6.107-6.186-8.7-14.756-4.865-21.428,2.693-30.8,3.344-.237.016-4.882,4.56-7.477,4.795-4.546.412-11.1-.3-14.043-7.222-2.749-6.476-4.57,12.448-2.113,14.789a49.753,49.753,0,0,1,5.776,7.342c.1.411-4.331-12.944-5.776-8.99-1.04,2.845-1.991,21.244.654,21.794,2.212.46,20.594,7.52,40.974-6.4.723-.494.04.294,2.561,6.4,3.179,7.7,3.9,8.121,3.841,10.243-.12,4.593-3.569,5.946-2.561,8.963a6.2,6.2,0,0,0,6.4,3.841c2.7-.558,3.165-3.9,5.122-3.841,1.676.051,3.664,2.575,3.841,5.122.373,5.366-7.571,6.842-8.963,14.085-.786,4.088,8.458-2.865,10.243-2.561Z" transform="translate(-274.113 -123.882)" fill="#090814"/></g></g></svg>
@@ -0,0 +1,46 @@
1
+ import fs from 'fs'
2
+ import path from 'path'
3
+ import { fileURLToPath } from 'url'
4
+
5
+ const __filename = fileURLToPath(import.meta.url)
6
+ const __dirname = path.dirname(__filename)
7
+
8
+ const templatePath = path.join(__dirname, 'html', 'template.html')
9
+ const template = fs.readFileSync(templatePath, 'utf-8')
10
+
11
+ const svgHtml = {}
12
+
13
+ export default options => {
14
+ const mainColor = options.status === 200 ? '#4CAF50' : '#e2583e'
15
+
16
+ if (!svgHtml[options.svg]) {
17
+ const svgPath = path.join(__dirname, 'html', options.svg + '.svg')
18
+ let svg = fs.readFileSync(svgPath, 'utf-8')
19
+ svg = svg.replace(/#6c63ff/g, mainColor)
20
+ // Convert SVG to Base64
21
+ const svgBase64 = Buffer.from(svg).toString('base64')
22
+ const svgDataUri = `data:image/svg+xml;base64,${svgBase64}`
23
+ svgHtml[options.svg] = template.replace('PLACEHOLDER-SVG', svgDataUri)
24
+ }
25
+
26
+ const showMore = options.showMore !== false
27
+ const placeholder = {
28
+ 'PLACEHOLDER-TITLE': options.title,
29
+ 'PLACEHOLDER-MAJOR': options.major,
30
+ 'PLACEHOLDER-MINOR': options.minor ? `<p>${options.minor}</p>` : '',
31
+ 'PLACEHOLDER-MORE-BUTTON': options.moreButton,
32
+ 'PLACEHOLDER-MORE-CONTENT': options.moreContent
33
+ }
34
+
35
+ let result = svgHtml[options.svg]
36
+
37
+ for (const [key, value] of Object.entries(placeholder)) {
38
+ result = result.replace(new RegExp(key, 'g'), value)
39
+ }
40
+ if (!showMore) {
41
+ result = result.replace('<!--PLACEHOLDER-SCRIPT-->', `<script>clickButton()</script>`)
42
+ }
43
+ result = result.replace(/\/\/ PLACEHOLDER-STYLE-COLOR/g, `color: ${mainColor};`)
44
+
45
+ return result
46
+ }
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect } from '@jest/globals'
2
+ import alertPage from './index.js'
3
+
4
+ describe('getHtml', () => {
5
+ it('应该用提供的标题替换占位符', () => {
6
+ const options = { svg: 'undraw_alert', title: 'Test Error' }
7
+ const result = alertPage(options)
8
+
9
+ expect(result).toContain('Test Error')
10
+ expect(result).toContain('data:image/svg+xml;base64')
11
+ })
12
+ })
@@ -0,0 +1,90 @@
1
+ # 国际化模块 i18n
2
+
3
+ ## 使用方式
4
+
5
+ ### 基础定义文件
6
+
7
+ 定义基础国际化文件,如 demo.yml
8
+
9
+ #### 示例
10
+
11
+ ```yaml
12
+ USER_NOT_FOUND: 'User not found: {name}'
13
+ ALLOW_REGISTER: false
14
+ ```
15
+
16
+ ### 国际化文件
17
+
18
+ 定义国际化文件,对指定语言或指定国家做常规国际化或特殊处理。注意,国际化不限于翻译,也可以是内容的调整。
19
+
20
+ #### 国际化匹配规则
21
+
22
+ 在基础定义文件中定义的国际化内容,会被当前语言环境对应的国际化文件中的内容覆盖。
23
+ 如当前语言为`zh-CN`,以如下顺序查找内容:
24
+
25
+ 1. 加载对应的`.zh-CN.yml`文件,查找是否有对应的国际化。
26
+ 2. 加载对应的`.zh.yml`文件,查找是否有对应的国际化。
27
+ 3. 加载对应的`.en.yml`文件,查找是否有对应的国际化。
28
+ 4. 不国际化,使用原始内容。
29
+
30
+ #### 指定国家区域示例
31
+
32
+ ##### 简体中文(中国)示例文件
33
+
34
+ - demo.zh-CN.yml
35
+
36
+ ```yaml
37
+ USER_NOT_FOUND: '用户在中国未找到: {name}'
38
+ ALLOW_REGISTER: true
39
+ ```
40
+
41
+ ##### 英语(美国)示例文件
42
+
43
+ - demo.en-US.yml
44
+
45
+ ```yaml
46
+ USER_NOT_FOUND: 'User not found in US: {name}'
47
+ ```
48
+
49
+ 对于上述配置,在`en-US`环境下,不允许注册,但在 zh-CN 环境下,允许注册。
50
+ 但由于`en-US`未定义`ALLOW_REGISTER`如`.en.yml`有额外定义,则以`.en.yml`的定义为准。
51
+
52
+ #### 不指定国家区域示例
53
+
54
+ ##### 英语示例文件
55
+
56
+ - demo.en.yml
57
+
58
+ ```yaml
59
+ USER_NOT_FOUND: 'User not found: {name}'
60
+ ALLOW_REGISTER: true
61
+ ```
62
+
63
+ 对于上述配置,在英语环境下,都允许注册
64
+
65
+ ## 使用
66
+
67
+ ```js
68
+ // 引入国际化模块
69
+ import initI18n from './index'
70
+
71
+ // 根据配置文件的目录,初始化国际化模块
72
+ const i18n = initI18n({
73
+ namespace: 'DEMO',
74
+ i18n: process.cwd() + '/config/i18n',
75
+ id: 'USER001',
76
+ index: 'SERVER1-000001',
77
+ log: process.cwd() + '/tmp/log/main'
78
+ })
79
+
80
+ // 获取国际化内容
81
+ const userNotFound = i18n('USER_NOT_FOUND', { name: 'tester' })
82
+
83
+ // 记录日志
84
+ const { logger } = i18n
85
+ logger.info('USER_NOT_FOUND', { name: 'tester' })
86
+
87
+ // 抛出异常,该操作会调用logger.error
88
+ const { Error } = i18n
89
+ throw new Error('USER_NOT_FOUND', { name: 'tester' })
90
+ ```
@@ -0,0 +1,31 @@
1
+ # convertI18n
2
+
3
+ 此模块提供了一个函数,用于使用给定数据转换 i18n 模板。它支持多种语言和地区,如果找不到指定的地区,则回退到原始模板。
4
+
5
+ ## 用法
6
+
7
+ ```typescript
8
+ import convertI18n from './index'
9
+ import { I18nConfig, I18nData } from '../types'
10
+
11
+ const config: I18nConfig = {
12
+ en: { greeting: 'Hello, {name}!' },
13
+ 'zh-CN': { greeting: '你好, {name}!' },
14
+ origin: { greeting: 'Hi, {name}!' }
15
+ }
16
+
17
+ const data: I18nData = { name: 'John' }
18
+ const result = convertI18n(config, 'en', 'greeting', data)
19
+ console.log(result) // 输出: Hello, John!
20
+ ```
21
+
22
+ ## 函数
23
+
24
+ ### convertI18n(config: I18nConfig, target: string, code: string, data: I18nData): I18nValue
25
+
26
+ - `config`: i18n 配置对象。
27
+ - `target`: 目标地区或语言。
28
+ - `code`: 要查找的 i18n 代码。
29
+ - `data`: 用于替换模板中变量的数据。
30
+
31
+ 返回用提供的数据替换变量后的 i18n 值。
@@ -0,0 +1,26 @@
1
+ function getI18nTemplate(i18nConfig, region, code) {
2
+ // 优先查找指定语言和国家的国际化内容
3
+ if (i18nConfig[region] && i18nConfig[region][code] !== undefined) {
4
+ return i18nConfig[region][code]
5
+ }
6
+
7
+ // 查找指定语言的国际化内容
8
+ const language = region.split('-')[0]
9
+ if (i18nConfig[language] && i18nConfig[language][code] !== undefined) {
10
+ return i18nConfig[language][code]
11
+ }
12
+
13
+ // 查找默认语言的国际化内容
14
+ if (i18nConfig.en && i18nConfig.en[code] !== undefined) {
15
+ return i18nConfig.en[code]
16
+ }
17
+
18
+ // 返回基础定义文件中的内容
19
+ if (i18nConfig.origin) {
20
+ return i18nConfig.origin[code]
21
+ }
22
+
23
+ return null
24
+ }
25
+
26
+ export default getI18nTemplate
@@ -0,0 +1,40 @@
1
+ import { describe, it, expect } from '@jest/globals'
2
+ import getI18nTemplate from './getI18nTemplate.js'
3
+
4
+ describe('获取国际化结果', () => {
5
+ const i18nConfig = {
6
+ origin: { key: 'origin', key2: 'origin' },
7
+ 'zh-CN': { key: 'zh-CN' },
8
+ en: { key: 'en' }
9
+ }
10
+
11
+ it('应该返回指定语言和国家的国际化内容', async () => {
12
+ const value = await getI18nTemplate(i18nConfig, 'zh-CN', 'key')
13
+ expect(value).toBe('zh-CN')
14
+ })
15
+
16
+ it('应该返回指定语言的国际化内容', async () => {
17
+ const value = await getI18nTemplate(i18nConfig, 'en-US', 'key')
18
+ expect(value).toBe('en')
19
+ })
20
+
21
+ it('应该返回基础定义文件中的内容', async () => {
22
+ const value = await getI18nTemplate(i18nConfig, 'fr-FR', 'key2')
23
+ expect(value).toBe('origin')
24
+ })
25
+
26
+ it('应该返回null当没有匹配的国际化内容', async () => {
27
+ const value = await getI18nTemplate({}, 'fr-FR', 'nonexistentKey')
28
+ expect(value).toBeNull()
29
+ })
30
+
31
+ it('应该返回默认语言的国际化内容当指定语言和国家不存在', async () => {
32
+ const value = await getI18nTemplate(i18nConfig, 'es-ES', 'key')
33
+ expect(value).toBe('en')
34
+ })
35
+
36
+ it('应该返回基础定义文件中的内容当指定语言和默认语言不存在', async () => {
37
+ const value = await getI18nTemplate(i18nConfig, 'jp-JP', 'key2')
38
+ expect(value).toBe('origin')
39
+ })
40
+ })