@cedarjs/api-server 1.1.1-next.0 → 1.1.1-next.21

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/dist/bin.js CHANGED
@@ -38,15 +38,17 @@ var init_cliHelpers = __esm({
38
38
  // src/createServerHelpers.ts
39
39
  import { parseArgs } from "util";
40
40
  import { coerceRootPath } from "@cedarjs/fastify-web/dist/helpers.js";
41
+ function isCustomLoggerInstance(logger) {
42
+ return !!logger && typeof logger === "object" && "info" in logger;
43
+ }
41
44
  function resolveOptions(options = {}, args) {
42
45
  options.parseArgs ??= true;
43
46
  const defaults = getDefaultCreateServerOptions();
44
- options.logger ??= defaults.logger;
47
+ const logger = options.logger ?? defaults.logger;
45
48
  const resolvedOptions = {
46
49
  apiRootPath: options.apiRootPath ?? defaults.apiRootPath,
47
50
  fastifyServerOptions: options.fastifyServerOptions ?? {
48
51
  requestTimeout: defaults.fastifyServerOptions.requestTimeout,
49
- logger: options.logger ?? defaults.logger,
50
52
  bodyLimit: defaults.fastifyServerOptions.bodyLimit
51
53
  },
52
54
  discoverFunctionsGlob: options.discoverFunctionsGlob ?? defaults.discoverFunctionsGlob,
@@ -55,7 +57,11 @@ function resolveOptions(options = {}, args) {
55
57
  apiPort: options.apiPort ?? defaults.apiPort
56
58
  };
57
59
  resolvedOptions.fastifyServerOptions.requestTimeout ??= defaults.fastifyServerOptions.requestTimeout;
58
- resolvedOptions.fastifyServerOptions.logger = options.logger;
60
+ if (isCustomLoggerInstance(logger)) {
61
+ resolvedOptions.fastifyServerOptions.loggerInstance = logger;
62
+ } else {
63
+ resolvedOptions.fastifyServerOptions.logger = logger;
64
+ }
59
65
  if (options.parseArgs) {
60
66
  const { values } = parseArgs({
61
67
  options: {
package/dist/cjs/bin.js CHANGED
@@ -58,15 +58,17 @@ var init_cliHelpers = __esm({
58
58
  });
59
59
 
60
60
  // src/createServerHelpers.ts
61
+ function isCustomLoggerInstance(logger) {
62
+ return !!logger && typeof logger === "object" && "info" in logger;
63
+ }
61
64
  function resolveOptions(options = {}, args) {
62
65
  options.parseArgs ??= true;
63
66
  const defaults = getDefaultCreateServerOptions();
64
- options.logger ??= defaults.logger;
67
+ const logger = options.logger ?? defaults.logger;
65
68
  const resolvedOptions = {
66
69
  apiRootPath: options.apiRootPath ?? defaults.apiRootPath,
67
70
  fastifyServerOptions: options.fastifyServerOptions ?? {
68
71
  requestTimeout: defaults.fastifyServerOptions.requestTimeout,
69
- logger: options.logger ?? defaults.logger,
70
72
  bodyLimit: defaults.fastifyServerOptions.bodyLimit
71
73
  },
72
74
  discoverFunctionsGlob: options.discoverFunctionsGlob ?? defaults.discoverFunctionsGlob,
@@ -75,7 +77,11 @@ function resolveOptions(options = {}, args) {
75
77
  apiPort: options.apiPort ?? defaults.apiPort
76
78
  };
77
79
  resolvedOptions.fastifyServerOptions.requestTimeout ??= defaults.fastifyServerOptions.requestTimeout;
78
- resolvedOptions.fastifyServerOptions.logger = options.logger;
80
+ if (isCustomLoggerInstance(logger)) {
81
+ resolvedOptions.fastifyServerOptions.loggerInstance = logger;
82
+ } else {
83
+ resolvedOptions.fastifyServerOptions.logger = logger;
84
+ }
79
85
  if (options.parseArgs) {
80
86
  const { values } = (0, import_util.parseArgs)({
81
87
  options: {
@@ -7,7 +7,7 @@ export interface CreateServerOptions {
7
7
  /** The prefix for all routes. Defaults to `/` */
8
8
  apiRootPath?: string;
9
9
  /** Logger instance or options */
10
- logger?: FastifyServerOptions['logger'];
10
+ logger?: FastifyServerOptions['logger'] | FastifyServerOptions['loggerInstance'];
11
11
  /**
12
12
  * Options for the fastify server instance.
13
13
  * Omitting logger here because we move it up.
@@ -1 +1 @@
1
- {"version":3,"file":"createServerHelpers.d.ts","sourceRoot":"","sources":["../../src/createServerHelpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EAChB,MAAM,SAAS,CAAA;AAMhB,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;AAEtE,MAAM,WAAW,MAAO,SAAQ,eAAe;IAC7C,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACnD;AAED,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,iCAAiC;IACjC,MAAM,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IAEvC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAA;IAE3D;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAEzC,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7D,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,KAAK,0BAA0B,GAAG,QAAQ,CACxC,IAAI,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG;IAClD,oBAAoB,EAAE,oBAAoB,CAAA;CAC3C,CACF,CAAA;AAID,eAAO,MAAM,6BAA6B,EAAE,MAAM,0BAiB9C,CAAA;AAQJ,wBAAgB,cAAc,CAC5B,OAAO,GAAE,mBAAwB,EACjC,IAAI,CAAC,EAAE,MAAM,EAAE;0BANS,oBAAoB;GAgF7C"}
1
+ {"version":3,"file":"createServerHelpers.d.ts","sourceRoot":"","sources":["../../src/createServerHelpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EAChB,MAAM,SAAS,CAAA;AAMhB,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;AAEtE,MAAM,WAAW,MAAO,SAAQ,eAAe;IAC7C,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACnD;AAED,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IAGpB,iCAAiC;IACjC,MAAM,CAAC,EACH,oBAAoB,CAAC,QAAQ,CAAC,GAC9B,oBAAoB,CAAC,gBAAgB,CAAC,CAAA;IAE1C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAA;IAE3D;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAEzC,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7D,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,KAAK,0BAA0B,GAAG,QAAQ,CACxC,IAAI,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG;IAClD,oBAAoB,EAAE,oBAAoB,CAAA;CAC3C,CACF,CAAA;AAID,eAAO,MAAM,6BAA6B,EAAE,MAAM,0BAiB9C,CAAA;AAgBJ,wBAAgB,cAAc,CAC5B,OAAO,GAAE,mBAAwB,EACjC,IAAI,CAAC,EAAE,MAAM,EAAE;0BAdS,oBAAoB;GA4F7C"}
@@ -42,15 +42,17 @@ const getDefaultCreateServerOptions = () => ({
42
42
  apiHost: (0, import_cliHelpers.getAPIHost)(),
43
43
  apiPort: (0, import_cliHelpers.getAPIPort)()
44
44
  });
45
+ function isCustomLoggerInstance(logger) {
46
+ return !!logger && typeof logger === "object" && "info" in logger;
47
+ }
45
48
  function resolveOptions(options = {}, args) {
46
49
  options.parseArgs ??= true;
47
50
  const defaults = getDefaultCreateServerOptions();
48
- options.logger ??= defaults.logger;
51
+ const logger = options.logger ?? defaults.logger;
49
52
  const resolvedOptions = {
50
53
  apiRootPath: options.apiRootPath ?? defaults.apiRootPath,
51
54
  fastifyServerOptions: options.fastifyServerOptions ?? {
52
55
  requestTimeout: defaults.fastifyServerOptions.requestTimeout,
53
- logger: options.logger ?? defaults.logger,
54
56
  bodyLimit: defaults.fastifyServerOptions.bodyLimit
55
57
  },
56
58
  discoverFunctionsGlob: options.discoverFunctionsGlob ?? defaults.discoverFunctionsGlob,
@@ -59,7 +61,11 @@ function resolveOptions(options = {}, args) {
59
61
  apiPort: options.apiPort ?? defaults.apiPort
60
62
  };
61
63
  resolvedOptions.fastifyServerOptions.requestTimeout ??= defaults.fastifyServerOptions.requestTimeout;
62
- resolvedOptions.fastifyServerOptions.logger = options.logger;
64
+ if (isCustomLoggerInstance(logger)) {
65
+ resolvedOptions.fastifyServerOptions.loggerInstance = logger;
66
+ } else {
67
+ resolvedOptions.fastifyServerOptions.logger = logger;
68
+ }
63
69
  if (options.parseArgs) {
64
70
  const { values } = (0, import_util.parseArgs)({
65
71
  options: {
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/watch.ts"],"names":[],"mappings":"AAuEA;;;;GAIG;AACH,wBAAsB,UAAU,kBA6E/B"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/watch.ts"],"names":[],"mappings":"AAuEA;;;;GAIG;AACH,wBAAsB,UAAU,kBA+E/B"}
package/dist/cjs/watch.js CHANGED
@@ -252,12 +252,13 @@ async function validateSdls() {
252
252
  }
253
253
  }
254
254
  async function startWatch() {
255
+ const dbDir = await (0, import_project_config2.getDbDir)(cedarPaths.api.prismaConfig);
255
256
  const ignoredApiPaths = [
256
257
  // use this, because using cedarPaths.api.dist seems to not ignore on first
257
258
  // build
258
259
  "api/dist",
259
260
  cedarPaths.api.types,
260
- cedarPaths.api.db
261
+ dbDir
261
262
  ].map((path3) => (0, import_project_config2.ensurePosixPath)(path3));
262
263
  const ignoredExtensions = [
263
264
  ".DS_Store",
@@ -7,7 +7,7 @@ export interface CreateServerOptions {
7
7
  /** The prefix for all routes. Defaults to `/` */
8
8
  apiRootPath?: string;
9
9
  /** Logger instance or options */
10
- logger?: FastifyServerOptions['logger'];
10
+ logger?: FastifyServerOptions['logger'] | FastifyServerOptions['loggerInstance'];
11
11
  /**
12
12
  * Options for the fastify server instance.
13
13
  * Omitting logger here because we move it up.
@@ -1 +1 @@
1
- {"version":3,"file":"createServerHelpers.d.ts","sourceRoot":"","sources":["../src/createServerHelpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EAChB,MAAM,SAAS,CAAA;AAMhB,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;AAEtE,MAAM,WAAW,MAAO,SAAQ,eAAe;IAC7C,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACnD;AAED,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,iCAAiC;IACjC,MAAM,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IAEvC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAA;IAE3D;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAEzC,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7D,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,KAAK,0BAA0B,GAAG,QAAQ,CACxC,IAAI,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG;IAClD,oBAAoB,EAAE,oBAAoB,CAAA;CAC3C,CACF,CAAA;AAID,eAAO,MAAM,6BAA6B,EAAE,MAAM,0BAiB9C,CAAA;AAQJ,wBAAgB,cAAc,CAC5B,OAAO,GAAE,mBAAwB,EACjC,IAAI,CAAC,EAAE,MAAM,EAAE;0BANS,oBAAoB;GAgF7C"}
1
+ {"version":3,"file":"createServerHelpers.d.ts","sourceRoot":"","sources":["../src/createServerHelpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EAChB,MAAM,SAAS,CAAA;AAMhB,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;AAEtE,MAAM,WAAW,MAAO,SAAQ,eAAe;IAC7C,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACnD;AAED,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IAGpB,iCAAiC;IACjC,MAAM,CAAC,EACH,oBAAoB,CAAC,QAAQ,CAAC,GAC9B,oBAAoB,CAAC,gBAAgB,CAAC,CAAA;IAE1C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAA;IAE3D;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAEzC,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7D,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,KAAK,0BAA0B,GAAG,QAAQ,CACxC,IAAI,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG;IAClD,oBAAoB,EAAE,oBAAoB,CAAA;CAC3C,CACF,CAAA;AAID,eAAO,MAAM,6BAA6B,EAAE,MAAM,0BAiB9C,CAAA;AAgBJ,wBAAgB,cAAc,CAC5B,OAAO,GAAE,mBAAwB,EACjC,IAAI,CAAC,EAAE,MAAM,EAAE;0BAdS,oBAAoB;GA4F7C"}
@@ -18,15 +18,17 @@ const getDefaultCreateServerOptions = () => ({
18
18
  apiHost: getAPIHost(),
19
19
  apiPort: getAPIPort()
20
20
  });
21
+ function isCustomLoggerInstance(logger) {
22
+ return !!logger && typeof logger === "object" && "info" in logger;
23
+ }
21
24
  function resolveOptions(options = {}, args) {
22
25
  options.parseArgs ??= true;
23
26
  const defaults = getDefaultCreateServerOptions();
24
- options.logger ??= defaults.logger;
27
+ const logger = options.logger ?? defaults.logger;
25
28
  const resolvedOptions = {
26
29
  apiRootPath: options.apiRootPath ?? defaults.apiRootPath,
27
30
  fastifyServerOptions: options.fastifyServerOptions ?? {
28
31
  requestTimeout: defaults.fastifyServerOptions.requestTimeout,
29
- logger: options.logger ?? defaults.logger,
30
32
  bodyLimit: defaults.fastifyServerOptions.bodyLimit
31
33
  },
32
34
  discoverFunctionsGlob: options.discoverFunctionsGlob ?? defaults.discoverFunctionsGlob,
@@ -35,7 +37,11 @@ function resolveOptions(options = {}, args) {
35
37
  apiPort: options.apiPort ?? defaults.apiPort
36
38
  };
37
39
  resolvedOptions.fastifyServerOptions.requestTimeout ??= defaults.fastifyServerOptions.requestTimeout;
38
- resolvedOptions.fastifyServerOptions.logger = options.logger;
40
+ if (isCustomLoggerInstance(logger)) {
41
+ resolvedOptions.fastifyServerOptions.loggerInstance = logger;
42
+ } else {
43
+ resolvedOptions.fastifyServerOptions.logger = logger;
44
+ }
39
45
  if (options.parseArgs) {
40
46
  const { values } = parseArgs({
41
47
  options: {
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAuEA;;;;GAIG;AACH,wBAAsB,UAAU,kBA6E/B"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAuEA;;;;GAIG;AACH,wBAAsB,UAAU,kBA+E/B"}
package/dist/watch.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  rebuildApi
12
12
  } from "@cedarjs/internal/dist/build/api";
13
13
  import { loadAndValidateSdls } from "@cedarjs/internal/dist/validateSchema";
14
- import { ensurePosixPath, getPaths as getPaths2 } from "@cedarjs/project-config";
14
+ import { ensurePosixPath, getPaths as getPaths2, getDbDir } from "@cedarjs/project-config";
15
15
 
16
16
  // src/utils.ts
17
17
  function debounce(func, wait) {
@@ -223,12 +223,13 @@ async function validateSdls() {
223
223
  }
224
224
  }
225
225
  async function startWatch() {
226
+ const dbDir = await getDbDir(cedarPaths.api.prismaConfig);
226
227
  const ignoredApiPaths = [
227
228
  // use this, because using cedarPaths.api.dist seems to not ignore on first
228
229
  // build
229
230
  "api/dist",
230
231
  cedarPaths.api.types,
231
- cedarPaths.api.db
232
+ dbDir
232
233
  ].map((path3) => ensurePosixPath(path3));
233
234
  const ignoredExtensions = [
234
235
  ".DS_Store",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cedarjs/api-server",
3
- "version": "1.1.1-next.0+4e91c835e",
3
+ "version": "1.1.1-next.21+77cfbaa90",
4
4
  "description": "CedarJS's HTTP server for Serverless Functions",
5
5
  "repository": {
6
6
  "type": "git",
@@ -107,20 +107,20 @@
107
107
  "test:watch": "vitest watch"
108
108
  },
109
109
  "dependencies": {
110
- "@cedarjs/context": "1.1.1-next.0+4e91c835e",
111
- "@cedarjs/fastify-web": "1.1.1-next.0+4e91c835e",
112
- "@cedarjs/internal": "1.1.1-next.0+4e91c835e",
113
- "@cedarjs/project-config": "1.1.1-next.0+4e91c835e",
114
- "@cedarjs/web-server": "1.1.1-next.0+4e91c835e",
115
- "@fastify/multipart": "8.3.1",
116
- "@fastify/url-data": "5.4.0",
117
- "ansis": "4.1.0",
110
+ "@cedarjs/context": "1.1.1-next.21",
111
+ "@cedarjs/fastify-web": "1.1.1-next.21",
112
+ "@cedarjs/internal": "1.1.1-next.21",
113
+ "@cedarjs/project-config": "1.1.1-next.21",
114
+ "@cedarjs/web-server": "1.1.1-next.21",
115
+ "@fastify/multipart": "9.0.3",
116
+ "@fastify/url-data": "6.0.3",
117
+ "chalk": "4.1.2",
118
118
  "chokidar": "3.6.0",
119
119
  "dotenv-defaults": "5.0.2",
120
120
  "fast-glob": "3.3.3",
121
121
  "fast-json-parse": "1.0.3",
122
- "fastify": "4.28.1",
123
- "fastify-raw-body": "4.3.0",
122
+ "fastify": "5.4.0",
123
+ "fastify-raw-body": "5.0.0",
124
124
  "pretty-bytes": "5.6.0",
125
125
  "pretty-ms": "7.0.1",
126
126
  "qs": "6.13.0",
@@ -134,6 +134,7 @@
134
134
  "@types/qs": "6.9.16",
135
135
  "@types/split2": "4.2.3",
136
136
  "@types/yargs": "17.0.33",
137
+ "memfs": "4.17.2",
137
138
  "pino-abstract-transport": "1.2.0",
138
139
  "tsx": "4.20.5",
139
140
  "typescript": "5.9.2",
@@ -150,5 +151,5 @@
150
151
  "publishConfig": {
151
152
  "access": "public"
152
153
  },
153
- "gitHead": "4e91c835e7b5fc4fe1499b811415ff56041ae9bf"
154
+ "gitHead": "77cfbaa90a726923a763fb33b836638d94b2d431"
154
155
  }