@acmekit/file 2.13.38 → 2.13.40

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAA;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;;;;AAI7C,wBAGE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAA;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;;;;AAQ7C,wBASE"}
package/dist/index.js CHANGED
@@ -1,14 +1,18 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  require("./types");
7
4
  const _services_1 = require("./services");
8
- const providers_1 = __importDefault(require("./loaders/providers"));
9
5
  const utils_1 = require("@acmekit/framework/utils");
6
+ const modules_sdk_1 = require("@acmekit/framework/modules-sdk");
7
+ const _types_1 = require("./types");
10
8
  exports.default = (0, utils_1.Module)(utils_1.Modules.FILE, {
11
9
  service: _services_1.FileModuleService,
12
- loaders: [providers_1.default],
10
+ loaders: [
11
+ (0, modules_sdk_1.createProvidersLoader)({
12
+ prefix: _types_1.FileProviderRegistrationPrefix,
13
+ identifiersKey: _types_1.FileProviderIdentifierRegistrationName,
14
+ keyFormat: "prefixIdentifierId",
15
+ }),
16
+ ],
13
17
  });
14
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,mBAAgB;AAChB,yCAA6C;AAC7C,oEAA+C;AAC/C,oDAA0D;AAE1D,kBAAe,IAAA,cAAM,EAAC,eAAO,CAAC,IAAI,EAAE;IAClC,OAAO,EAAE,6BAAiB;IAC1B,OAAO,EAAE,CAAC,mBAAa,CAAC;CACzB,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,mBAAgB;AAChB,yCAA6C;AAC7C,oDAA0D;AAC1D,gEAAsE;AACtE,mCAGe;AAEf,kBAAe,IAAA,cAAM,EAAC,eAAO,CAAC,IAAI,EAAE;IAClC,OAAO,EAAE,6BAAiB;IAC1B,OAAO,EAAE;QACP,IAAA,mCAAqB,EAAC;YACpB,MAAM,EAAE,uCAA8B;YACtC,cAAc,EAAE,+CAAsC;YACtD,SAAS,EAAE,oBAAoB;SAChC,CAAC;KACH;CACF,CAAC,CAAA"}
@@ -1,13 +1,12 @@
1
- import { Constructor, FileTypes } from "@acmekit/framework/types";
2
- import { FileProviderRegistrationPrefix } from "../types";
1
+ import { FileTypes } from "@acmekit/framework/types";
3
2
  import type { Readable, Writable } from "stream";
