@testomatio/reporter 2.0.1-beta.5-timestamp → 2.0.1

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 (149) hide show
  1. package/README.md +1 -0
  2. package/lib/adapter/codecept.d.ts +2 -0
  3. package/lib/adapter/codecept.js +293 -335
  4. package/lib/adapter/cucumber/current.d.ts +14 -0
  5. package/lib/adapter/cucumber/current.js +195 -203
  6. package/lib/adapter/cucumber/legacy.d.ts +0 -0
  7. package/lib/adapter/cucumber/legacy.js +130 -155
  8. package/lib/adapter/cucumber.d.ts +2 -0
  9. package/lib/adapter/cucumber.js +5 -16
  10. package/lib/adapter/cypress-plugin/index.d.ts +2 -0
  11. package/lib/adapter/cypress-plugin/index.js +91 -105
  12. package/lib/adapter/jasmine.d.ts +11 -0
  13. package/lib/adapter/jasmine.js +54 -53
  14. package/lib/adapter/jest.d.ts +13 -0
  15. package/lib/adapter/jest.js +97 -99
  16. package/lib/adapter/mocha.d.ts +2 -0
  17. package/lib/adapter/mocha.js +112 -141
  18. package/lib/adapter/nightwatch.d.ts +4 -0
  19. package/lib/adapter/nightwatch.js +80 -0
  20. package/lib/adapter/playwright.d.ts +14 -0
  21. package/lib/adapter/playwright.js +199 -231
  22. package/lib/adapter/vitest.d.ts +35 -0
  23. package/lib/adapter/vitest.js +150 -149
  24. package/lib/adapter/webdriver.d.ts +24 -0
  25. package/lib/adapter/webdriver.js +144 -121
  26. package/lib/bin/cli.d.ts +2 -0
  27. package/lib/bin/cli.js +229 -211
  28. package/lib/bin/reportXml.d.ts +2 -0
  29. package/lib/bin/reportXml.js +51 -52
  30. package/lib/bin/startTest.d.ts +2 -0
  31. package/lib/bin/startTest.js +83 -95
  32. package/lib/bin/uploadArtifacts.d.ts +2 -0
  33. package/lib/bin/uploadArtifacts.js +56 -61
  34. package/lib/client.d.ts +76 -0
  35. package/lib/client.js +429 -465
  36. package/lib/config.d.ts +1 -0
  37. package/lib/config.js +18 -23
  38. package/lib/constants.d.ts +25 -0
  39. package/lib/constants.js +50 -44
  40. package/lib/data-storage.d.ts +34 -0
  41. package/lib/data-storage.js +216 -188
  42. package/lib/junit-adapter/adapter.d.ts +9 -0
  43. package/lib/junit-adapter/adapter.js +17 -20
  44. package/lib/junit-adapter/csharp.d.ts +5 -0
  45. package/lib/junit-adapter/csharp.js +28 -14
  46. package/lib/junit-adapter/index.d.ts +3 -0
  47. package/lib/junit-adapter/index.js +27 -25
  48. package/lib/junit-adapter/java.d.ts +5 -0
  49. package/lib/junit-adapter/java.js +41 -53
  50. package/lib/junit-adapter/javascript.d.ts +4 -0
  51. package/lib/junit-adapter/javascript.js +30 -27
  52. package/lib/junit-adapter/python.d.ts +5 -0
  53. package/lib/junit-adapter/python.js +38 -37
  54. package/lib/junit-adapter/ruby.d.ts +4 -0
  55. package/lib/junit-adapter/ruby.js +11 -8
  56. package/lib/output.d.ts +11 -0
  57. package/lib/output.js +44 -52
  58. package/lib/package.json +3 -0
  59. package/lib/pipe/bitbucket.d.ts +25 -0
  60. package/lib/pipe/bitbucket.js +223 -230
  61. package/lib/pipe/csv.d.ts +47 -0
  62. package/lib/pipe/csv.js +113 -126
  63. package/lib/pipe/debug.d.ts +29 -0
  64. package/lib/pipe/debug.js +125 -99
  65. package/lib/pipe/github.d.ts +30 -0
  66. package/lib/pipe/github.js +218 -213
  67. package/lib/pipe/gitlab.d.ts +25 -0
  68. package/lib/pipe/gitlab.js +183 -206
  69. package/lib/pipe/html.d.ts +35 -0
  70. package/lib/pipe/html.js +258 -321
  71. package/lib/pipe/index.d.ts +1 -0
  72. package/lib/pipe/index.js +94 -66
  73. package/lib/pipe/testomatio.d.ts +71 -0
  74. package/lib/pipe/testomatio.js +429 -474
  75. package/lib/replay.d.ts +31 -0
  76. package/lib/replay.js +255 -0
  77. package/lib/reporter-functions.d.ts +34 -0
  78. package/lib/reporter-functions.js +28 -26
  79. package/lib/reporter.d.ts +232 -0
  80. package/lib/reporter.js +34 -29
  81. package/lib/services/artifacts.d.ts +33 -0
  82. package/lib/services/artifacts.js +55 -51
  83. package/lib/services/index.d.ts +9 -0
  84. package/lib/services/index.js +14 -12
  85. package/lib/services/key-values.d.ts +27 -0
  86. package/lib/services/key-values.js +56 -53
  87. package/lib/services/logger.d.ts +64 -0
  88. package/lib/services/logger.js +226 -245
  89. package/lib/template/testomatio.hbs +1026 -1366
  90. package/lib/uploader.d.ts +60 -0
  91. package/lib/uploader.js +295 -364
  92. package/lib/utils/pipe_utils.d.ts +41 -0
  93. package/lib/utils/pipe_utils.js +89 -85
  94. package/lib/utils/utils.d.ts +54 -0
  95. package/lib/utils/utils.js +398 -307
  96. package/lib/xmlReader.d.ts +92 -0
  97. package/lib/xmlReader.js +525 -532
  98. package/package.json +64 -21
  99. package/src/adapter/codecept.js +373 -0
  100. package/src/adapter/cucumber/current.js +228 -0
  101. package/src/adapter/cucumber/legacy.js +158 -0
  102. package/src/adapter/cucumber.js +4 -0
  103. package/src/adapter/cypress-plugin/index.js +110 -0
  104. package/src/adapter/jasmine.js +60 -0
  105. package/src/adapter/jest.js +107 -0
  106. package/src/adapter/mocha.cjs +2 -0
  107. package/src/adapter/mocha.js +156 -0
  108. package/src/adapter/nightwatch.js +88 -0
  109. package/src/adapter/playwright.js +254 -0
  110. package/src/adapter/vitest.js +183 -0
  111. package/src/adapter/webdriver.js +142 -0
  112. package/src/bin/cli.js +348 -0
  113. package/src/bin/reportXml.js +77 -0
  114. package/src/bin/startTest.js +124 -0
  115. package/src/bin/uploadArtifacts.js +91 -0
  116. package/src/client.js +515 -0
  117. package/src/config.js +30 -0
  118. package/src/constants.js +53 -0
  119. package/src/data-storage.js +204 -0
  120. package/src/junit-adapter/adapter.js +23 -0
  121. package/src/junit-adapter/csharp.js +28 -0
  122. package/src/junit-adapter/index.js +28 -0
  123. package/src/junit-adapter/java.js +58 -0
  124. package/src/junit-adapter/javascript.js +31 -0
  125. package/src/junit-adapter/python.js +42 -0
  126. package/src/junit-adapter/ruby.js +10 -0
  127. package/src/output.js +57 -0
  128. package/src/pipe/bitbucket.js +252 -0
  129. package/src/pipe/csv.js +140 -0
  130. package/src/pipe/debug.js +125 -0
  131. package/src/pipe/github.js +232 -0
  132. package/src/pipe/gitlab.js +247 -0
  133. package/src/pipe/html.js +373 -0
  134. package/src/pipe/index.js +71 -0
  135. package/src/pipe/testomatio.js +504 -0
  136. package/src/replay.js +262 -0
  137. package/src/reporter-functions.js +55 -0
  138. package/src/reporter.cjs_decprecated +21 -0
  139. package/src/reporter.js +33 -0
  140. package/src/services/artifacts.js +59 -0
  141. package/src/services/index.js +13 -0
  142. package/src/services/key-values.js +59 -0
  143. package/src/services/logger.js +315 -0
  144. package/src/template/emptyData.svg +23 -0
  145. package/src/template/testomatio.hbs +1081 -0
  146. package/src/uploader.js +376 -0
  147. package/src/utils/pipe_utils.js +119 -0
  148. package/src/utils/utils.js +416 -0
  149. package/src/xmlReader.js +614 -0
