@nats-io/services 3.0.0-2

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.
package/lib/service.js ADDED
@@ -0,0 +1,554 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceImpl = exports.ServiceGroupImpl = exports.ServiceMsgImpl = exports.ServiceApiPrefix = void 0;
4
+ /*
5
+ * Copyright 2022-2023 The NATS Authors
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+ const internal_1 = require("@nats-io/nats-core/internal");
19
+ const types_1 = require("./types");
20
+ function validateName(context, name = "") {
21
+ if (name === "") {
22
+ throw Error(`${context} name required`);
23
+ }
24
+ const m = validName(name);
25
+ if (m.length) {
26
+ throw new Error(`invalid ${context} name - ${context} name ${m}`);
27
+ }
28
+ }
29
+ function validName(name = "") {
30
+ if (name === "") {
31
+ throw Error(`name required`);
32
+ }
33
+ const RE = /^[-\w]+$/g;
34
+ const m = name.match(RE);
35
+ if (m === null) {
36
+ for (const c of name.split("")) {
37
+ const mm = c.match(RE);
38
+ if (mm === null) {
39
+ return `cannot contain '${c}'`;
40
+ }
41
+ }
42
+ }
43
+ return "";
44
+ }
45
+ /**
46
+ * Services have common backplane subject pattern:
47
+ *
48
+ * `$SRV.PING|STATS|INFO` - pings or retrieves status for all services
49
+ * `$SRV.PING|STATS|INFO.<name>` - pings or retrieves status for all services having the specified name
50
+ * `$SRV.PING|STATS|INFO.<name>.<id>` - pings or retrieves status of a particular service
51
+ *
52
+ * Note that <name> and <id> are upper-cased.
53
+ */
54
+ exports.ServiceApiPrefix = "$SRV";
55
+ class ServiceMsgImpl {
56
+ msg;
57
+ constructor(msg) {
58
+ this.msg = msg;
59
+ }
60
+ get data() {
61
+ return this.msg.data;
62
+ }
63
+ get sid() {
64
+ return this.msg.sid;
65
+ }
66
+ get subject() {
67
+ return this.msg.subject;
68
+ }
69
+ get reply() {
70
+ return this.msg.reply || "";
71
+ }
72
+ get headers() {
73
+ return this.msg.headers;
74
+ }
75
+ respond(data, opts) {
76
+ return this.msg.respond(data, opts);
77
+ }
78
+ respondError(code, description, data, opts) {
79
+ opts = opts || {};
80
+ opts.headers = opts.headers || (0, internal_1.headers)();
81
+ opts.headers?.set(types_1.ServiceErrorCodeHeader, `${code}`);
82
+ opts.headers?.set(types_1.ServiceErrorHeader, description);
83
+ return this.msg.respond(data, opts);
84
+ }
85
+ json(reviver) {
86
+ return this.msg.json(reviver);
87
+ }
88
+ string() {
89
+ return this.msg.string();
90
+ }
91
+ }
92
+ exports.ServiceMsgImpl = ServiceMsgImpl;
93
+ class ServiceGroupImpl {
94
+ subject;
95
+ queue;
96
+ srv;
97
+ constructor(parent, name = "", queue = "") {
98
+ if (name !== "") {
99
+ validInternalToken("service group", name);
100
+ }
101
+ let root = "";
102
+ if (parent instanceof ServiceImpl) {
103
+ this.srv = parent;
104
+ root = "";
105
+ }
106
+ else if (parent instanceof ServiceGroupImpl) {
107
+ const sg = parent;
108
+ this.srv = sg.srv;
109
+ if (queue === "" && sg.queue !== "") {
110
+ queue = sg.queue;
111
+ }
112
+ root = sg.subject;
113
+ }
114
+ else {
115
+ throw new Error("unknown ServiceGroup type");
116
+ }
117
+ this.subject = this.calcSubject(root, name);
118
+ this.queue = queue;
119
+ }
120
+ calcSubject(root, name = "") {
121
+ if (name === "") {
122
+ return root;
123
+ }
124
+ return root !== "" ? `${root}.${name}` : name;
125
+ }
126
+ addEndpoint(name = "", opts) {
127
+ opts = opts || { subject: name };
128
+ const args = typeof opts === "function"
129
+ ? { handler: opts, subject: name }
130
+ : opts;
131
+ validateName("endpoint", name);
132
+ let { subject, handler, metadata, queue } = args;
133
+ subject = subject || name;
134
+ queue = queue || this.queue;
135
+ validSubjectName("endpoint subject", subject);
136
+ subject = this.calcSubject(this.subject, subject);
137
+ const ne = { name, subject, queue, handler, metadata };
138
+ return this.srv._addEndpoint(ne);
139
+ }
140
+ addGroup(name = "", queue = "") {
141
+ return new ServiceGroupImpl(this, name, queue);
142
+ }
143
+ }
144
+ exports.ServiceGroupImpl = ServiceGroupImpl;
145
+ function validSubjectName(context, subj) {
146
+ if (subj === "") {
147
+ throw new Error(`${context} cannot be empty`);
148
+ }
149
+ if (subj.indexOf(" ") !== -1) {
150
+ throw new Error(`${context} cannot contain spaces: '${subj}'`);
151
+ }
152
+ const tokens = subj.split(".");
153
+ tokens.forEach((v, idx) => {
154
+ if (v === ">" && idx !== tokens.length - 1) {
155
+ throw new Error(`${context} cannot have internal '>': '${subj}'`);
156
+ }
157
+ });
158
+ }
159
+ function validInternalToken(context, subj) {
160
+ if (subj.indexOf(" ") !== -1) {
161
+ throw new Error(`${context} cannot contain spaces: '${subj}'`);
162
+ }
163
+ const tokens = subj.split(".");
164
+ tokens.forEach((v) => {
165
+ if (v === ">") {
166
+ throw new Error(`${context} name cannot contain internal '>': '${subj}'`);
167
+ }
168
+ });
169
+ }
170
+ class ServiceImpl {
171
+ nc;
172
+ _id;
173
+ config;
174
+ handlers;
175
+ internal;
176
+ _stopped;
177
+ _done;
178
+ started;
179
+ /**
180
+ * @param verb
181
+ * @param name
182
+ * @param id
183
+ * @param prefix - this is only supplied by tooling when building control subject that crosses an account
184
+ */
185
+ static controlSubject(verb, name = "", id = "", prefix) {
186
+ // the prefix is used as is, because it is an
187
+ // account boundary permission
188
+ const pre = prefix ?? exports.ServiceApiPrefix;
189
+ if (name === "" && id === "") {
190
+ return `${pre}.${verb}`;
191
+ }
192
+ validateName("control subject name", name);
193
+ if (id !== "") {
194
+ validateName("control subject id", id);
195
+ return `${pre}.${verb}.${name}.${id}`;
196
+ }
197
+ return `${pre}.${verb}.${name}`;
198
+ }
199
+ constructor(nc, config = { name: "", version: "" }) {
200
+ this.nc = nc;
201
+ this.config = Object.assign({}, config);
202
+ if (!this.config.queue) {
203
+ this.config.queue = "q";
204
+ }
205
+ // this will throw if no name
206
+ validateName("name", this.config.name);
207
+ validateName("queue", this.config.queue);
208
+ // this will throw if not semver
209
+ (0, internal_1.parseSemVer)(this.config.version);
210
+ this._id = internal_1.nuid.next();
211
+ this.internal = [];
212
+ this._done = (0, internal_1.deferred)();
213
+ this._stopped = false;
214
+ this.handlers = [];
215
+ this.started = new Date().toISOString();
216
+ // initialize the stats
217
+ this.reset();
218
+ // close if the connection closes
219
+ this.nc.closed()
220
+ .then(() => {
221
+ this.close().catch();
222
+ })
223
+ .catch((err) => {
224
+ this.close(err).catch();
225
+ });
226
+ }
227
+ get subjects() {
228
+ return this.handlers.filter((s) => {
229
+ return s.internal === false;
230
+ }).map((s) => {
231
+ return s.subject;
232
+ });
233
+ }
234
+ get id() {
235
+ return this._id;
236
+ }
237
+ get name() {
238
+ return this.config.name;
239
+ }
240
+ get description() {
241
+ return this.config.description ?? "";
242
+ }
243
+ get version() {
244
+ return this.config.version;
245
+ }
246
+ get metadata() {
247
+ return this.config.metadata;
248
+ }
249
+ errorToHeader(err) {
250
+ const h = (0, internal_1.headers)();
251
+ if (err instanceof types_1.ServiceError) {
252
+ const se = err;
253
+ h.set(types_1.ServiceErrorHeader, se.message);
254
+ h.set(types_1.ServiceErrorCodeHeader, `${se.code}`);
255
+ }
256
+ else {
257
+ h.set(types_1.ServiceErrorHeader, err.message);
258
+ h.set(types_1.ServiceErrorCodeHeader, "500");
259
+ }
260
+ return h;
261
+ }
262
+ setupHandler(h, internal = false) {
263
+ // internals don't use a queue
264
+ const queue = internal ? "" : (h.queue ? h.queue : this.config.queue);
265
+ const { name, subject, handler } = h;
266
+ const sv = h;
267
+ sv.internal = internal;
268
+ if (internal) {
269
+ this.internal.push(sv);
270
+ }
271
+ sv.stats = new NamedEndpointStatsImpl(name, subject, queue);
272
+ sv.queue = queue;
273
+ const callback = handler
274
+ ? (err, msg) => {
275
+ if (err) {
276
+ this.close(err);
277
+ return;
278
+ }
279
+ const start = Date.now();
280
+ try {
281
+ handler(err, new ServiceMsgImpl(msg));
282
+ }
283
+ catch (err) {
284
+ sv.stats.countError(err);
285
+ msg?.respond(internal_1.Empty, { headers: this.errorToHeader(err) });
286
+ }
287
+ finally {
288
+ sv.stats.countLatency(start);
289
+ }
290
+ }
291
+ : undefined;
292
+ sv.sub = this.nc.subscribe(subject, {
293
+ callback,
294
+ queue,
295
+ });
296
+ sv.sub.closed
297
+ .then(() => {
298
+ if (!this._stopped) {
299
+ this.close(new Error(`required subscription ${h.subject} stopped`))
300
+ .catch();
301
+ }
302
+ })
303
+ .catch((err) => {
304
+ if (!this._stopped) {
305
+ const ne = new Error(`required subscription ${h.subject} errored: ${err.message}`);
306
+ ne.stack = err.stack;
307
+ this.close(ne).catch();
308
+ }
309
+ });
310
+ return sv;
311
+ }
312
+ info() {
313
+ return {
314
+ type: types_1.ServiceResponseType.INFO,
315
+ name: this.name,
316
+ id: this.id,
317
+ version: this.version,
318
+ description: this.description,
319
+ metadata: this.metadata,
320
+ endpoints: this.endpoints(),
321
+ };
322
+ }
323
+ endpoints() {
324
+ return this.handlers.map((v) => {
325
+ const { subject, metadata, name, queue } = v;
326
+ return { subject, metadata, name, queue_group: queue };
327
+ });
328
+ }
329
+ async stats() {
330
+ const endpoints = [];
331
+ for (const h of this.handlers) {
332
+ if (typeof this.config.statsHandler === "function") {
333
+ try {
334
+ h.stats.data = await this.config.statsHandler(h);
335
+ }
336
+ catch (err) {
337
+ h.stats.countError(err);
338
+ }
339
+ }
340
+ endpoints.push(h.stats.stats(h.qi));
341
+ }
342
+ return {
343
+ type: types_1.ServiceResponseType.STATS,
344
+ name: this.name,
345
+ id: this.id,
346
+ version: this.version,
347
+ started: this.started,
348
+ metadata: this.metadata,
349
+ endpoints,
350
+ };
351
+ }
352
+ addInternalHandler(verb, handler) {
353
+ const v = `${verb}`.toUpperCase();
354
+ this._doAddInternalHandler(`${v}-all`, verb, handler);
355
+ this._doAddInternalHandler(`${v}-kind`, verb, handler, this.name);
356
+ this._doAddInternalHandler(`${v}`, verb, handler, this.name, this.id);
357
+ }
358
+ _doAddInternalHandler(name, verb, handler, kind = "", id = "") {
359
+ const endpoint = {};
360
+ endpoint.name = name;
361
+ endpoint.subject = ServiceImpl.controlSubject(verb, kind, id);
362
+ endpoint.handler = handler;
363
+ this.setupHandler(endpoint, true);
364
+ }
365
+ start() {
366
+ const jc = (0, internal_1.JSONCodec)();
367
+ const statsHandler = (err, msg) => {
368
+ if (err) {
369
+ this.close(err);
370
+ return Promise.reject(err);
371
+ }
372
+ return this.stats().then((s) => {
373
+ msg?.respond(jc.encode(s));
374
+ return Promise.resolve();
375
+ });
376
+ };
377
+ const infoHandler = (err, msg) => {
378
+ if (err) {
379
+ this.close(err);
380
+ return Promise.reject(err);
381
+ }
382
+ msg?.respond(jc.encode(this.info()));
383
+ return Promise.resolve();
384
+ };
385
+ const ping = jc.encode(this.ping());
386
+ const pingHandler = (err, msg) => {
387
+ if (err) {
388
+ this.close(err).then().catch();
389
+ return Promise.reject(err);
390
+ }
391
+ msg.respond(ping);
392
+ return Promise.resolve();
393
+ };
394
+ this.addInternalHandler(types_1.ServiceVerb.PING, pingHandler);
395
+ this.addInternalHandler(types_1.ServiceVerb.STATS, statsHandler);
396
+ this.addInternalHandler(types_1.ServiceVerb.INFO, infoHandler);
397
+ // now the actual service
398
+ this.handlers.forEach((h) => {
399
+ const { subject } = h;
400
+ if (typeof subject !== "string") {
401
+ return;
402
+ }
403
+ // this is expected in cases where main subject is just
404
+ // a root subject for multiple endpoints - user can disable
405
+ // listening to the root endpoint, by specifying null
406
+ if (h.handler === null) {
407
+ return;
408
+ }
409
+ this.setupHandler(h);
410
+ });
411
+ return Promise.resolve(this);
412
+ }
413
+ close(err) {
414
+ if (this._stopped) {
415
+ return this._done;
416
+ }
417
+ this._stopped = true;
418
+ let buf = [];
419
+ if (!this.nc.isClosed()) {
420
+ buf = this.handlers.concat(this.internal).map((h) => {
421
+ return h.sub.drain();
422
+ });
423
+ }
424
+ Promise.allSettled(buf)
425
+ .then(() => {
426
+ this._done.resolve(err ? err : null);
427
+ });
428
+ return this._done;
429
+ }
430
+ get stopped() {
431
+ return this._done;
432
+ }
433
+ get isStopped() {
434
+ return this._stopped;
435
+ }
436
+ stop(err) {
437
+ return this.close(err);
438
+ }
439
+ ping() {
440
+ return {
441
+ type: types_1.ServiceResponseType.PING,
442
+ name: this.name,
443
+ id: this.id,
444
+ version: this.version,
445
+ metadata: this.metadata,
446
+ };
447
+ }
448
+ reset() {
449
+ // pretend we restarted
450
+ this.started = new Date().toISOString();
451
+ if (this.handlers) {
452
+ for (const h of this.handlers) {
453
+ h.stats.reset(h.qi);
454
+ }
455
+ }
456
+ }
457
+ addGroup(name, queue) {
458
+ return new ServiceGroupImpl(this, name, queue);
459
+ }
460
+ addEndpoint(name, handler) {
461
+ const sg = new ServiceGroupImpl(this);
462
+ return sg.addEndpoint(name, handler);
463
+ }
464
+ _addEndpoint(e) {
465
+ const qi = new internal_1.QueuedIteratorImpl();
466
+ qi.noIterator = typeof e.handler === "function";
467
+ if (!qi.noIterator) {
468
+ e.handler = (err, msg) => {
469
+ err ? this.stop(err).catch() : qi.push(new ServiceMsgImpl(msg));
470
+ };
471
+ // close the service if the iterator closes
472
+ qi.iterClosed.then(() => {
473
+ this.close().catch();
474
+ });
475
+ }
476
+ // track the iterator for stats
477
+ const ss = this.setupHandler(e, false);
478
+ ss.qi = qi;
479
+ this.handlers.push(ss);
480
+ return qi;
481
+ }
482
+ }
483
+ exports.ServiceImpl = ServiceImpl;
484
+ class NamedEndpointStatsImpl {
485
+ name;
486
+ subject;
487
+ average_processing_time;
488
+ num_requests;
489
+ processing_time;
490
+ num_errors;
491
+ last_error;
492
+ data;
493
+ metadata;
494
+ queue;
495
+ constructor(name, subject, queue = "") {
496
+ this.name = name;
497
+ this.subject = subject;
498
+ this.average_processing_time = 0;
499
+ this.num_errors = 0;
500
+ this.num_requests = 0;
501
+ this.processing_time = 0;
502
+ this.queue = queue;
503
+ }
504
+ reset(qi) {
505
+ this.num_requests = 0;
506
+ this.processing_time = 0;
507
+ this.average_processing_time = 0;
508
+ this.num_errors = 0;
509
+ this.last_error = undefined;
510
+ this.data = undefined;
511
+ const qii = qi;
512
+ if (qii) {
513
+ qii.time = 0;
514
+ qii.processed = 0;
515
+ }
516
+ }
517
+ countLatency(start) {
518
+ this.num_requests++;
519
+ this.processing_time += (0, internal_1.nanos)(Date.now() - start);
520
+ this.average_processing_time = Math.round(this.processing_time / this.num_requests);
521
+ }
522
+ countError(err) {
523
+ this.num_errors++;
524
+ this.last_error = err.message;
525
+ }
526
+ _stats() {
527
+ const { name, subject, average_processing_time, num_errors, num_requests, processing_time, last_error, data, queue, } = this;
528
+ return {
529
+ name,
530
+ subject,
531
+ average_processing_time,
532
+ num_errors,
533
+ num_requests,
534
+ processing_time,
535
+ last_error,
536
+ data,
537
+ queue_group: queue,
538
+ };
539
+ }
540
+ stats(qi) {
541
+ const qii = qi;
542
+ if (qii?.noIterator === false) {
543
+ // grab stats in the iterator
544
+ this.processing_time = qii.time;
545
+ this.num_requests = qii.processed;
546
+ this.average_processing_time =
547
+ this.processing_time > 0 && this.num_requests > 0
548
+ ? this.processing_time / this.num_requests
549
+ : 0;
550
+ }
551
+ return this._stats();
552
+ }
553
+ }
554
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../build/src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { NatsConnection, QueuedIterator, RequestManyOptions } from "@nats-io/nats-core/internal";
2
+ import { ServiceVerb } from "./types";
3
+ import type { ServiceClient, ServiceIdentity, ServiceInfo, ServiceStats } from "./types";
4
+ export declare class ServiceClientImpl implements ServiceClient {
5
+ nc: NatsConnection;
6
+ prefix: string | undefined;
7
+ opts: RequestManyOptions;
8
+ constructor(nc: NatsConnection, opts?: RequestManyOptions, prefix?: string);
9
+ ping(name?: string, id?: string): Promise<QueuedIterator<ServiceIdentity>>;
10
+ stats(name?: string, id?: string): Promise<QueuedIterator<ServiceStats>>;
11
+ info(name?: string, id?: string): Promise<QueuedIterator<ServiceInfo>>;
12
+ q<T>(v: ServiceVerb, name?: string, id?: string): Promise<QueuedIterator<T>>;
13
+ }
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceClientImpl = void 0;
4
+ /*
5
+ * Copyright 2022-2024 The NATS Authors
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+ const internal_1 = require("@nats-io/nats-core/internal");
19
+ const service_1 = require("./service");
20
+ const types_1 = require("./types");
21
+ class ServiceClientImpl {
22
+ nc;
23
+ prefix;
24
+ opts;
25
+ constructor(nc, opts = {
26
+ strategy: internal_1.RequestStrategy.JitterTimer,
27
+ maxWait: 2000,
28
+ }, prefix) {
29
+ this.nc = nc;
30
+ this.prefix = prefix;
31
+ this.opts = opts;
32
+ }
33
+ ping(name = "", id = "") {
34
+ return this.q(types_1.ServiceVerb.PING, name, id);
35
+ }
36
+ stats(name = "", id = "") {
37
+ return this.q(types_1.ServiceVerb.STATS, name, id);
38
+ }
39
+ info(name = "", id = "") {
40
+ return this.q(types_1.ServiceVerb.INFO, name, id);
41
+ }
42
+ async q(v, name = "", id = "") {
43
+ const iter = new internal_1.QueuedIteratorImpl();
44
+ const jc = (0, internal_1.JSONCodec)();
45
+ const subj = service_1.ServiceImpl.controlSubject(v, name, id, this.prefix);
46
+ const responses = await this.nc.requestMany(subj, internal_1.Empty, this.opts);
47
+ (async () => {
48
+ for await (const m of responses) {
49
+ try {
50
+ const s = jc.decode(m.data);
51
+ iter.push(s);
52
+ }
53
+ catch (err) {
54
+ // @ts-ignore: pushing fn
55
+ iter.push(() => {
56
+ iter.stop(err);
57
+ });
58
+ }
59
+ }
60
+ //@ts-ignore: push a fn
61
+ iter.push(() => {
62
+ iter.stop();
63
+ });
64
+ })().catch((err) => {
65
+ iter.stop(err);
66
+ });
67
+ return iter;
68
+ }
69
+ }
70
+ exports.ServiceClientImpl = ServiceClientImpl;
71
+ //# sourceMappingURL=serviceclient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceclient.js","sourceRoot":"","sources":["../build/src/serviceclient.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;GAaG;AACH,0DAKqC;AAQrC,uCAAwC;AACxC,mCAAsC;AAStC,MAAa,iBAAiB;IAC5B,EAAE,CAAiB;IACnB,MAAM,CAAqB;IAC3B,IAAI,CAAqB;IACzB,YACE,EAAkB,EAClB,OAA2B;QACzB,QAAQ,EAAE,0BAAe,CAAC,WAAW;QACrC,OAAO,EAAE,IAAI;KACd,EACD,MAAe;QAEf,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,CACF,IAAI,GAAG,EAAE,EACT,EAAE,GAAG,EAAE;QAEP,OAAO,IAAI,CAAC,CAAC,CAAkB,mBAAW,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CACH,IAAI,GAAG,EAAE,EACT,EAAE,GAAG,EAAE;QAEP,OAAO,IAAI,CAAC,CAAC,CAAe,mBAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CACF,IAAI,GAAG,EAAE,EACT,EAAE,GAAG,EAAE;QAEP,OAAO,IAAI,CAAC,CAAC,CAAc,mBAAW,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,CAAC,CACL,CAAc,EACd,IAAI,GAAG,EAAE,EACT,EAAE,GAAG,EAAE;QAEP,MAAM,IAAI,GAAG,IAAI,6BAAkB,EAAK,CAAC;QACzC,MAAM,EAAE,GAAG,IAAA,oBAAS,GAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,qBAAW,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACf,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,yBAAyB;oBACzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;wBACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACjB,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,uBAAuB;YACvB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;gBACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AApED,8CAoEC"}