@ama-sdk/core 11.1.0-prerelease.32 → 11.1.0-prerelease.33

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.
@@ -243,6 +243,7 @@ var MockInterceptRequest = /*#__PURE__*/ function() {
243
243
  requestOption = _object_spread_props(_object_spread({}, data), {
244
244
  method: data.method || 'GET'
245
245
  });
246
+ delete requestOption.api;
246
247
  return [
247
248
  4,
248
249
  _this.options.adapter.retrieveOperationId(requestOption)
@@ -169,6 +169,9 @@ var apiClient = {
169
169
  }
170
170
  };
171
171
  describe('Mock intercept', function() {
172
+ beforeEach(function() {
173
+ return jest.clearAllMocks();
174
+ });
172
175
  describe('request plugin', function() {
173
176
  it('should do nothing if disabled is true', /*#__PURE__*/ _async_to_generator(function() {
174
177
  var plugin, originalRequest, loaded;
@@ -202,7 +205,39 @@ describe('Mock intercept', function() {
202
205
  }
203
206
  });
204
207
  }));
205
- it.skip('should intercept the request', /*#__PURE__*/ _async_to_generator(function() {
208
+ it('should not stringify provided api', /*#__PURE__*/ _async_to_generator(function() {
209
+ var plugin, loaded, originalRequest;
210
+ return _ts_generator(this, function(_state) {
211
+ switch(_state.label){
212
+ case 0:
213
+ plugin = new _mockinterceptrequest.MockInterceptRequest({
214
+ disabled: false,
215
+ adapter: testMockAdapter
216
+ });
217
+ loaded = plugin.load();
218
+ originalRequest = {
219
+ method: 'get',
220
+ headers: new Headers({
221
+ test: 'true'
222
+ }),
223
+ basePath: 'myurl',
224
+ api: 'should not exist'
225
+ };
226
+ return [
227
+ 4,
228
+ loaded.transform(originalRequest)
229
+ ];
230
+ case 1:
231
+ _state.sent();
232
+ expect(originalRequest.headers.has(_mockinterceptinterface.CUSTOM_MOCK_REQUEST_HEADER)).toBe(true);
233
+ expect(Object.keys(JSON.parse(originalRequest.headers.get(_mockinterceptinterface.CUSTOM_MOCK_REQUEST_HEADER)))).not.toContainEqual('api');
234
+ return [
235
+ 2
236
+ ];
237
+ }
238
+ });
239
+ }));
240
+ it('should intercept the request', /*#__PURE__*/ _async_to_generator(function() {
206
241
  var plugin, originalRequest, loaded, transformed, res;
207
242
  return _ts_generator(this, function(_state) {
208
243
  switch(_state.label){
@@ -219,15 +254,25 @@ describe('Mock intercept', function() {
219
254
  method: 'PATCH'
220
255
  };
221
256
  loaded = plugin.load();
222
- transformed = loaded.transform(originalRequest);
223
257
  return [
224
258
  4,
225
- fetch(transformed.basePath, transformed)
259
+ loaded.transform(originalRequest)
226
260
  ];
227
261
  case 1:
262
+ transformed = _state.sent();
263
+ return [
264
+ 4,
265
+ fetch(transformed.basePath, transformed)
266
+ ];
267
+ case 2:
268
+ return [
269
+ 4,
270
+ _state.sent().text()
271
+ ];
272
+ case 3:
228
273
  res = _state.sent();
229
274
  expect(getMockSpy).toHaveBeenCalled();
230
- expect(res).toEqual(getMockSpy);
275
+ expect(res).toBe(JSON.stringify(testMock.mockData));
231
276
  expect(initializeSpy).toHaveBeenCalled();
232
277
  return [
233
278
  2
@@ -235,6 +235,7 @@ import { CUSTOM_MOCK_OPERATION_ID_HEADER, CUSTOM_MOCK_REQUEST_HEADER } from './m
235
235
  requestOption = _object_spread_props(_object_spread({}, data), {
236
236
  method: data.method || 'GET'
237
237
  });
238
+ delete requestOption.api;
238
239
  return [
239
240
  4,
240
241
  _this.options.adapter.retrieveOperationId(requestOption)
@@ -137,7 +137,7 @@ function _ts_generator(thisArg, body) {
137
137
  }
138
138
  import { SequentialMockAdapter } from '../../fwk';
139
139
  import { MockInterceptFetch } from './mock-intercept.fetch';
140
- import { CUSTOM_MOCK_OPERATION_ID_HEADER } from './mock-intercept.interface';
140
+ import { CUSTOM_MOCK_OPERATION_ID_HEADER, CUSTOM_MOCK_REQUEST_HEADER } from './mock-intercept.interface';
141
141
  import { MockInterceptRequest } from './mock-intercept.request';
142
142
  var testMock = {
143
143
  mockData: {}
@@ -165,6 +165,9 @@ var apiClient = {
165
165
  }
166
166
  };
167
167
  describe('Mock intercept', function() {
168
+ beforeEach(function() {
169
+ return jest.clearAllMocks();
170
+ });
168
171
  describe('request plugin', function() {
169
172
  it('should do nothing if disabled is true', /*#__PURE__*/ _async_to_generator(function() {
170
173
  var plugin, originalRequest, loaded;
@@ -198,7 +201,39 @@ describe('Mock intercept', function() {
198
201
  }
199
202
  });
200
203
  }));
201
- it.skip('should intercept the request', /*#__PURE__*/ _async_to_generator(function() {
204
+ it('should not stringify provided api', /*#__PURE__*/ _async_to_generator(function() {
205
+ var plugin, loaded, originalRequest;
206
+ return _ts_generator(this, function(_state) {
207
+ switch(_state.label){
208
+ case 0:
209
+ plugin = new MockInterceptRequest({
210
+ disabled: false,
211
+ adapter: testMockAdapter
212
+ });
213
+ loaded = plugin.load();
214
+ originalRequest = {
215
+ method: 'get',
216
+ headers: new Headers({
217
+ test: 'true'
218
+ }),
219
+ basePath: 'myurl',
220
+ api: 'should not exist'
221
+ };
222
+ return [
223
+ 4,
224
+ loaded.transform(originalRequest)
225
+ ];
226
+ case 1:
227
+ _state.sent();
228
+ expect(originalRequest.headers.has(CUSTOM_MOCK_REQUEST_HEADER)).toBe(true);
229
+ expect(Object.keys(JSON.parse(originalRequest.headers.get(CUSTOM_MOCK_REQUEST_HEADER)))).not.toContainEqual('api');
230
+ return [
231
+ 2
232
+ ];
233
+ }
234
+ });
235
+ }));
236
+ it('should intercept the request', /*#__PURE__*/ _async_to_generator(function() {
202
237
  var plugin, originalRequest, loaded, transformed, res;
203
238
  return _ts_generator(this, function(_state) {
204
239
  switch(_state.label){
@@ -215,15 +250,25 @@ describe('Mock intercept', function() {
215
250
  method: 'PATCH'
216
251
  };
217
252
  loaded = plugin.load();
218
- transformed = loaded.transform(originalRequest);
219
253
  return [
220
254
  4,
221
- fetch(transformed.basePath, transformed)
255
+ loaded.transform(originalRequest)
222
256
  ];
223
257
  case 1:
258
+ transformed = _state.sent();
259
+ return [
260
+ 4,
261
+ fetch(transformed.basePath, transformed)
262
+ ];
263
+ case 2:
264
+ return [
265
+ 4,
266
+ _state.sent().text()
267
+ ];
268
+ case 3:
224
269
  res = _state.sent();
225
270
  expect(getMockSpy).toHaveBeenCalled();
226
- expect(res).toEqual(getMockSpy);
271
+ expect(res).toBe(JSON.stringify(testMock.mockData));
227
272
  expect(initializeSpy).toHaveBeenCalled();
228
273
  return [
229
274
  2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ama-sdk/core",
3
- "version": "11.1.0-prerelease.32",
3
+ "version": "11.1.0-prerelease.33",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -79,7 +79,7 @@
79
79
  "@angular-devkit/schematics": "~18.0.0",
80
80
  "@angular/cli": "~18.0.0",
81
81
  "@angular/common": "~18.0.0",
82
- "@o3r/schematics": "^11.1.0-prerelease.32",
82
+ "@o3r/schematics": "^11.1.0-prerelease.33",
83
83
  "@schematics/angular": "~18.0.0",
84
84
  "isomorphic-fetch": "^3.0.0",
85
85
  "rxjs": "^7.8.1",
@@ -119,9 +119,9 @@
119
119
  "@angular/core": "~18.0.0",
120
120
  "@nx/eslint-plugin": "~19.3.0",
121
121
  "@nx/jest": "~19.3.0",
122
- "@o3r/build-helpers": "^11.1.0-prerelease.32",
123
- "@o3r/eslint-plugin": "^11.1.0-prerelease.32",
124
- "@o3r/test-helpers": "^11.1.0-prerelease.32",
122
+ "@o3r/build-helpers": "^11.1.0-prerelease.33",
123
+ "@o3r/eslint-plugin": "^11.1.0-prerelease.33",
124
+ "@o3r/test-helpers": "^11.1.0-prerelease.33",
125
125
  "@schematics/angular": "~18.0.0",
126
126
  "@stylistic/eslint-plugin-ts": "^2.0.0",
127
127
  "@swc/cli": "~0.4.0",
@@ -1,3 +1,4 @@
1
+ import type { Api } from '../../fwk';
1
2
  import type { Plugin, PluginContext, PluginRunner } from './plugin';
2
3
  export type RequestBody = string | FormData;
3
4
  /**
@@ -54,6 +55,10 @@ export interface RequestOptions extends RequestInit {
54
55
  metadata?: RequestMetadata;
55
56
  /** @inheritdoc */
56
57
  method: NonNullable<RequestInit['method']>;
58
+ /**
59
+ * API initializing the call
60
+ */
61
+ api?: Api;
57
62
  }
58
63
  /**
59
64
  * Interface of an SDK request plugin context.
@@ -1 +1 @@
1
- {"version":3,"file":"request-plugin.d.ts","sourceRoot":"","sources":["../../../../src/plugins/core/request-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,WAAW,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACvC,0DAA0D;IAC1D,MAAM,EAAE;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AACD;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM;IACnF,2BAA2B;IAC3B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,oDAAoD;IACpD,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,uBAAuB;IACvB,WAAW,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACxC,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,kBAAkB;IAClB,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,aAAa;CAAG;AAE9D;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;IAC3E;;;OAGG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,YAAY,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;CACpF"}
1
+ {"version":3,"file":"request-plugin.d.ts","sourceRoot":"","sources":["../../../../src/plugins/core/request-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,WAAW,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACvC,0DAA0D;IAC1D,MAAM,EAAE;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AACD;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM;IACnF,2BAA2B;IAC3B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,oDAAoD;IACpD,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,uBAAuB;IACvB,WAAW,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACxC,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,kBAAkB;IAClB,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C;;OAEG;IACH,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,aAAa;CAAG;AAE9D;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;IAC3E;;;OAGG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,YAAY,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;CACpF"}
@@ -1 +1 @@
1
- {"version":3,"file":"mock-intercept.request.d.ts","sourceRoot":"","sources":["../../../../src/plugins/mock-intercept/mock-intercept.request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAA+D,4BAA4B,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAEvK;;GAEG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAExD,SAAS,CAAC,OAAO,EAAE,8BAA8B,CAAC;IAElD;;;OAGG;gBACS,OAAO,EAAE,OAAO,CAAC,8BAA8B,CAAC,GAAG,4BAA4B;IAQ3F,kBAAkB;IACX,IAAI,IAAI,YAAY,CAAC,cAAc,EAAE,cAAc,CAAC;CAiC5D"}
1
+ {"version":3,"file":"mock-intercept.request.d.ts","sourceRoot":"","sources":["../../../../src/plugins/mock-intercept/mock-intercept.request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAA+D,4BAA4B,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAEvK;;GAEG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAExD,SAAS,CAAC,OAAO,EAAE,8BAA8B,CAAC;IAElD;;;OAGG;gBACS,OAAO,EAAE,OAAO,CAAC,8BAA8B,CAAC,GAAG,4BAA4B;IAQ3F,kBAAkB;IACX,IAAI,IAAI,YAAY,CAAC,cAAc,EAAE,cAAc,CAAC;CAmC5D"}
@@ -27,6 +27,7 @@ export class MockInterceptRequest {
27
27
  ...data,
28
28
  method: data.method || 'GET'
29
29
  };
30
+ delete requestOption.api;
30
31
  const operationId = await this.options.adapter.retrieveOperationId(requestOption);
31
32
  const mock = this.options.adapter.getMock(operationId);
32
33
  const text = JSON.stringify(mock.mockData);
@@ -1 +1 @@
1
- {"version":3,"file":"mock-intercept.request.js","sourceRoot":"","sources":["../../../../src/plugins/mock-intercept/mock-intercept.request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,+BAA+B,EAAE,0BAA0B,EAAgE,MAAM,4BAA4B,CAAC;AAEvK;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAI/B;;;OAGG;IACH,YAAY,OAA+E;QACzF,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;YAClB,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAED,kBAAkB;IACX,IAAI;QACT,OAAO;YACL,SAAS,EAAE,KAAK,EAAE,IAAoB,EAAE,EAAE;gBACxC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBAExC,IACE,IAAI,CAAC,OAAO,CAAC,QAAQ;oBACnB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EACrD,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,aAAa,GAAG;oBACpB,GAAG,IAAI;oBACP,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;iBAC7B,CAAC;gBACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;gBAClF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAC;gBAClE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;gBAE/E,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,QAAQ;oBACR,OAAO;iBACR,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"mock-intercept.request.js","sourceRoot":"","sources":["../../../../src/plugins/mock-intercept/mock-intercept.request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,+BAA+B,EAAE,0BAA0B,EAAgE,MAAM,4BAA4B,CAAC;AAEvK;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAI/B;;;OAGG;IACH,YAAY,OAA+E;QACzF,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;YAClB,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAED,kBAAkB;IACX,IAAI;QACT,OAAO;YACL,SAAS,EAAE,KAAK,EAAE,IAAoB,EAAE,EAAE;gBACxC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBAExC,IACE,IAAI,CAAC,OAAO,CAAC,QAAQ;oBACnB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EACrD,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,aAAa,GAAG;oBACpB,GAAG,IAAI;oBACP,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;iBAC7B,CAAC;gBACF,OAAO,aAAa,CAAC,GAAG,CAAC;gBAEzB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;gBAClF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAC;gBAClE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;gBAE/E,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,QAAQ;oBACR,OAAO;iBACR,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}