@@ -0,0 +1,315 @@
1
+ import pc from 'picocolors';
2
+ import createDebugMessages from 'debug';
3
+ import { dataStorage } from '../data-storage.js';
4
+
5
+ const debug = createDebugMessages('@testomatio/reporter:services-logger');
6
+ const LOG_METHODS = ['assert', 'debug', 'error', 'info', 'log', 'trace', 'warn'];
7
+ const LEVELS = {
8
+ ALL: { severity: 1, color: '' },
9
+ VERBOSE: { severity: 3, color: 'grey' },
10
+ TRACE: { severity: 5, color: 'grey' },
11
+ DEBUG: { severity: 7, color: 'cyan' },
12
+ INFO: { severity: 9, color: 'black' },
13
+ LOG: { severity: 11, color: 'black' },
14
+ WARN: { severity: 13, color: 'yellow' },
15
+ ERROR: { severity: 15, color: 'red' },
16
+ };
17
+
18
+ // ! DON'T use console.log, console.warn, etc in this file, because it will lead to infinite loop
19
+ // use debug() instead
20
+
21
+ /**
22
+ * Logger allows to intercept logs from any logger (console.log, tracer, pino, etc)
23
+ * and save in the testomatio reporter.
24
+ * Supports different syntaxes to satisfy any user preferences.
25
+ */
26
+ class Logger {
27
+ // set default logger to be used in log, warn, error, etc methods
28
+ #originalUserLogger = { ...console };
29
+
30
+ #userLoggerWithOverridenMethods;
31
+
32
+ static #instance;
33
+
34
+ /**
35
+ *
36
+ * @returns {Logger}
37
+ */
38
+ static getInstance() {
39
+ if (!this.#instance) {
40
+ this.#instance = new Logger();
41
+ }
42
+ return this.#instance;
43
+ }
44
+
45
+ logLevel = process?.env?.LOG_LEVEL?.toUpperCase() || 'ALL';
46
+
47
+ constructor() {
48
+ if (
49
+ !dataStorage.isFileStorage ||
50
+ (process.env.TESTOMATIO_INTERCEPT_CONSOLE_LOGS && process.env.TESTOMATIO_INTERCEPT_CONSOLE_LOGS !== 'false')
51
+ )
52
+ this.intercept(console);
53
+ }
54
+
55
+ /**
56
+ * Allows you to define a step inside a test. Step name is attached to the report and
57
+ * helps to understand the test flow.
58
+ * @param {*} strings
59
+ * @param {...any} values
60
+ */
61
+ step(strings, ...values) {
62
+ let logs = '';
63
+ for (let i = 0; i < strings.length; i++) {
64
+ logs += strings[i];
65
+ if (i < values.length) {
66
+ logs += values[i];
67
+ }
68
+ }
69
+ logs = pc.blue(`> ${logs}`);
70
+ dataStorage.putData('log', logs);
71
+ }
72
+
73
+ /**
74
+ *
75
+ * @param {string} context testId or test context from test runner
76
+ * @returns {string[]}
77
+ */
78
+ getLogs(context) {
79
+ const logs = dataStorage.getData('log', context);
80
+ if (!logs) return [];
81
+ return logs;
82
+ }
83
+
84
+ #stringifyLogs(...args) {
85
+ const logs = [];
86
+ // stringify everything except strings
87
+ for (const arg of args) {
88
+ // ignore empty strings
89
+ if (arg === '') continue;
90
+ if (typeof arg === 'string') {
91
+ logs.push(arg);
92
+ } else if (Array.isArray(arg)) {
93
+ logs.push(arg.join(' '));
94
+ } else {
95
+ try {
96
+ this.prettyObjects ? logs.push(JSON.stringify(arg, null, 2)) : logs.push(JSON.stringify(arg));
97
+ } catch (e) {
98
+ debug('Error while stringify object', e);
99
+ logs.push(arg);
100
+ }
101
+ }
102
+ }
103
+ return logs.join(' ');
104
+ }
105
+
106
+ /**
107
+ * Tagget template literal. Allows to use different syntaxes:
108
+ * 1. Tagget template: log`text ${someVar}`
109
+ * 2. Standard: log(`text ${someVar}`)
110
+ * 3. Standard with multiple arguments: log('text', someVar)
111
+ */
112
+ _templateLiteralLog(strings, ...args) {
113
+ if (Array.isArray(strings)) strings = strings.filter(item => item !== '').map(item => item.trim());
114
+ if (Array.isArray(args)) args = args.filter(item => item !== '');
115
+
116
+ let logs;
117
+ // this block means tagged template is used (syntax like $`text ${someVar}`)
118
+ if (Array.isArray(strings) && strings.length === args.length + 1) {
119
+ logs = strings.reduce(
120
+ (result, current, index) =>
121
+ result +
122
+ current +
123
+ // strings are splitted by args when use tagged template, thus we add arg after each string
124
+ // it looks like: `string1 arg1 string2 arg2 string3`
125
+ (args[index] !== undefined
126
+ ? typeof args[index] === 'string'
127
+ ? args[index] // add arg as it is
128
+ : this.#stringifyLogs(args[index]) // stringify arg
129
+ : ''),
130
+ // initial accumulator value
131
+ '',
132
+ );
133
+ } else {
134
+ // this block means arguments syntax is used (syntax like $('text', someVar))
135
+ // in this case strings represents just a first argument
136
+ logs = this.#stringifyLogs(strings, ...args);
137
+ }
138
+ this.#originalUserLogger.log(logs);
139
+ dataStorage.putData('log', logs);
140
+ }
141
+
142
+ /**
143
+ * This function is a wrapper for each logging methods (log, warn, error etc) (not to repeat the same code)
144
+ * @param {*} argsArray
145
+ * @param {*} level
146
+ * @returns
147
+ */
148
+ #logWrapper(argsArray, level) {
149
+ if (!argsArray.length) return;
150
+
151
+ const severity = LEVELS[level].severity;
152
+ if (severity < LEVELS[this.logLevel]?.severity) return;
153
+
154
+ const logs = this.#stringifyLogs(...argsArray);
155
+
156
+ const colorizedLogs = pc[LEVELS[level].color](logs);
157
+ // do not attach logs from testomatio reporter itself
158
+ if (!logs.includes('[TESTOMATIO]')) {
159
+ dataStorage.putData('log', colorizedLogs);
160
+ }
161
+
162
+ try {
163
+ // level.toLowerCase() represents method name (log, warn, error, etc)
164
+ this.#originalUserLogger[level.toLowerCase()](colorizedLogs);
165
+ } catch (e) {
166
+ // method could be unexisting, ignore error
167
+ }
168
+ }
169
+
170
+ assert(...args) {
171
+ this.#logWrapper(args, 'ERROR');
172
+ }
173
+
174
+ debug(...args) {
175
+ this.#logWrapper(args, 'DEBUG');
176
+ }
177
+
178
+ error(...args) {
179
+ this.#logWrapper(args, 'ERROR');
180
+ }
181
+
182
+ info(...args) {
183
+ this.#logWrapper(args, 'INFO');
184
+ }
185
+
186
+ log(...args) {
187
+ this.#logWrapper(args, 'LOG');
188
+ }
189
+
190
+ trace(...args) {
191
+ this.#logWrapper(args, 'TRACE');
192
+ }
193
+
194
+ warn(...args) {
195
+ this.#logWrapper(args, 'WARN');
196
+ }
197
+
198
+ /**
199
+ * Intercepts user logger messages.
200
+ * When call this method, Logger start to control the user logger
201
+ * @param {*} userLogger
202
+ */
203
+ intercept(userLogger) {
204
+ // STEP 1: reset previously intercepted logger methods to original
205
+ if (this.#userLoggerWithOverridenMethods) {
206
+ for (const method of LOG_METHODS) {
207
+ this.#userLoggerWithOverridenMethods[method] = this.#originalUserLogger[method];
208
+ }
209
+ }
210
+
211
+ // STEP 2: intercept new logger
212
+ this.#originalUserLogger = { ...userLogger };
213
+
214
+ const isUserLoggerConsole = userLogger.toString?.().toLowerCase() === '[object console]';
215
+ debug(`Intercepting ${isUserLoggerConsole ? 'console' : 'some user'} logger}`);
216
+
217
+ // override user logger (any, e.g. console) methods to intercept log messages
218
+ for (const method of LOG_METHODS) {
219
+ /*
220
+ its better to create method even if it does not exist in user logger;
221
+ on method invocation, we will store the data anyway and catch block will prevent potential errors
222
+ while trying to output the message to terminal
223
+ */
224
+ // if (!this._loggerToIntercept[method]) continue;
225
+ userLogger[method] = (...args) => this[method](...args);
226
+ }
227
+
228
+ this.#userLoggerWithOverridenMethods = userLogger;
229
+
230
+ /*
231
+ Initial idea was to intercept any logger (tracer, pino, etc),
232
+ intercept message and provide output by the same logger.
233
+ But reality brings some problems: the same messages are intercepted multiple times
234
+ (because of multiple loggers are created at the same terminal process).
235
+ Also its difficult to understand (actually did not find the way to do it) if logger was already intercepted or not.
236
+ Thus, decided to intercept only console by default and provide output by default console.
237
+ It means, if user uses his own logger, its messages will be intercepted,
238
+ but the output will be always provided by console.
239
+ TODO: try to implement the providing output to terminal by user logger
240
+ */
241
+ }
242
+
243
+ stopInterception() {
244
+ debug('Stop ntercepting logs');
245
+
246
+ // restore original user logger
247
+ if (this.#userLoggerWithOverridenMethods) {
248
+ for (const method of LOG_METHODS) {
249
+ this.#userLoggerWithOverridenMethods[method] = this.#originalUserLogger[method];
250
+ }
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Allows to configure logger. Make sure you do it before the logger usage in your code.
256
+ *
257
+ * @param {Object} [config={}] - The configuration object.
258
+ * @param {string} [config.logLevel] - The desired log level. Valid values are 'DEBUG', 'INFO', 'WARN', and 'ERROR'.
259
+ * @param {boolean} [config.prettyObjects] - Specifies whether to enable pretty printing of objects.
260
+ * @returns {void}
261
+ */
262
+ configure(config = {}) {
263
+ if (!config) return;
264
+ if (config.prettyObjects === false || config.prettyObjects === true) this.prettyObjects = config.prettyObjects;
265
+ if (config.logLevel) this.logLevel = config.logLevel.toUpperCase();
266
+ }
267
+ }
268
+
269
+ export const logger = Logger.getInstance();
270
+
271
+ // TODO: parse passed arguments as {level: 'str', message: 'str'} because some loggers use such syntax;
272
+ // upd: did not face such loggers, but still could be useful
273
+
274
+ /* Cypress
275
+ There is no listener like "after:test" in cypress, only "after:spec" is available.
276
+ Thus, cannot separate logs even when I gather them (because I don't know when the test is done, just know about suite).
277
+ Also there is no easy way to access the message from cy.log() function.
278
+ (Using testomatio logger – logger.log() is not convenient because Cypress chains its commands,
279
+ thus such command will interrupt the chain.)
280
+
281
+ (Could not implement intercepting of cy.log('message'));
282
+ I found the only ability to get any logs using .task('log', 'message') (this is custom, not default cypress command)
283
+ and then intercept it with:
284
+ on('task', {
285
+ log (message) {
286
+ return null
287
+ }
288
+ })
289
+
290
+ but:
291
+ 1) it does not solve problem with getting current running testId;
292
+ 2) leads to warning "Warning: Multiple attempts to register the following task(s):".)
293
+
294
+ My way to get test id:
295
+ add cypress command to save test title to file)):
296
+ Cypress.Commands.add('writeTestTitleToFile', () => {
297
+ const testTitle = cy.state('runnable').title;
298
+ cy.writeFile('testomatio_test_title', testTitle);
299
+ });
300
+
301
+ Finally, in the test it will look like:
302
+ cy
303
+ .writeTestTitleToFile() // <<<
304
+ .task('log', 'This is a log message from the test') // <<<
305
+
306
+ .get('element)
307
+ .type('text')
308
+ .click()
309
+
310
+
311
+ Parallelization in Cypress is only available if using Cypress Dashboard??
312
+ */
313
+
314
+ // TODO: add time to logs
315
+ // TODO: add logger name to logs?
@@ -0,0 +1,23 @@
1
+ <svg width="185" height="185" viewBox="0 0 370 370" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_215_375)">
3
+ <path opacity="0.1" d="M185 369.998C287.173 369.998 370.001 287.171 370.001 184.999C370.001 82.8268 287.173 0 185 0C82.8274 0 0 82.8268 0 184.999C0 287.171 82.8274 369.998 185 369.998Z" fill="#A9C7FF"/>
4
+ <path d="M104.96 129.507C105.629 128.757 106.439 128.147 107.344 127.71C108.249 127.273 109.231 127.019 110.234 126.961C111.237 126.904 112.242 127.045 113.191 127.376C114.14 127.707 115.014 128.221 115.764 128.89L140.183 150.67L129.997 162.091L105.577 140.311C104.827 139.642 104.216 138.832 103.779 137.927C103.342 137.022 103.088 136.04 103.031 135.037C102.974 134.034 103.114 133.029 103.446 132.08C103.777 131.132 104.291 130.257 104.96 129.507Z" fill="white"/>
5
+ <path d="M130.056 163.157L105.074 140.874C104.25 140.139 103.579 139.249 103.099 138.255C102.619 137.261 102.34 136.182 102.277 135.079C102.214 133.977 102.368 132.873 102.732 131.831C103.096 130.788 103.661 129.828 104.396 129.004C105.131 128.18 106.021 127.508 107.015 127.028C108.009 126.548 109.088 126.269 110.191 126.206C111.293 126.143 112.397 126.298 113.439 126.661C114.482 127.025 115.443 127.59 116.267 128.325L141.251 150.608L130.056 163.157ZM110.677 127.703C110.544 127.703 110.409 127.707 110.275 127.714C108.913 127.792 107.605 128.273 106.516 129.094C105.427 129.916 104.607 131.042 104.158 132.329C103.709 133.617 103.652 135.01 103.994 136.33C104.336 137.65 105.062 138.84 106.08 139.747L129.936 161.024L139.117 150.731L115.261 129.454C114.002 128.325 112.371 127.701 110.68 127.703H110.677Z" fill="#474646"/>
6
+ <path d="M240 162.09L229.814 150.669L254.234 128.89C255.748 127.539 257.737 126.845 259.763 126.961C261.789 127.076 263.686 127.992 265.037 129.507C266.388 131.021 267.082 133.01 266.966 135.036C266.85 137.062 265.935 138.96 264.42 140.31L240 162.09Z" fill="white"/>
7
+ <path d="M239.942 163.157L228.749 150.608L253.733 128.325C255.397 126.841 257.583 126.079 259.809 126.206C262.035 126.333 264.12 127.34 265.604 129.004C267.088 130.668 267.851 132.853 267.723 135.079C267.596 137.306 266.59 139.39 264.926 140.874L239.942 163.157ZM230.883 150.73L240.064 161.023L263.92 139.747C264.596 139.144 265.146 138.414 265.54 137.599C265.934 136.783 266.163 135.898 266.214 134.994C266.266 134.09 266.139 133.185 265.841 132.329C265.543 131.474 265.079 130.686 264.476 130.011C263.873 129.335 263.143 128.784 262.328 128.391C261.512 127.997 260.627 127.768 259.723 127.716C258.819 127.664 257.913 127.791 257.058 128.09C256.203 128.388 255.415 128.852 254.739 129.454L230.883 150.73Z" fill="#474646"/>
8
+ <path d="M250.171 176.257C255.618 200.379 263.075 215.898 259.362 224.811C257.41 229.495 253.403 233.424 246.771 233.424C236.433 233.424 236.433 221.232 226.095 221.232C215.756 221.232 215.758 233.424 205.42 233.424C195.083 233.424 195.084 221.232 184.748 221.232C174.411 221.232 174.411 233.424 164.074 233.424C153.737 233.424 153.738 221.232 143.401 221.232C133.065 221.232 133.066 233.424 122.731 233.424C116.595 233.424 113.126 229.81 110.926 225.633C105.639 215.6 117.96 193.521 122.731 174.051C128.002 152.536 127.558 125.739 128.265 109.576C129.629 78.4083 153.554 53.0876 184.755 53.0876C215.955 53.0876 238.971 78.4613 241.244 109.576C242.469 126.351 245.184 154.176 250.171 176.257Z" fill="white"/>
9
+ <path d="M246.771 234.186C241.249 234.186 238.506 230.95 235.852 227.818C233.311 224.822 230.911 221.992 226.095 221.992C221.278 221.992 218.882 224.822 216.339 227.818C213.685 230.948 210.942 234.186 205.42 234.186C199.899 234.186 197.156 230.95 194.503 227.818C191.962 224.822 189.562 221.992 184.748 221.992C179.933 221.992 177.535 224.822 174.992 227.818C172.339 230.948 169.596 234.186 164.074 234.186C158.552 234.186 155.808 230.95 153.16 227.822C150.619 224.825 148.219 221.995 143.404 221.995C138.589 221.995 136.191 224.825 133.65 227.822C130.998 230.951 128.255 234.189 122.734 234.189C117.243 234.189 113.161 231.508 110.254 225.992C106.568 218.996 110.995 206.627 115.683 193.534C118.011 187.03 120.416 180.305 121.994 173.874C126.21 156.668 126.743 136.45 127.172 120.204C127.272 116.362 127.368 112.732 127.51 109.548C128.186 94.1198 134.32 79.7607 144.785 69.1146C149.986 63.7845 156.204 59.5527 163.071 56.6697C169.937 53.7867 177.313 52.3113 184.76 52.3308C192.159 52.3133 199.486 53.7933 206.298 56.6817C213.11 59.5701 219.267 63.8071 224.399 69.1377C234.622 79.6633 240.876 94.0076 242.01 109.526C243.102 124.489 245.712 153.033 250.92 176.094C252.686 183.916 254.663 190.825 256.407 196.921C260.048 209.651 262.679 218.848 260.069 225.109C258.652 228.498 255.046 234.186 246.771 234.186ZM226.095 220.47C231.617 220.47 234.361 223.705 237.014 226.837C239.556 229.834 241.956 232.664 246.771 232.664C254.162 232.664 257.391 227.561 258.658 224.519C261.062 218.751 258.489 209.769 254.935 197.338C253.188 191.222 251.203 184.292 249.428 176.428C244.198 153.268 241.58 124.639 240.484 109.635C238.161 77.833 214.203 53.8517 184.754 53.8517C154.874 53.8517 130.395 78.3441 129.024 109.612C128.885 112.782 128.789 116.406 128.686 120.241C128.278 135.699 127.72 156.869 123.465 174.234C121.871 180.742 119.45 187.505 117.109 194.046C112.538 206.815 108.22 218.877 111.594 225.28C114.212 230.248 117.853 232.662 122.725 232.662C127.54 232.662 129.938 229.832 132.48 226.836C135.132 223.706 137.875 220.468 143.396 220.468C148.916 220.468 151.661 223.704 154.313 226.836C156.854 229.832 159.253 232.662 164.068 232.662C168.884 232.662 171.284 229.832 173.824 226.836C176.478 223.706 179.221 220.468 184.742 220.468C190.263 220.468 193.007 223.704 195.659 226.836C198.2 229.832 200.599 232.662 205.415 232.662C210.23 232.662 212.63 229.832 215.171 226.836C217.83 223.708 220.573 220.47 226.095 220.47Z" fill="#474646"/>
10
+ <path d="M163.527 113.221C166.986 113.221 169.789 110.418 169.789 106.96C169.789 103.501 166.986 100.698 163.527 100.698C160.069 100.698 157.266 103.501 157.266 106.96C157.266 110.418 160.069 113.221 163.527 113.221Z" fill="#474646"/>
11
+ <path d="M206.465 113.221C209.923 113.221 212.726 110.418 212.726 106.96C212.726 103.501 209.923 100.698 206.465 100.698C203.006 100.698 200.203 103.501 200.203 106.96C200.203 110.418 203.006 113.221 206.465 113.221Z" fill="#474646"/>
12
+ <path d="M196.211 123.859C196.573 123.859 196.93 123.938 197.256 124.093C197.583 124.247 197.871 124.473 198.1 124.752C198.329 125.032 198.492 125.36 198.578 125.71C198.665 126.061 198.672 126.427 198.599 126.781C197.256 133.059 191.677 137.005 184.998 137.005C178.319 137.005 172.74 133.061 171.397 126.781C171.324 126.427 171.331 126.061 171.418 125.71C171.504 125.359 171.668 125.032 171.896 124.752C172.125 124.472 172.413 124.247 172.74 124.093C173.067 123.938 173.424 123.858 173.785 123.859H196.211Z" fill="white"/>
13
+ <path d="M184.997 137.767C177.802 137.767 172.037 133.416 170.652 126.94C170.553 126.479 170.559 126.002 170.67 125.543C170.78 125.085 170.992 124.657 171.29 124.292C171.59 123.919 171.97 123.618 172.402 123.412C172.834 123.206 173.306 123.099 173.785 123.1H196.212C196.691 123.099 197.164 123.206 197.595 123.412C198.027 123.618 198.407 123.919 198.707 124.292C199.005 124.657 199.217 125.085 199.327 125.543C199.438 126.002 199.444 126.479 199.345 126.94C197.958 133.416 192.192 137.767 184.997 137.767ZM173.784 124.621C173.532 124.621 173.284 124.677 173.057 124.786C172.83 124.894 172.631 125.052 172.473 125.248C172.318 125.437 172.208 125.659 172.151 125.897C172.093 126.135 172.09 126.382 172.141 126.622C173.371 132.377 178.537 136.243 184.996 136.243C191.455 136.243 196.621 132.377 197.852 126.622C197.903 126.382 197.899 126.135 197.842 125.897C197.784 125.659 197.674 125.437 197.519 125.248C197.361 125.052 197.162 124.894 196.935 124.786C196.708 124.677 196.46 124.621 196.209 124.621H173.784Z" fill="#474646"/>
14
+ <path d="M332.184 297.095C298.385 341.408 245.033 370 185.003 370C124.973 370 71.6211 341.408 37.8223 297.095C76.4052 282.579 128.135 273.704 185.003 273.704C241.872 273.704 293.598 282.579 332.184 297.095Z" fill="#A9C7FF"/>
15
+ <path d="M347.711 96.8905L252.766 96.4848C252.766 80.628 261.697 77.5062 271.192 74.931C280.687 72.3558 284.959 54.9269 301.458 53.9351C311.202 53.3491 316.312 55.8566 320.544 59.0855C320.549 59.0911 320.549 59.0967 320.555 59.0967C331.158 70.5047 340.281 83.2025 347.711 96.8905Z" fill="white"/>
16
+ <path d="M76.8801 214.712L2.43035 215.033C1.15867 207.26 0.386967 199.413 0.119995 191.541C16.4277 189.231 14.7598 176.27 34.2344 177.448C48.6825 178.316 52.4355 193.581 60.7471 195.835C69.0587 198.089 76.8801 200.83 76.8801 214.712Z" fill="white"/>
17
+ </g>
18
+ <defs>
19
+ <clipPath id="clip0_215_375">
20
+ <rect width="370" height="370" fill="white"/>
21
+ </clipPath>
22
+ </defs>
23
+ </svg>