@syngrisi/syngrisi 2.2.26-alpha.0 → 2.2.27-alpha.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/dist/server/api-docs/openAPIDocumentGenerator.js +30 -27
- package/dist/server/api-docs/openAPIDocumentGenerator.js.map +1 -1
- package/dist/server/api-docs/openAPIRouter.js +30 -27
- package/dist/server/api-docs/openAPIRouter.js.map +1 -1
- package/dist/server/app.js +44 -42
- package/dist/server/app.js.map +1 -1
- package/dist/server/config.js +2 -2
- package/dist/server/config.js.map +1 -1
- package/dist/server/controllers/app.controller.js +2 -2
- package/dist/server/controllers/app.controller.js.map +1 -1
- package/dist/server/controllers/auth.controller.js +2 -2
- package/dist/server/controllers/auth.controller.js.map +1 -1
- package/dist/server/controllers/baseline.controller.js +2 -2
- package/dist/server/controllers/baseline.controller.js.map +1 -1
- package/dist/server/controllers/check.controller.js +17 -16
- package/dist/server/controllers/check.controller.js.map +1 -1
- package/dist/server/controllers/client.controller.js +16 -15
- package/dist/server/controllers/client.controller.js.map +1 -1
- package/dist/server/controllers/index.js +28 -25
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/logs.controller.js +2 -2
- package/dist/server/controllers/logs.controller.js.map +1 -1
- package/dist/server/controllers/runs.controller.js +17 -16
- package/dist/server/controllers/runs.controller.js.map +1 -1
- package/dist/server/controllers/settings.controller.js +1 -1
- package/dist/server/controllers/settings.controller.js.map +1 -1
- package/dist/server/controllers/snapshots.controller.js +2 -2
- package/dist/server/controllers/snapshots.controller.js.map +1 -1
- package/dist/server/controllers/suite.controller.js +17 -16
- package/dist/server/controllers/suite.controller.js.map +1 -1
- package/dist/server/controllers/tasks.controller.js +13 -12
- package/dist/server/controllers/tasks.controller.js.map +1 -1
- package/dist/server/controllers/test.controller.js +17 -16
- package/dist/server/controllers/test.controller.js.map +1 -1
- package/dist/server/controllers/users.controller.js +2 -2
- package/dist/server/controllers/users.controller.js.map +1 -1
- package/dist/server/envConfig.js +1 -1
- package/dist/server/envConfig.js.map +1 -1
- package/dist/server/lib/AppSettings/AppSettings.js +1 -1
- package/dist/server/lib/AppSettings/AppSettings.js.map +1 -1
- package/dist/server/lib/AppSettings/index.js +1 -1
- package/dist/server/lib/AppSettings/index.js.map +1 -1
- package/dist/server/lib/connectDb.js +2 -2
- package/dist/server/lib/connectDb.js.map +1 -1
- package/dist/server/lib/dbItems/createAppIfNotExist.js +2 -2
- package/dist/server/lib/dbItems/createAppIfNotExist.js.map +1 -1
- package/dist/server/lib/dbItems/createItemIfNotExist.js +2 -2
- package/dist/server/lib/dbItems/createItemIfNotExist.js.map +1 -1
- package/dist/server/lib/dbItems/createItemProm.js +2 -2
- package/dist/server/lib/dbItems/createItemProm.js.map +1 -1
- package/dist/server/lib/dbItems/createRunIfNotExist.js +2 -2
- package/dist/server/lib/dbItems/createRunIfNotExist.js.map +1 -1
- package/dist/server/lib/dbItems/createSuiteIfNotExist.js +2 -2
- package/dist/server/lib/dbItems/createSuiteIfNotExist.js.map +1 -1
- package/dist/server/lib/dbItems/createTest.js +2 -2
- package/dist/server/lib/dbItems/createTest.js.map +1 -1
- package/dist/server/lib/dbItems/createUser.js +2 -2
- package/dist/server/lib/dbItems/createUser.js.map +1 -1
- package/dist/server/lib/dbItems/index.js +2 -2
- package/dist/server/lib/dbItems/index.js.map +1 -1
- package/dist/server/lib/dbItems/updateItem.js +2 -2
- package/dist/server/lib/dbItems/updateItem.js.map +1 -1
- package/dist/server/lib/dbItems/updateItemDate.js +2 -2
- package/dist/server/lib/dbItems/updateItemDate.js.map +1 -1
- package/dist/server/lib/httpLogger.js +2 -2
- package/dist/server/lib/httpLogger.js.map +1 -1
- package/dist/server/lib/logger.js +2 -2
- package/dist/server/lib/logger.js.map +1 -1
- package/dist/server/lib/startup/createBasicUsers.js +2 -2
- package/dist/server/lib/startup/createBasicUsers.js.map +1 -1
- package/dist/server/lib/startup/createInitialSettings.js +1 -1
- package/dist/server/lib/startup/createInitialSettings.js.map +1 -1
- package/dist/server/lib/startup/createTempDir.js +2 -2
- package/dist/server/lib/startup/createTempDir.js.map +1 -1
- package/dist/server/lib/startup/createTestsUsers.js +2 -2
- package/dist/server/lib/startup/createTestsUsers.js.map +1 -1
- package/dist/server/lib/startup/index.js +2 -2
- package/dist/server/lib/startup/index.js.map +1 -1
- package/dist/server/lib//321/201omparison/comparator.js +2 -2
- package/dist/server/lib//321/201omparison/comparator.js.map +1 -1
- package/dist/server/lib//321/201omparison/index.js +2 -2
- package/dist/server/lib//321/201omparison/index.js.map +1 -1
- package/dist/server/middlewares/authorization.js +2 -2
- package/dist/server/middlewares/authorization.js.map +1 -1
- package/dist/server/middlewares/disableCors.js +2 -2
- package/dist/server/middlewares/disableCors.js.map +1 -1
- package/dist/server/middlewares/ensureLogin/ensureLoggedIn.js +2 -2
- package/dist/server/middlewares/ensureLogin/ensureLoggedIn.js.map +1 -1
- package/dist/server/middlewares/ensureLogin/index.js +2 -2
- package/dist/server/middlewares/ensureLogin/index.js.map +1 -1
- package/dist/server/middlewares/errorHandler.js +2 -2
- package/dist/server/middlewares/errorHandler.js.map +1 -1
- package/dist/server/middlewares/index.js +2 -2
- package/dist/server/middlewares/index.js.map +1 -1
- package/dist/server/routes/ui/admin.js +2 -2
- package/dist/server/routes/ui/admin.js.map +1 -1
- package/dist/server/routes/ui/index.js +2 -2
- package/dist/server/routes/ui/index.js.map +1 -1
- package/dist/server/routes/v1/app.route.js +30 -27
- package/dist/server/routes/v1/app.route.js.map +1 -1
- package/dist/server/routes/v1/auth.route.js +2 -2
- package/dist/server/routes/v1/auth.route.js.map +1 -1
- package/dist/server/routes/v1/baselines.route.js +2 -2
- package/dist/server/routes/v1/baselines.route.js.map +1 -1
- package/dist/server/routes/v1/checks.route.js +19 -18
- package/dist/server/routes/v1/checks.route.js.map +1 -1
- package/dist/server/routes/v1/client.route.js +18 -17
- package/dist/server/routes/v1/client.route.js.map +1 -1
- package/dist/server/routes/v1/index.route.js +30 -27
- package/dist/server/routes/v1/index.route.js.map +1 -1
- package/dist/server/routes/v1/logs.route.js +2 -2
- package/dist/server/routes/v1/logs.route.js.map +1 -1
- package/dist/server/routes/v1/runs.route.js +19 -18
- package/dist/server/routes/v1/runs.route.js.map +1 -1
- package/dist/server/routes/v1/settings.route.js +2 -2
- package/dist/server/routes/v1/settings.route.js.map +1 -1
- package/dist/server/routes/v1/snapshots.route.js +2 -2
- package/dist/server/routes/v1/snapshots.route.js.map +1 -1
- package/dist/server/routes/v1/suites.route.js +19 -18
- package/dist/server/routes/v1/suites.route.js.map +1 -1
- package/dist/server/routes/v1/tasks.route.js +15 -14
- package/dist/server/routes/v1/tasks.route.js.map +1 -1
- package/dist/server/routes/v1/test_distinct.route.js +19 -18
- package/dist/server/routes/v1/test_distinct.route.js.map +1 -1
- package/dist/server/routes/v1/tests.route.js +19 -18
- package/dist/server/routes/v1/tests.route.js.map +1 -1
- package/dist/server/routes/v1/users.route.js +30 -27
- package/dist/server/routes/v1/users.route.js.map +1 -1
- package/dist/server/server.js +44 -42
- package/dist/server/server.js.map +1 -1
- package/dist/server/server_old.js +44 -41
- package/dist/server/server_old.js.map +1 -1
- package/dist/server/services/auth.service.js +2 -2
- package/dist/server/services/auth.service.js.map +1 -1
- package/dist/server/services/check.service.js +17 -16
- package/dist/server/services/check.service.js.map +1 -1
- package/dist/server/services/client.service.js +16 -15
- package/dist/server/services/client.service.js.map +1 -1
- package/dist/server/services/generic.service.js +2 -2
- package/dist/server/services/generic.service.js.map +1 -1
- package/dist/server/services/index.js +28 -25
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/logs.service.js +2 -2
- package/dist/server/services/logs.service.js.map +1 -1
- package/dist/server/services/run.service.js +17 -16
- package/dist/server/services/run.service.js.map +1 -1
- package/dist/server/services/snapshot.service.js +17 -16
- package/dist/server/services/snapshot.service.js.map +1 -1
- package/dist/server/services/suite.service.js +17 -16
- package/dist/server/services/suite.service.js.map +1 -1
- package/dist/server/services/tasks.service.js +13 -12
- package/dist/server/services/tasks.service.js.map +1 -1
- package/dist/server/services/test.service.js +17 -16
- package/dist/server/services/test.service.js.map +1 -1
- package/dist/server/services/user.service.js +2 -2
- package/dist/server/services/user.service.js.map +1 -1
- package/dist/server/utils/validateRequest.js +2 -2
- package/dist/server/utils/validateRequest.js.map +1 -1
- package/dist/tasks/backup.js +2 -2
- package/dist/tasks/backup.js.map +1 -1
- package/dist/tasks/lib/utils.js +2 -2
- package/dist/tasks/lib/utils.js.map +1 -1
- package/dist/tasks/reindex.js +2 -2
- package/dist/tasks/reindex.js.map +1 -1
- package/dist/tasks/restore.js +2 -2
- package/dist/tasks/restore.js.map +1 -1
- package/package.json +3 -3
- package/src/server/app.ts +6 -7
- package/src/server/envConfig.ts +1 -1
- package/src/server/services/client.service.ts +7 -7
- package/src/server/services/snapshot.service.ts +8 -7
- package/src/server/services/tasks.service.ts +4 -3
|
@@ -248,12 +248,12 @@ var paginate = (schema) => {
|
|
|
248
248
|
var paginate_plugin_default = paginate;
|
|
249
249
|
|
|
250
250
|
// src/server/models/plugins/toJSON.plugin.ts
|
|
251
|
-
var deleteAtPath = (obj,
|
|
252
|
-
if (index ===
|
|
253
|
-
delete obj[
|
|
251
|
+
var deleteAtPath = (obj, path6, index) => {
|
|
252
|
+
if (index === path6.length - 1) {
|
|
253
|
+
delete obj[path6[index]];
|
|
254
254
|
return;
|
|
255
255
|
}
|
|
256
|
-
deleteAtPath(obj[
|
|
256
|
+
deleteAtPath(obj[path6[index]], path6, index + 1);
|
|
257
257
|
};
|
|
258
258
|
var toJSON = (schema) => {
|
|
259
259
|
let transform;
|
|
@@ -262,9 +262,9 @@ var toJSON = (schema) => {
|
|
|
262
262
|
}
|
|
263
263
|
schema.options.toJSON = Object.assign(schema.options.toJSON || {}, {
|
|
264
264
|
transform(doc, ret, options) {
|
|
265
|
-
Object.keys(schema.paths).forEach((
|
|
266
|
-
if (schema.paths[
|
|
267
|
-
deleteAtPath(ret,
|
|
265
|
+
Object.keys(schema.paths).forEach((path6) => {
|
|
266
|
+
if (schema.paths[path6].options && schema.paths[path6].options.private) {
|
|
267
|
+
deleteAtPath(ret, path6.split("."), 0);
|
|
268
268
|
}
|
|
269
269
|
});
|
|
270
270
|
ret.id = ret._id.toString();
|
|
@@ -915,7 +915,7 @@ var import_fs = __toESM(require("fs"));
|
|
|
915
915
|
var import_dotenv2 = __toESM(require("dotenv"));
|
|
916
916
|
|
|
917
917
|
// package.json
|
|
918
|
-
var version = "2.2.
|
|
918
|
+
var version = "2.2.26-alpha.0";
|
|
919
919
|
|
|
920
920
|
// src/server/config.ts
|
|
921
921
|
var import_crypto2 = __toESM(require("crypto"));
|
|
@@ -933,7 +933,7 @@ var env = (0, import_envalid.cleanEnv)(process.env, {
|
|
|
933
933
|
NODE_ENV: (0, import_envalid.str)({ choices: ["development", "production", "test"] }),
|
|
934
934
|
SYNGRISI_DB_URI: (0, import_envalid.str)({ default: "mongodb://127.0.0.1:27017/SyngrisiDb" }),
|
|
935
935
|
SYNGRISI_APP_PORT: (0, import_envalid.port)({ default: 3e3 }),
|
|
936
|
-
SYNGRISI_IMAGES_PATH: (0, import_envalid.str)({ default: "./.snapshots-images
|
|
936
|
+
SYNGRISI_IMAGES_PATH: (0, import_envalid.str)({ default: import_path.default.join(process.cwd(), "./.snapshots-images") }),
|
|
937
937
|
SYNGRISI_TMP_DIR: (0, import_envalid.str)({ default: import_path.default.join(process.cwd(), ".tmp") }),
|
|
938
938
|
SYNGRISI_HTTP_LOG: (0, import_envalid.bool)({ default: false }),
|
|
939
939
|
SYNGRISI_COVERAGE: (0, import_envalid.bool)({ default: false }),
|
|
@@ -2236,6 +2236,7 @@ var testAdmin_default = {
|
|
|
2236
2236
|
};
|
|
2237
2237
|
|
|
2238
2238
|
// src/server/services/tasks.service.ts
|
|
2239
|
+
var import_path3 = __toESM(require("path"));
|
|
2239
2240
|
var stringTable = import_string_table.default;
|
|
2240
2241
|
function taskOutput(msg, res) {
|
|
2241
2242
|
res.write(`${msg.toString()}
|
|
@@ -2314,7 +2315,7 @@ var task_handle_database_consistency = async (options, res) => {
|
|
|
2314
2315
|
taskOutput("---------------------------------", res);
|
|
2315
2316
|
taskOutput("STAGE #2: Calculate Inconsistent Items", res);
|
|
2316
2317
|
taskOutput("> calculate abandoned snapshots", res);
|
|
2317
|
-
const abandonedSnapshots = allSnapshotsBefore.filter((sn) => !import_fs2.default.existsSync(
|
|
2318
|
+
const abandonedSnapshots = allSnapshotsBefore.filter((sn) => !import_fs2.default.existsSync(import_path3.default.join(config.defaultImagesPath, sn.filename)));
|
|
2318
2319
|
taskOutput("> calculate abandoned files", res);
|
|
2319
2320
|
const snapshotsUniqueFiles = Array.from(new Set(allSnapshotsBefore.map((x) => x.filename)));
|
|
2320
2321
|
const abandonedFiles = [];
|
|
@@ -2391,7 +2392,7 @@ var task_handle_database_consistency = async (options, res) => {
|
|
|
2391
2392
|
taskOutput("> remove abandoned snapshots", res);
|
|
2392
2393
|
await Snapshot_model_default.deleteMany({ _id: { $in: abandonedSnapshots } });
|
|
2393
2394
|
taskOutput("> remove abandoned files", res);
|
|
2394
|
-
await Promise.all(abandonedFiles.map((filename) => import_fs2.promises.unlink(
|
|
2395
|
+
await Promise.all(abandonedFiles.map((filename) => import_fs2.promises.unlink(import_path3.default.join(config.defaultImagesPath, filename))));
|
|
2395
2396
|
const allFilesAfter = import_fs2.default.readdirSync(config.defaultImagesPath, { withFileTypes: true }).filter((item) => !item.isDirectory()).map((x) => x.name).filter((x) => x.includes(".png"));
|
|
2396
2397
|
taskOutput("STAGE #4: Calculate Common stats after cleaning", res);
|
|
2397
2398
|
taskOutput("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", res);
|
|
@@ -2541,7 +2542,7 @@ var task_handle_old_checks = async (options, res) => {
|
|
|
2541
2542
|
const filesToDelete = arrayDiff(oldSnapshotsUniqueFilenames, filesInterception);
|
|
2542
2543
|
taskOutput(`>> found: ${filesToDelete.length}`, res);
|
|
2543
2544
|
taskOutput(`>> remove these files: ${filesToDelete.length}`, res);
|
|
2544
|
-
await Promise.all(filesToDelete.map((filename) => import_fs2.promises.unlink(
|
|
2545
|
+
await Promise.all(filesToDelete.map((filename) => import_fs2.promises.unlink(import_path3.default.join(config.defaultImagesPath, filename))));
|
|
2545
2546
|
taskOutput(`>> done: ${filesToDelete.length}`, res);
|
|
2546
2547
|
taskOutput("STAGE #3 Calculate common stats after Removing", res);
|
|
2547
2548
|
taskOutput("> get all checks data", res);
|
|
@@ -2825,6 +2826,7 @@ async function getDiff(baselineOrigin, actualOrigin, opts = {}) {
|
|
|
2825
2826
|
// src/server/services/client.service.ts
|
|
2826
2827
|
var import_http_status3 = __toESM(require("http-status"));
|
|
2827
2828
|
var import_http_status4 = __toESM(require("http-status"));
|
|
2829
|
+
var import_path4 = __toESM(require("path"));
|
|
2828
2830
|
async function updateTest(id2, update4) {
|
|
2829
2831
|
const logOpts5 = {
|
|
2830
2832
|
scope: "updateTest",
|
|
@@ -2963,9 +2965,9 @@ async function createSnapshot(parameters) {
|
|
|
2963
2965
|
opts.imghash = hashCode || (0, import_hasha.default)(fileData);
|
|
2964
2966
|
const snapshot = new Snapshot_model_default(opts);
|
|
2965
2967
|
const filename = `${snapshot.id}.png`;
|
|
2966
|
-
const
|
|
2967
|
-
logger_default.debug(`save screenshot for: '${name}' snapshot to: '${
|
|
2968
|
-
await import_fs3.promises.writeFile(
|
|
2968
|
+
const imagePath = import_path4.default.join(config.defaultImagesPath, filename);
|
|
2969
|
+
logger_default.debug(`save screenshot for: '${name}' snapshot to: '${imagePath}'`, logOpts5);
|
|
2970
|
+
await import_fs3.promises.writeFile(imagePath, fileData);
|
|
2969
2971
|
snapshot.filename = filename;
|
|
2970
2972
|
await snapshot.save();
|
|
2971
2973
|
logger_default.debug(`snapshot was saved: '${JSON.stringify(snapshot)}'`, { ...logOpts5, ...{ ref: snapshot._id } });
|
|
@@ -3001,8 +3003,8 @@ async function compareSnapshots(baselineSnapshot, actual, opts = {}) {
|
|
|
3001
3003
|
getBuffer: null
|
|
3002
3004
|
};
|
|
3003
3005
|
} else {
|
|
3004
|
-
const baselinePath =
|
|
3005
|
-
const actualPath =
|
|
3006
|
+
const baselinePath = import_path4.default.join(config.defaultImagesPath, baselineSnapshot.filename);
|
|
3007
|
+
const actualPath = import_path4.default.join(config.defaultImagesPath, actual.filename);
|
|
3006
3008
|
const baselineData = await import_fs3.promises.readFile(baselinePath);
|
|
3007
3009
|
const actualData = await import_fs3.promises.readFile(actualPath);
|
|
3008
3010
|
logger_default.debug(`baseline path: ${baselinePath}`, logOpts5);
|
|
@@ -3075,7 +3077,7 @@ var prepareActualSnapshot = async (checkParam, snapshotFoundedByHashcode, logOpt
|
|
|
3075
3077
|
let currentSnapshot;
|
|
3076
3078
|
const fileData = checkParam.files ? checkParam.files.file.data : null;
|
|
3077
3079
|
if (snapshotFoundedByHashcode) {
|
|
3078
|
-
const fullFilename =
|
|
3080
|
+
const fullFilename = import_path4.default.join(config.defaultImagesPath, snapshotFoundedByHashcode.filename);
|
|
3079
3081
|
if (!import_fs3.default.existsSync(fullFilename)) {
|
|
3080
3082
|
throw new Error(`Couldn't find the baseline file: '${fullFilename}'`);
|
|
3081
3083
|
}
|
|
@@ -3381,6 +3383,7 @@ __export(check_service_exports, {
|
|
|
3381
3383
|
|
|
3382
3384
|
// src/server/services/snapshot.service.ts
|
|
3383
3385
|
var import_fs4 = __toESM(require("fs"));
|
|
3386
|
+
var import_path5 = __toESM(require("path"));
|
|
3384
3387
|
var logOpts3 = {
|
|
3385
3388
|
scope: "snapshot_helper",
|
|
3386
3389
|
msgType: "API"
|
|
@@ -3399,14 +3402,14 @@ var removeSnapshotFile = async (snapshot) => {
|
|
|
3399
3402
|
};
|
|
3400
3403
|
logger_default.debug({ isLastSnapshotFile: isLastSnapshotFile() });
|
|
3401
3404
|
if (isLastSnapshotFile()) {
|
|
3402
|
-
const
|
|
3403
|
-
logger_default.silly(`path: ${
|
|
3404
|
-
if (import_fs4.default.existsSync(
|
|
3405
|
-
logger_default.debug(`removing file: '${
|
|
3405
|
+
const imagePath = import_path5.default.join(config.defaultImagesPath, snapshot.filename);
|
|
3406
|
+
logger_default.silly(`path: ${imagePath}`, logOpts3);
|
|
3407
|
+
if (import_fs4.default.existsSync(imagePath)) {
|
|
3408
|
+
logger_default.debug(`removing file: '${imagePath}'`, logOpts3, {
|
|
3406
3409
|
msgType: "REMOVE",
|
|
3407
3410
|
itemType: "file"
|
|
3408
3411
|
});
|
|
3409
|
-
import_fs4.default.unlinkSync(
|
|
3412
|
+
import_fs4.default.unlinkSync(imagePath);
|
|
3410
3413
|
}
|
|
3411
3414
|
}
|
|
3412
3415
|
};
|
|
@@ -3435,8 +3438,8 @@ var remove4 = async (id2) => {
|
|
|
3435
3438
|
logger_default.debug(`snapshot: '${id2}' is not related to a baseline, attempting to remove it`, logOpts5);
|
|
3436
3439
|
await Snapshot_model_default.findByIdAndDelete(id2);
|
|
3437
3440
|
logger_default.debug(`snapshot: '${id2}' was removed`, logOpts5);
|
|
3438
|
-
const
|
|
3439
|
-
logger_default.debug(`attempting to remove snapshot file, id: '${snapshot._id}', filename: '${
|
|
3441
|
+
const imagePath = import_path5.default.join(config.defaultImagesPath, snapshot.filename);
|
|
3442
|
+
logger_default.debug(`attempting to remove snapshot file, id: '${snapshot._id}', filename: '${imagePath}'`, logOpts5);
|
|
3440
3443
|
await removeSnapshotFile(snapshot);
|
|
3441
3444
|
};
|
|
3442
3445
|
|
|
@@ -4421,9 +4424,9 @@ var logOpts4 = {
|
|
|
4421
4424
|
itemType: "type",
|
|
4422
4425
|
msgType: "VALIDATION"
|
|
4423
4426
|
};
|
|
4424
|
-
function getReceivedValueFromRequest(request,
|
|
4427
|
+
function getReceivedValueFromRequest(request, path6) {
|
|
4425
4428
|
let currentValue = request;
|
|
4426
|
-
|
|
4429
|
+
path6.forEach((segment) => {
|
|
4427
4430
|
currentValue = currentValue[segment];
|
|
4428
4431
|
});
|
|
4429
4432
|
return currentValue;
|