@nestjs/throttler 3.1.0 → 4.1.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.
package/README.md CHANGED
@@ -31,7 +31,6 @@ For an overview of the community storage providers, see [Community Storage Provi
31
31
 
32
32
  This package comes with a couple of goodies that should be mentioned, first is the `ThrottlerModule`.
33
33
 
34
-
35
34
  ## Installation
36
35
 
37
36
  ```bash
@@ -42,6 +41,8 @@ $ npm i --save @nestjs/throttler
42
41
 
43
42
  `@nestjs/throttler@^1` is compatible with Nest v7 while `@nestjs/throttler@^2` is compatible with Nest v7 and Nest v8, but it is suggested to be used with only v8 in case of breaking changes against v7 that are unseen.
44
43
 
44
+ For NestJS v10, please use version 4.1.0 or above
45
+
45
46
  ## Table of Contents
46
47
 
47
48
  - [Description](#description)
@@ -216,8 +217,8 @@ The interface looks like this:
216
217
 
217
218
  ```ts
218
219
  export interface ThrottlerStorage {
219
- getRecord(key: string): Promise<number[]>;
220
- addRecord(key: string, ttl: number): Promise<void>;
220
+ storage: Record<string, ThrottlerStorageOptions>;
221
+ increment(key: string, ttl: number): Promise<ThrottlerStorageRecord>;
221
222
  }
222
223
  ```
223
224
 
@@ -259,13 +260,12 @@ export class WsThrottlerGuard extends ThrottlerGuard {
259
260
  .filter((obj) => obj)
260
261
  .shift().remoteAddress;
261
262
  const key = this.generateKey(context, ip);
262
- const ttls = await this.storageService.getRecord(key);
263
+ const { totalHits } = await this.storageService.increment(key, ttl);
263
264
 
264
- if (ttls.length >= limit) {
265
+ if (totalHits > limit) {
265
266
  throw new ThrottlerException();
266
267
  }
267
268
 
268
- await this.storageService.addRecord(key, ttl);
269
269
  return true;
270
270
  }
271
271
  }
@@ -306,4 +306,4 @@ Feel free to submit a PR with your custom storage provider being added to this l
306
306
 
307
307
  ## License
308
308
 
309
- Nest is [MIT licensed](LICENSE).
309
+ Nest is [MIT licensed](LICENSE).
@@ -0,0 +1,5 @@
1
+ export interface ThrottlerStorageOptions {
2
+ totalHits: number;
3
+ expiresAt: number;
4
+ }
5
+ export declare const ThrottlerStorageOptions: unique symbol;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThrottlerStorageOptions = void 0;
4
+ exports.ThrottlerStorageOptions = Symbol('ThrottlerStorageOptions');
5
+ //# sourceMappingURL=throttler-storage-options.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttler-storage-options.interface.js","sourceRoot":"","sources":["../src/throttler-storage-options.interface.ts"],"names":[],"mappings":";;;AAYa,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface ThrottlerStorageRecord {
2
+ totalHits: number;
3
+ timeToExpire: number;
4
+ }
5
+ export declare const ThrottlerStorageRecord: unique symbol;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThrottlerStorageRecord = void 0;
4
+ exports.ThrottlerStorageRecord = Symbol('ThrottlerStorageRecord');
5
+ //# sourceMappingURL=throttler-storage-record.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttler-storage-record.interface.js","sourceRoot":"","sources":["../src/throttler-storage-record.interface.ts"],"names":[],"mappings":";;;AAYa,QAAA,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC"}
@@ -1,6 +1,7 @@
1
+ import { ThrottlerStorageOptions } from './throttler-storage-options.interface';
2
+ import { ThrottlerStorageRecord } from './throttler-storage-record.interface';
1
3
  export interface ThrottlerStorage {
2
- storage: Record<string, number[]>;
3
- getRecord(key: string): Promise<number[]>;
4
- addRecord(key: string, ttl: number): Promise<void>;
4
+ storage: Record<string, ThrottlerStorageOptions>;
5
+ increment(key: string, ttl: number): Promise<ThrottlerStorageRecord>;
5
6
  }
6
7
  export declare const ThrottlerStorage: unique symbol;
@@ -1 +1 @@
1
- {"version":3,"file":"throttler-storage.interface.js","sourceRoot":"","sources":["../src/throttler-storage.interface.ts"],"names":[],"mappings":";;;AAqBa,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
1
+ {"version":3,"file":"throttler-storage.interface.js","sourceRoot":"","sources":["../src/throttler-storage.interface.ts"],"names":[],"mappings":";;;AAiBa,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export declare const Throttle: (limit?: number, ttl?: number) => MethodDecorator & ClassDecorator;
2
2
  export declare const SkipThrottle: (skip?: boolean) => MethodDecorator & ClassDecorator;
3
- export declare const InjectThrottlerOptions: () => (target: object, key: string | symbol, index?: number) => void;
4
- export declare const InjectThrottlerStorage: () => (target: object, key: string | symbol, index?: number) => void;
3
+ export declare const InjectThrottlerOptions: () => PropertyDecorator & ParameterDecorator;
4
+ export declare const InjectThrottlerStorage: () => PropertyDecorator & ParameterDecorator;
@@ -20,7 +20,7 @@ const throttler_storage_interface_1 = require("./throttler-storage.interface");
20
20
  const throttler_constants_1 = require("./throttler.constants");
21
21
  const throttler_decorator_1 = require("./throttler.decorator");
22
22
  const throttler_exception_1 = require("./throttler.exception");
23
- let ThrottlerGuard = class ThrottlerGuard {
23
+ let ThrottlerGuard = exports.ThrottlerGuard = class ThrottlerGuard {
24
24
  constructor(options, storageService, reflector) {
25
25
  this.options = options;
26
26
  this.storageService = storageService;
@@ -59,16 +59,14 @@ let ThrottlerGuard = class ThrottlerGuard {
59
59
  }
60
60
  const tracker = this.getTracker(req);
61
61
  const key = this.generateKey(context, tracker);
62
- const ttls = await this.storageService.getRecord(key);
63
- const nearestExpiryTime = ttls.length > 0 ? Math.ceil((ttls[0] - Date.now()) / 1000) : 0;
64
- if (ttls.length >= limit) {
65
- res.header('Retry-After', nearestExpiryTime);
62
+ const { totalHits, timeToExpire } = await this.storageService.increment(key, ttl);
63
+ if (totalHits > limit) {
64
+ res.header('Retry-After', timeToExpire);
66
65
  this.throwThrottlingException(context);
67
66
  }
68
67
  res.header(`${this.headerPrefix}-Limit`, limit);
69
- res.header(`${this.headerPrefix}-Remaining`, Math.max(0, limit - (ttls.length + 1)));
70
- res.header(`${this.headerPrefix}-Reset`, nearestExpiryTime);
71
- await this.storageService.addRecord(key, ttl);
68
+ res.header(`${this.headerPrefix}-Remaining`, Math.max(0, limit - totalHits));
69
+ res.header(`${this.headerPrefix}-Reset`, timeToExpire);
72
70
  return true;
73
71
  }
74
72
  getTracker(req) {
@@ -86,11 +84,10 @@ let ThrottlerGuard = class ThrottlerGuard {
86
84
  throw new throttler_exception_1.ThrottlerException(this.errorMessage);
87
85
  }
88
86
  };
89
- ThrottlerGuard = __decorate([
87
+ exports.ThrottlerGuard = ThrottlerGuard = __decorate([
90
88
  (0, common_1.Injectable)(),
91
89
  __param(0, (0, throttler_decorator_1.InjectThrottlerOptions)()),
92
90
  __param(1, (0, throttler_decorator_1.InjectThrottlerStorage)()),
93
91
  __metadata("design:paramtypes", [Object, Object, core_1.Reflector])
94
92
  ], ThrottlerGuard);
95
- exports.ThrottlerGuard = ThrottlerGuard;
96
93
  //# sourceMappingURL=throttler.guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"throttler.guard.js","sourceRoot":"","sources":["../src/throttler.guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"throttler.guard.js","sourceRoot":"","sources":["../src/throttler.guard.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ exports.ThrottlerModule = void 0;
11
11
  const common_1 = require("@nestjs/common");
12
12
  const throttler_constants_1 = require("./throttler.constants");
13
13
  const throttler_providers_1 = require("./throttler.providers");
14
- let ThrottlerModule = ThrottlerModule_1 = class ThrottlerModule {
14
+ let ThrottlerModule = exports.ThrottlerModule = ThrottlerModule_1 = class ThrottlerModule {
15
15
  static forRoot(options = {}) {
16
16
  const providers = [...(0, throttler_providers_1.createThrottlerProviders)(options), throttler_providers_1.ThrottlerStorageProvider];
17
17
  return {
@@ -56,9 +56,8 @@ let ThrottlerModule = ThrottlerModule_1 = class ThrottlerModule {
56
56
  };
57
57
  }
58
58
  };
59
- ThrottlerModule = ThrottlerModule_1 = __decorate([
59
+ exports.ThrottlerModule = ThrottlerModule = ThrottlerModule_1 = __decorate([
60
60
  (0, common_1.Global)(),
61
61
  (0, common_1.Module)({})
62
62
  ], ThrottlerModule);
63
- exports.ThrottlerModule = ThrottlerModule;
64
63
  //# sourceMappingURL=throttler.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"throttler.module.js","sourceRoot":"","sources":["../src/throttler.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAyE;AAMzE,+DAA0D;AAC1D,+DAA2F;AAOpF,IAAM,eAAe,uBAArB,MAAM,eAAe;IAI1B,MAAM,CAAC,OAAO,CAAC,UAAkC,EAAE;QACjD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAA,8CAAwB,EAAC,OAAO,CAAC,EAAE,8CAAwB,CAAC,CAAC;QACnF,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS;YACT,OAAO,EAAE,SAAS;SACnB,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,YAAY,CAAC,OAA8B;QAChD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,8CAAwB,CAAC,CAAC;QACpF,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS;YACT,OAAO,EAAE,SAAS;SACnB,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,OAA8B;QAChE,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE;YAC7C,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;SACnD;QACD,OAAO;YACL,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC;YACxC;gBACE,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B;SACF,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,0BAA0B,CAAC,OAA8B;QACtE,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,OAAO;gBACL,OAAO,EAAE,uCAAiB;gBAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;aAC7B,CAAC;SACH;QACD,OAAO;YACL,OAAO,EAAE,uCAAiB;YAC1B,UAAU,EAAE,KAAK,EAAE,cAAuC,EAAE,EAAE,CAC5D,MAAM,cAAc,CAAC,sBAAsB,EAAE;YAC/C,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;SAClD,CAAC;IACJ,CAAC;CACF,CAAA;AAtDY,eAAe;IAF3B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,eAAe,CAsD3B;AAtDY,0CAAe"}
1
+ {"version":3,"file":"throttler.module.js","sourceRoot":"","sources":["../src/throttler.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAyE;AAMzE,+DAA0D;AAC1D,+DAA2F;AAOpF,IAAM,eAAe,iDAArB,MAAM,eAAe;IAI1B,MAAM,CAAC,OAAO,CAAC,UAAkC,EAAE;QACjD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAA,8CAAwB,EAAC,OAAO,CAAC,EAAE,8CAAwB,CAAC,CAAC;QACnF,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS;YACT,OAAO,EAAE,SAAS;SACnB,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,YAAY,CAAC,OAA8B;QAChD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,8CAAwB,CAAC,CAAC;QACpF,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS;YACT,OAAO,EAAE,SAAS;SACnB,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,OAA8B;QAChE,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE;YAC7C,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;SACnD;QACD,OAAO;YACL,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC;YACxC;gBACE,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B;SACF,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,0BAA0B,CAAC,OAA8B;QACtE,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,OAAO;gBACL,OAAO,EAAE,uCAAiB;gBAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;aAC7B,CAAC;SACH;QACD,OAAO;YACL,OAAO,EAAE,uCAAiB;YAC1B,UAAU,EAAE,KAAK,EAAE,cAAuC,EAAE,EAAE,CAC5D,MAAM,cAAc,CAAC,sBAAsB,EAAE;YAC/C,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;SAClD,CAAC;IACJ,CAAC;CACF,CAAA;0BAtDY,eAAe;IAF3B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,eAAe,CAsD3B"}
@@ -1,10 +1,13 @@
1
1
  import { OnApplicationShutdown } from '@nestjs/common';
2
+ import { ThrottlerStorageOptions } from './throttler-storage-options.interface';
3
+ import { ThrottlerStorageRecord } from './throttler-storage-record.interface';
2
4
  import { ThrottlerStorage } from './throttler-storage.interface';
3
5
  export declare class ThrottlerStorageService implements ThrottlerStorage, OnApplicationShutdown {
4
6
  private _storage;
5
7
  private timeoutIds;
6
- get storage(): Record<string, number[]>;
7
- getRecord(key: string): Promise<number[]>;
8
- addRecord(key: string, ttl: number): Promise<void>;
8
+ get storage(): Record<string, ThrottlerStorageOptions>;
9
+ private getExpirationTime;
10
+ private setExpirationTime;
11
+ increment(key: string, ttl: number): Promise<ThrottlerStorageRecord>;
9
12
  onApplicationShutdown(): void;
10
13
  }
@@ -8,7 +8,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.ThrottlerStorageService = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
- let ThrottlerStorageService = class ThrottlerStorageService {
11
+ let ThrottlerStorageService = exports.ThrottlerStorageService = class ThrottlerStorageService {
12
12
  constructor() {
13
13
  this._storage = {};
14
14
  this.timeoutIds = [];
@@ -16,28 +16,39 @@ let ThrottlerStorageService = class ThrottlerStorageService {
16
16
  get storage() {
17
17
  return this._storage;
18
18
  }
19
- async getRecord(key) {
20
- return this.storage[key] || [];
19
+ getExpirationTime(key) {
20
+ return Math.floor((this.storage[key].expiresAt - Date.now()) / 1000);
21
21
  }
22
- async addRecord(key, ttl) {
23
- const ttlMilliseconds = ttl * 1000;
24
- if (!this.storage[key]) {
25
- this.storage[key] = [];
26
- }
27
- this.storage[key].push(Date.now() + ttlMilliseconds);
22
+ setExpirationTime(key, ttlMilliseconds) {
28
23
  const timeoutId = setTimeout(() => {
29
- this.storage[key].shift();
24
+ this.storage[key].totalHits--;
30
25
  clearTimeout(timeoutId);
31
26
  this.timeoutIds = this.timeoutIds.filter((id) => id != timeoutId);
32
27
  }, ttlMilliseconds);
33
28
  this.timeoutIds.push(timeoutId);
34
29
  }
30
+ async increment(key, ttl) {
31
+ const ttlMilliseconds = ttl * 1000;
32
+ if (!this.storage[key]) {
33
+ this.storage[key] = { totalHits: 0, expiresAt: Date.now() + ttlMilliseconds };
34
+ }
35
+ let timeToExpire = this.getExpirationTime(key);
36
+ if (timeToExpire <= 0) {
37
+ this.storage[key].expiresAt = Date.now() + ttlMilliseconds;
38
+ timeToExpire = this.getExpirationTime(key);
39
+ }
40
+ this.storage[key].totalHits++;
41
+ this.setExpirationTime(key, ttlMilliseconds);
42
+ return {
43
+ totalHits: this.storage[key].totalHits,
44
+ timeToExpire,
45
+ };
46
+ }
35
47
  onApplicationShutdown() {
36
48
  this.timeoutIds.forEach(clearTimeout);
37
49
  }
38
50
  };
39
- ThrottlerStorageService = __decorate([
51
+ exports.ThrottlerStorageService = ThrottlerStorageService = __decorate([
40
52
  (0, common_1.Injectable)()
41
53
  ], ThrottlerStorageService);
42
- exports.ThrottlerStorageService = ThrottlerStorageService;
43
54
  //# sourceMappingURL=throttler.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"throttler.service.js","sourceRoot":"","sources":["../src/throttler.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAmE;AAI5D,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAA7B;QACG,aAAQ,GAA6B,EAAE,CAAC;QACxC,eAAU,GAAqB,EAAE,CAAC;IA6B5C,CAAC;IA3BC,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,GAAW;QACtC,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;SACxB;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,CAAC;QAErD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1B,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,SAAS,CAAC,CAAC;QACpE,CAAC,EAAE,eAAe,CAAC,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;CACF,CAAA;AA/BY,uBAAuB;IADnC,IAAA,mBAAU,GAAE;GACA,uBAAuB,CA+BnC;AA/BY,0DAAuB"}
1
+ {"version":3,"file":"throttler.service.js","sourceRoot":"","sources":["../src/throttler.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAmE;AAS5D,IAAM,uBAAuB,qCAA7B,MAAM,uBAAuB;IAA7B;QACG,aAAQ,GAA4C,EAAE,CAAC;QACvD,eAAU,GAAqB,EAAE,CAAC;IAmD5C,CAAC;IAjDC,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAKO,iBAAiB,CAAC,GAAW;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACvE,CAAC;IAKO,iBAAiB,CAAC,GAAW,EAAE,eAAuB;QAC5D,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;YAC9B,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,SAAS,CAAC,CAAC;QACpE,CAAC,EAAE,eAAe,CAAC,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,GAAW;QACtC,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAAE,CAAC;SAC/E;QAED,IAAI,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAG/C,IAAI,YAAY,IAAI,CAAC,EAAE;YACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;YAC3D,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;SAC5C;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAE7C,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS;YACtC,YAAY;SACb,CAAC;IACJ,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;CACF,CAAA;kCArDY,uBAAuB;IADnC,IAAA,mBAAU,GAAE;GACA,uBAAuB,CAqDnC"}