4
- type InjectedDependencies = {
5
- [key: `${typeof FileProviderRegistrationPrefix}${string}`]: FileTypes.IFileProvider;
3
+ declare const FileProviderService_base: new (container: Record<string, unknown>) => {
4
+ readonly __container__: Record<string, unknown>;
5
+ readonly providers: import("@acmekit/framework/utils").ProviderRegistry<FileTypes.IFileProvider>;
6
6
  };
7
- export default class FileProviderService {
7
+ export default class FileProviderService extends FileProviderService_base {
8
8
  protected readonly fileProvider_: FileTypes.IFileProvider;
9
- constructor(container: InjectedDependencies);
10
- static getRegistrationIdentifier(providerClass: Constructor<FileTypes.IFileProvider>, optionName?: string): string;
9
+ constructor(container: Record<string, unknown>);
11
10
  upload(file: FileTypes.ProviderUploadFileDTO): Promise<FileTypes.ProviderFileResultDTO>;
12
11
  delete(fileData: FileTypes.ProviderDeleteFileDTO | FileTypes.ProviderDeleteFileDTO[]): Promise<void>;
13
12
  getPresignedDownloadUrl(fileData: FileTypes.ProviderGetFileDTO): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"file-provider-service.d.ts","sourceRoot":"","sources":["../../src/services/file-provider-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEhD,KAAK,oBAAoB,GAAG;IAC1B,CACE,GAAG,EAAE,GAAG,OAAO,8BAA8B,GAAG,MAAM,EAAE,GACvD,SAAS,CAAC,aAAa,CAAA;CAC3B,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACtC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,aAAa,CAAA;gBAE7C,SAAS,EAAE,oBAAoB;IAe3C,MAAM,CAAC,yBAAyB,CAC9B,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,EACnD,UAAU,CAAC,EAAE,MAAM;IAKrB,MAAM,CACJ,IAAI,EAAE,SAAS,CAAC,qBAAqB,GACpC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC;IAI3C,MAAM,CACJ,QAAQ,EACJ,SAAS,CAAC,qBAAqB,GAC/B,SAAS,CAAC,qBAAqB,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC;IAIhB,uBAAuB,CACrB,QAAQ,EAAE,SAAS,CAAC,kBAAkB,GACrC,OAAO,CAAC,MAAM,CAAC;IAIlB,qBAAqB,CACnB,QAAQ,EAAE,SAAS,CAAC,gCAAgC,GACnD,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC;IAkB3C,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI5E,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpE,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,uBAAuB,GAAG,OAAO,CAAC;QACpE,WAAW,EAAE,QAAQ,CAAA;QACrB,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;QACjD,GAAG,EAAE,MAAM,CAAA;QACX,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC;CAGH"}
1
+ {"version":3,"file":"file-provider-service.d.ts","sourceRoot":"","sources":["../../src/services/file-provider-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAMpD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;;;;;AAEhD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,wBAI/C;IACA,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,aAAa,CAAA;gBAE7C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAc9C,MAAM,CACJ,IAAI,EAAE,SAAS,CAAC,qBAAqB,GACpC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC;IAI3C,MAAM,CACJ,QAAQ,EACJ,SAAS,CAAC,qBAAqB,GAC/B,SAAS,CAAC,qBAAqB,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC;IAIhB,uBAAuB,CACrB,QAAQ,EAAE,SAAS,CAAC,kBAAkB,GACrC,OAAO,CAAC,MAAM,CAAC;IAIlB,qBAAqB,CACnB,QAAQ,EAAE,SAAS,CAAC,gCAAgC,GACnD,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC;IAkB3C,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI5E,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpE,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,uBAAuB,GAAG,OAAO,CAAC;QACpE,WAAW,EAAE,QAAQ,CAAA;QACrB,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;QACjD,GAAG,EAAE,MAAM,CAAA;QACX,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC;CAGH"}
@@ -2,16 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const utils_1 = require("@acmekit/framework/utils");
4
4
  const _types_1 = require("../types");
5
- class FileProviderService {
5
+ class FileProviderService extends (0, utils_1.ProviderService)({
6
+ prefix: _types_1.FileProviderRegistrationPrefix,
7
+ identifiersKey: _types_1.FileProviderIdentifierRegistrationName,
8
+ moduleName: "file",
9
+ }) {
6
10
  constructor(container) {
7
- const fileProviderKeys = Object.keys(container).filter((k) => k.startsWith(_types_1.FileProviderRegistrationPrefix));
8
- if (fileProviderKeys.length !== 1) {
11
+ super(container);
12
+ const providerIds = this.providers.list();
13
+ if (providerIds.length !== 1) {
9
14
  throw new utils_1.AcmeKitError(utils_1.AcmeKitError.Types.INVALID_DATA, `File module should be initialized with exactly one provider`);
10
15
  }
11
- this.fileProvider_ = container[fileProviderKeys[0]];
12
- }
13
- static getRegistrationIdentifier(providerClass, optionName) {
14
- return `${providerClass.identifier}_${optionName}`;
16
+ this.fileProvider_ = this.providers.resolve(providerIds[0]);
15
17
  }
16
18
  upload(file) {
17
19
  return this.fileProvider_.upload(file);
@@ -1 +1 @@
1
- {"version":3,"file":"file-provider-service.js","sourceRoot":"","sources":["../../src/services/file-provider-service.ts"],"names":[],"mappings":";;AACA,oDAAuD;AACvD,mCAAuD;AASvD,MAAqB,mBAAmB;IAGtC,YAAY,SAA+B;QACzC,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3D,CAAC,CAAC,UAAU,CAAC,uCAA8B,CAAC,CAC7C,CAAA;QAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,oBAAY,CACpB,oBAAY,CAAC,KAAK,CAAC,YAAY,EAC/B,6DAA6D,CAC9D,CAAA;QACH,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC;IAED,MAAM,CAAC,yBAAyB,CAC9B,aAAmD,EACnD,UAAmB;QAEnB,OAAO,GAAI,aAAqB,CAAC,UAAU,IAAI,UAAU,EAAE,CAAA;IAC7D,CAAC;IAED,MAAM,CACJ,IAAqC;QAErC,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,CACJ,QAEqC;QAErC,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC5C,CAAC;IAED,uBAAuB,CACrB,QAAsC;QAEtC,OAAO,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAA;IAC7D,CAAC;IAED,qBAAqB,CACnB,QAAoD;QAEpD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;YAC9C,MAAM,IAAI,oBAAY,CACpB,oBAAY,CAAC,KAAK,CAAC,YAAY,EAC/B,iDAAiD,CAClD,CAAA;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,oBAAY,CACpB,oBAAY,CAAC,KAAK,CAAC,YAAY,EAC/B,qDAAqD,CACtD,CAAA;QACH,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAC3D,CAAC;IAED,iBAAiB,CAAC,QAAsC;QACtD,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACvD,CAAC;IAED,WAAW,CAAC,QAAsC;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC;IAED,eAAe,CAAC,QAA2C;QAMzD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IACrD,CAAC;CACF;AAjFD,sCAiFC"}
1
+ {"version":3,"file":"file-provider-service.js","sourceRoot":"","sources":["../../src/services/file-provider-service.ts"],"names":[],"mappings":";;AACA,oDAAwE;AACxE,mCAGe;AAGf,MAAqB,mBAAoB,SAAQ,IAAA,uBAAe,EAA0B;IACxF,MAAM,EAAE,uCAA8B;IACtC,cAAc,EAAE,+CAAsC;IACtD,UAAU,EAAE,MAAM;CACnB,CAAC;IAGA,YAAY,SAAkC;QAC5C,KAAK,CAAC,SAAS,CAAC,CAAA;QAEhB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QACzC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,oBAAY,CACpB,oBAAY,CAAC,KAAK,CAAC,YAAY,EAC/B,6DAA6D,CAC9D,CAAA;QACH,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,CACJ,IAAqC;QAErC,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,CACJ,QAEqC;QAErC,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC5C,CAAC;IAED,uBAAuB,CACrB,QAAsC;QAEtC,OAAO,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAA;IAC7D,CAAC;IAED,qBAAqB,CACnB,QAAoD;QAEpD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;YAC9C,MAAM,IAAI,oBAAY,CACpB,oBAAY,CAAC,KAAK,CAAC,YAAY,EAC/B,iDAAiD,CAClD,CAAA;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,oBAAY,CACpB,oBAAY,CAAC,KAAK,CAAC,YAAY,EAC/B,qDAAqD,CACtD,CAAA;QACH,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAC3D,CAAC;IAED,iBAAiB,CAAC,QAAsC;QACtD,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACvD,CAAC;IAED,WAAW,CAAC,QAAsC;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC;IAED,eAAe,CAAC,QAA2C;QAMzD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IACrD,CAAC;CACF;AA7ED,sCA6EC"}
@@ -1 +1 @@
1
- {"root":["../src/index.ts","../src/joiner-config.ts","../src/loaders/providers.ts","../src/services/file-module-service.ts","../src/services/file-provider-service.ts","../src/services/index.ts","../src/services/__tests__/file.spec.ts","../src/types/index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/index.ts","../src/joiner-config.ts","../src/services/file-module-service.ts","../src/services/file-provider-service.ts","../src/services/index.ts","../src/services/__tests__/file.spec.ts","../src/types/index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acmekit/file",
3
- "version": "2.13.38",
3
+ "version": "2.13.40",
4
4
  "description": "AcmeKit File module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -36,10 +36,10 @@
36
36
  "orm:cache:clear": "MIKRO_ORM_CLI_CONFIG=./mikro-orm.config.dev.ts MIKRO_ORM_ALLOW_GLOBAL_CLI=true acmekit-mikro-orm cache:clear"
37
37
  },
38
38
  "devDependencies": {
39
- "@acmekit/framework": "2.13.38",
40
- "@acmekit/test-utils": "2.13.38"
39
+ "@acmekit/framework": "2.13.40",
40
+ "@acmekit/test-utils": "2.13.40"
41
41
  },
42
42
  "peerDependencies": {
43
- "@acmekit/framework": "2.13.38"
43
+ "@acmekit/framework": "2.13.40"
44
44
  }
45
45
  }
@@ -1,6 +0,0 @@
1
- import { LoaderOptions, ModuleProvider, ModulesSdkTypes } from "@acmekit/framework/types";
2
- declare const _default: ({ container, options, }: LoaderOptions<(ModulesSdkTypes.ModuleServiceInitializeOptions | ModulesSdkTypes.ModuleServiceInitializeCustomDataLayerOptions) & {
3
- providers: ModuleProvider[];
4
- }>) => Promise<void>;
5
- export default _default;
6
- //# sourceMappingURL=providers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/loaders/providers.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,0BAA0B,CAAA;yBA0BX,yBAGnB,aAAa,CACd,CACI,eAAe,CAAC,8BAA8B,GAC9C,eAAe,CAAC,6CAA6C,CAChE,GAAG;IAAE,SAAS,EAAE,cAAc,EAAE,CAAA;CAAE,CACpC,KAAG,OAAO,CAAC,IAAI,CAAC;AARjB,wBAcC"}
@@ -1,23 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const modules_sdk_1 = require("@acmekit/framework/modules-sdk");
4
- const _services_1 = require("../services");
5
- const _types_1 = require("../types");
6
- const awilix_1 = require("@acmekit/framework/awilix");
7
- const registrationFn = async (klass, container, pluginOptions) => {
8
- const key = _services_1.FileProviderService.getRegistrationIdentifier(klass, pluginOptions.id);
9
- container.register({
10
- [_types_1.FileProviderRegistrationPrefix + key]: (0, awilix_1.asFunction)((cradle) => new klass(cradle, pluginOptions.options ?? {}), {
11
- lifetime: klass.LIFE_TIME || awilix_1.Lifetime.SINGLETON,
12
- }),
13
- });
14
- container.registerAdd(_types_1.FileProviderIdentifierRegistrationName, (0, awilix_1.asValue)(key));
15
- };
16
- exports.default = async ({ container, options, }) => {
17
- await (0, modules_sdk_1.moduleProviderLoader)({
18
- container,
19
- providers: options?.providers || [],
20
- registerServiceFn: registrationFn,
21
- });
22
- };
23
- //# sourceMappingURL=providers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/loaders/providers.ts"],"names":[],"mappings":";;AAAA,gEAAqE;AAMrE,yCAA+C;AAC/C,mCAGe;AACf,sDAAyE;AAEzE,MAAM,cAAc,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE;IAC/D,MAAM,GAAG,GAAG,+BAAmB,CAAC,yBAAyB,CACvD,KAAK,EACL,aAAa,CAAC,EAAE,CACjB,CAAA;IAED,SAAS,CAAC,QAAQ,CAAC;QACjB,CAAC,uCAA8B,GAAG,GAAG,CAAC,EAAE,IAAA,mBAAU,EAChD,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,IAAI,EAAE,CAAC,EAC1D;YACE,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,iBAAQ,CAAC,SAAS;SAChD,CACF;KACF,CAAC,CAAA;IAEF,SAAS,CAAC,WAAW,CAAC,+CAAsC,EAAE,IAAA,gBAAO,EAAC,GAAG,CAAC,CAAC,CAAA;AAC7E,CAAC,CAAA;AAED,kBAAe,KAAK,EAAE,EACpB,SAAS,EACT,OAAO,GAMR,EAAiB,EAAE;IAClB,MAAM,IAAA,kCAAoB,EAAC;QACzB,SAAS;QACT,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,EAAE;QACnC,iBAAiB,EAAE,cAAc;KAClC,CAAC,CAAA;AACJ,CAAC,CAAA"}