@prosopo/provider 5.13.4 → 5.15.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/.turbo/turbo-build$colon$cjs.log +30 -30
- package/.turbo/turbo-build$colon$tsc.log +27 -30
- package/.turbo/turbo-build.log +30 -33
- package/CHANGELOG.md +233 -0
- package/LICENSE +201 -0
- package/dist/api/adminAuthOptions.d.ts +4 -0
- package/dist/api/adminAuthOptions.d.ts.map +1 -0
- package/dist/api/adminAuthOptions.js +34 -0
- package/dist/api/adminAuthOptions.js.map +1 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +2 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +11 -2
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +16 -11
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts +5 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts.map +1 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js +20 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js.map +1 -0
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js +24 -0
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts +4 -11
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.js +12 -17
- package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
- package/dist/api/detectorPoolBodyParser.d.ts +4 -0
- package/dist/api/detectorPoolBodyParser.d.ts.map +1 -0
- package/dist/api/detectorPoolBodyParser.js +31 -0
- package/dist/api/detectorPoolBodyParser.js.map +1 -0
- package/dist/api/domainMiddleware.d.ts.map +1 -1
- package/dist/api/domainMiddleware.js +5 -1
- package/dist/api/domainMiddleware.js.map +1 -1
- package/dist/api/metrics.d.ts +2 -1
- package/dist/api/metrics.d.ts.map +1 -1
- package/dist/api/metrics.js +46 -4
- package/dist/api/metrics.js.map +1 -1
- package/dist/api/rawTlsSignalsMiddleware.d.ts +14 -1
- package/dist/api/rawTlsSignalsMiddleware.d.ts.map +1 -1
- package/dist/api/rawTlsSignalsMiddleware.js +111 -23
- package/dist/api/rawTlsSignalsMiddleware.js.map +1 -1
- package/dist/api/startProviderApi.d.ts.map +1 -1
- package/dist/api/startProviderApi.js +8 -5
- package/dist/api/startProviderApi.js.map +1 -1
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +50 -8
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/adminAuthOptions.cjs +35 -0
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +10 -0
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +14 -8
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.cjs +20 -0
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +24 -0
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +10 -15
- package/dist/cjs/api/detectorPoolBodyParser.cjs +33 -0
- package/dist/cjs/api/domainMiddleware.cjs +5 -1
- package/dist/cjs/api/metrics.cjs +46 -3
- package/dist/cjs/api/rawTlsSignalsMiddleware.cjs +111 -22
- package/dist/cjs/api/startProviderApi.cjs +8 -5
- package/dist/cjs/api/verify.cjs +50 -8
- package/dist/cjs/compositeIpAddress.cjs +21 -7
- package/dist/cjs/tasks/captchaManager.cjs +15 -0
- package/dist/cjs/tasks/captchaTypeSelection.cjs +23 -2
- package/dist/cjs/tasks/client/clientTasks.cjs +25 -4
- package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +1 -1
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +26 -23
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +4 -11
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +7 -11
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +2 -0
- package/dist/cjs/tasks/puzzle/backgroundBuffer.cjs +3 -3
- package/dist/cjs/tasks/puzzle/nativeBackground.cjs +12 -5
- package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +4 -3
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +2 -9
- package/dist/cjs/utils/tarpitPadding.cjs +81 -10
- package/dist/compositeIpAddress.d.ts.map +1 -1
- package/dist/compositeIpAddress.js +21 -7
- package/dist/compositeIpAddress.js.map +1 -1
- package/dist/tasks/captchaManager.d.ts.map +1 -1
- package/dist/tasks/captchaManager.js +16 -1
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/captchaTypeSelection.d.ts +3 -1
- package/dist/tasks/captchaTypeSelection.d.ts.map +1 -1
- package/dist/tasks/captchaTypeSelection.js +23 -3
- package/dist/tasks/captchaTypeSelection.js.map +1 -1
- package/dist/tasks/client/clientTasks.d.ts +1 -0
- package/dist/tasks/client/clientTasks.d.ts.map +1 -1
- package/dist/tasks/client/clientTasks.js +25 -5
- package/dist/tasks/client/clientTasks.js.map +1 -1
- package/dist/tasks/dataset/datasetTasksUtils.js +1 -1
- package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts +3 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +28 -25
- package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
- package/dist/tasks/frictionless/routingMachine.d.ts +1 -2
- package/dist/tasks/frictionless/routingMachine.d.ts.map +1 -1
- package/dist/tasks/frictionless/routingMachine.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +4 -11
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.js +8 -12
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts +1 -0
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js +2 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
- package/dist/tasks/puzzle/backgroundBuffer.d.ts +3 -2
- package/dist/tasks/puzzle/backgroundBuffer.d.ts.map +1 -1
- package/dist/tasks/puzzle/backgroundBuffer.js +3 -3
- package/dist/tasks/puzzle/backgroundBuffer.js.map +1 -1
- package/dist/tasks/puzzle/nativeBackground.d.ts +5 -1
- package/dist/tasks/puzzle/nativeBackground.d.ts.map +1 -1
- package/dist/tasks/puzzle/nativeBackground.js +12 -5
- package/dist/tasks/puzzle/nativeBackground.js.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.d.ts +2 -0
- package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.js +4 -3
- package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js +2 -9
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js +2 -0
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
- package/dist/tests/unit/api/adminAuthOptions.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/adminAuthOptions.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/adminAuthOptions.unit.test.js +38 -0
- package/dist/tests/unit/api/adminAuthOptions.unit.test.js.map +1 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +35 -2
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js +45 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js.map +1 -0
- package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js +15 -1
- package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js.map +1 -1
- package/dist/tests/unit/api/detectorPoolBodyParser.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/detectorPoolBodyParser.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/detectorPoolBodyParser.unit.test.js +64 -0
- package/dist/tests/unit/api/detectorPoolBodyParser.unit.test.js.map +1 -0
- package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js +67 -0
- package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js.map +1 -0
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +174 -23
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
- package/dist/tests/unit/api/metricsAccess.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/metricsAccess.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/metricsAccess.unit.test.js +87 -0
- package/dist/tests/unit/api/metricsAccess.unit.test.js.map +1 -0
- package/dist/tests/unit/api/public.unit.test.js +4 -1
- package/dist/tests/unit/api/public.unit.test.js.map +1 -1
- package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js +96 -1
- package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js.map +1 -1
- package/dist/tests/unit/api/validateAddress.unit.test.js +1 -1
- package/dist/tests/unit/api/validateAddress.unit.test.js.map +1 -1
- package/dist/tests/unit/api/verifyBadDappSignature.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/verifyBadDappSignature.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/verifyBadDappSignature.unit.test.js +96 -0
- package/dist/tests/unit/api/verifyBadDappSignature.unit.test.js.map +1 -0
- package/dist/tests/unit/api/verifyMalformedToken.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/verifyMalformedToken.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/verifyMalformedToken.unit.test.js +89 -0
- package/dist/tests/unit/api/verifyMalformedToken.unit.test.js.map +1 -0
- package/dist/tests/unit/compositeIpAddress.unit.test.js +12 -3
- package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +51 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js +20 -1
- package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +33 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +14 -1
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js +94 -0
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js +103 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +23 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js +1 -4
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js +10 -3
- package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js +35 -0
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js +49 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js.map +1 -0
- package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +17 -14
- package/dist/tests/unit/testUtils/mockProviderEnv.d.ts.map +1 -1
- package/dist/tests/unit/testUtils/mockProviderEnv.js.map +1 -1
- package/dist/tests/unit/utils/tarpitPadding.unit.test.js +118 -36
- package/dist/tests/unit/utils/tarpitPadding.unit.test.js.map +1 -1
- package/dist/utils/tarpitPadding.d.ts.map +1 -1
- package/dist/utils/tarpitPadding.js +81 -10
- package/dist/utils/tarpitPadding.js.map +1 -1
- package/package.json +105 -103
|
@@ -1,39 +1,62 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
1
2
|
import { MAX_PAD_BYTES } from "@prosopo/types";
|
|
2
3
|
import { describe, expect, it, vi } from "vitest";
|
|
3
4
|
import { padResponseMiddleware } from "../../../utils/tarpitPadding.js";
|
|
4
|
-
const makeRes = (padBytes) => {
|
|
5
|
+
const makeRes = ({ padBytes, highWaterMark }) => {
|
|
5
6
|
const chunks = [];
|
|
6
7
|
const headers = {};
|
|
8
|
+
const emitter = new EventEmitter();
|
|
9
|
+
let written = 0;
|
|
7
10
|
let ended = false;
|
|
11
|
+
let destroyed = false;
|
|
8
12
|
const jsonMock = vi.fn();
|
|
9
|
-
const res = {
|
|
13
|
+
const res = Object.assign(emitter, {
|
|
10
14
|
locals: { padBytes },
|
|
11
15
|
json: jsonMock,
|
|
16
|
+
get writableEnded() {
|
|
17
|
+
return ended;
|
|
18
|
+
},
|
|
19
|
+
get destroyed() {
|
|
20
|
+
return destroyed;
|
|
21
|
+
},
|
|
12
22
|
setHeader: (name, value) => {
|
|
13
23
|
headers[name.toLowerCase()] = value;
|
|
14
24
|
},
|
|
15
25
|
write: (chunk) => {
|
|
16
26
|
chunks.push(chunk);
|
|
17
|
-
|
|
27
|
+
written += chunk.length;
|
|
28
|
+
return highWaterMark === undefined || written < highWaterMark;
|
|
18
29
|
},
|
|
19
30
|
end: () => {
|
|
20
31
|
ended = true;
|
|
21
32
|
return res;
|
|
22
33
|
},
|
|
23
|
-
|
|
34
|
+
destroy: () => {
|
|
35
|
+
destroyed = true;
|
|
36
|
+
},
|
|
37
|
+
});
|
|
24
38
|
return {
|
|
25
39
|
res,
|
|
40
|
+
emitter,
|
|
26
41
|
body: () => chunks.join(""),
|
|
42
|
+
written: () => written,
|
|
27
43
|
jsonMock,
|
|
28
44
|
headers,
|
|
29
45
|
ended: () => ended,
|
|
46
|
+
destroyed: () => destroyed,
|
|
47
|
+
close: () => {
|
|
48
|
+
destroyed = true;
|
|
49
|
+
emitter.emit("close");
|
|
50
|
+
},
|
|
30
51
|
};
|
|
31
52
|
};
|
|
32
|
-
const
|
|
53
|
+
const flush = () => new Promise((resolve) => setImmediate(resolve));
|
|
54
|
+
const send = async (fake, body) => {
|
|
33
55
|
const next = vi.fn();
|
|
34
56
|
padResponseMiddleware({}, fake.res, next);
|
|
35
57
|
expect(next).toHaveBeenCalled();
|
|
36
58
|
fake.res.json(body);
|
|
59
|
+
await flush();
|
|
37
60
|
};
|
|
38
61
|
const CHALLENGE = {
|
|
39
62
|
status: "ok",
|
|
@@ -41,59 +64,118 @@ const CHALLENGE = {
|
|
|
41
64
|
difficulty: 9,
|
|
42
65
|
timestamp: "1764000000000",
|
|
43
66
|
};
|
|
67
|
+
const padOf = (parsed) => Object.entries(parsed)
|
|
68
|
+
.filter(([key]) => !(key in CHALLENGE))
|
|
69
|
+
.map(([, value]) => String(value));
|
|
44
70
|
describe("padResponseMiddleware", () => {
|
|
45
|
-
it("leaves the response untouched when no padding was resolved", () => {
|
|
46
|
-
const fake = makeRes(undefined);
|
|
47
|
-
send(fake, CHALLENGE);
|
|
71
|
+
it("leaves the response untouched when no padding was resolved", async () => {
|
|
72
|
+
const fake = makeRes({ padBytes: undefined });
|
|
73
|
+
await send(fake, CHALLENGE);
|
|
48
74
|
expect(fake.jsonMock).toHaveBeenCalledWith(CHALLENGE);
|
|
49
75
|
expect(fake.body()).toBe("");
|
|
50
76
|
});
|
|
51
|
-
it("leaves the response untouched for a zero or negative padBytes", () => {
|
|
77
|
+
it("leaves the response untouched for a zero or negative padBytes", async () => {
|
|
52
78
|
for (const padBytes of [0, -1]) {
|
|
53
|
-
const fake = makeRes(padBytes);
|
|
54
|
-
send(fake, CHALLENGE);
|
|
79
|
+
const fake = makeRes({ padBytes });
|
|
80
|
+
await send(fake, CHALLENGE);
|
|
55
81
|
expect(fake.jsonMock).toHaveBeenCalledWith(CHALLENGE);
|
|
56
82
|
expect(fake.body()).toBe("");
|
|
57
83
|
}
|
|
58
84
|
});
|
|
59
|
-
it("
|
|
60
|
-
const fake = makeRes(4096);
|
|
61
|
-
send(fake, CHALLENGE);
|
|
85
|
+
it("emits the requested total padding and keeps every real field", async () => {
|
|
86
|
+
const fake = makeRes({ padBytes: 4096 });
|
|
87
|
+
await send(fake, CHALLENGE);
|
|
62
88
|
expect(fake.jsonMock).not.toHaveBeenCalled();
|
|
63
89
|
const parsed = JSON.parse(fake.body());
|
|
64
|
-
expect(parsed.pad).toHaveLength(4096);
|
|
65
90
|
expect(parsed).toMatchObject(CHALLENGE);
|
|
91
|
+
expect(padOf(parsed).join("")).toHaveLength(4096);
|
|
66
92
|
expect(fake.headers["content-type"]).toBe("application/json; charset=utf-8");
|
|
67
93
|
expect(fake.ended()).toBe(true);
|
|
68
94
|
});
|
|
69
|
-
it("
|
|
70
|
-
const fake = makeRes(
|
|
71
|
-
send(fake, CHALLENGE);
|
|
95
|
+
it("interleaves the padding so no real field arrives before some of it", async () => {
|
|
96
|
+
const fake = makeRes({ padBytes: 4096 });
|
|
97
|
+
await send(fake, CHALLENGE);
|
|
72
98
|
const body = fake.body();
|
|
73
|
-
|
|
74
|
-
|
|
99
|
+
const parsed = JSON.parse(fake.body());
|
|
100
|
+
const pads = padOf(parsed);
|
|
101
|
+
expect(pads).toHaveLength(Object.keys(CHALLENGE).length);
|
|
102
|
+
for (const field of Object.keys(CHALLENGE)) {
|
|
103
|
+
expect(body.indexOf(`"${field}"`)).toBeGreaterThan(0);
|
|
104
|
+
}
|
|
105
|
+
const lastPad = pads[pads.length - 1] ?? "";
|
|
106
|
+
expect(body.indexOf('"timestamp"')).toBeGreaterThan(4096 - lastPad.length);
|
|
75
107
|
});
|
|
76
|
-
it("
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
108
|
+
it("uses unpredictable pad keys rather than a fixed marker", async () => {
|
|
109
|
+
const keysFor = async () => {
|
|
110
|
+
const fake = makeRes({ padBytes: 512 });
|
|
111
|
+
await send(fake, CHALLENGE);
|
|
112
|
+
const parsed = JSON.parse(fake.body());
|
|
113
|
+
return Object.keys(parsed).filter((key) => !(key in CHALLENGE));
|
|
114
|
+
};
|
|
115
|
+
const first = await keysFor();
|
|
116
|
+
const second = await keysFor();
|
|
117
|
+
expect(first).not.toContain("pad");
|
|
118
|
+
expect(first).not.toEqual(second);
|
|
81
119
|
});
|
|
82
|
-
it("
|
|
83
|
-
const fake = makeRes(
|
|
84
|
-
send(fake, CHALLENGE);
|
|
85
|
-
|
|
120
|
+
it("pads with incompressible bytes", async () => {
|
|
121
|
+
const fake = makeRes({ padBytes: 8192 });
|
|
122
|
+
await send(fake, CHALLENGE);
|
|
123
|
+
const parsed = JSON.parse(fake.body());
|
|
124
|
+
expect(new Set(padOf(parsed).join("")).size).toBeGreaterThan(50);
|
|
125
|
+
});
|
|
126
|
+
it("clamps padding to the 5 MiB ceiling so it cannot be used as an amplifier", async () => {
|
|
127
|
+
const fake = makeRes({ padBytes: MAX_PAD_BYTES * 10 });
|
|
128
|
+
await send(fake, CHALLENGE);
|
|
129
|
+
const parsed = JSON.parse(fake.body());
|
|
130
|
+
expect(padOf(parsed).join("")).toHaveLength(MAX_PAD_BYTES);
|
|
86
131
|
});
|
|
87
|
-
it("emits valid JSON for a body with no fields", () => {
|
|
88
|
-
const fake = makeRes(64);
|
|
89
|
-
send(fake, {});
|
|
90
|
-
|
|
132
|
+
it("emits valid JSON for a body with no fields", async () => {
|
|
133
|
+
const fake = makeRes({ padBytes: 64 });
|
|
134
|
+
await send(fake, {});
|
|
135
|
+
const parsed = JSON.parse(fake.body());
|
|
136
|
+
expect(padOf(parsed).join("")).toHaveLength(64);
|
|
91
137
|
});
|
|
92
|
-
it("does not pad a non-object body, which has no fields to splice into", () => {
|
|
93
|
-
const fake = makeRes(64);
|
|
94
|
-
send(fake, ["a", "b"]);
|
|
138
|
+
it("does not pad a non-object body, which has no fields to splice into", async () => {
|
|
139
|
+
const fake = makeRes({ padBytes: 64 });
|
|
140
|
+
await send(fake, ["a", "b"]);
|
|
95
141
|
expect(fake.jsonMock).toHaveBeenCalledWith(["a", "b"]);
|
|
96
142
|
expect(fake.body()).toBe("");
|
|
97
143
|
});
|
|
144
|
+
it("stops writing once the socket reports backpressure and resumes on drain", async () => {
|
|
145
|
+
const fake = makeRes({ padBytes: 512 * 1024, highWaterMark: 64 * 1024 });
|
|
146
|
+
await send(fake, CHALLENGE);
|
|
147
|
+
const paused = fake.written();
|
|
148
|
+
expect(paused).toBeLessThan(128 * 1024);
|
|
149
|
+
expect(fake.ended()).toBe(false);
|
|
150
|
+
fake.emitter.emit("drain");
|
|
151
|
+
await flush();
|
|
152
|
+
expect(fake.written()).toBeGreaterThan(paused);
|
|
153
|
+
});
|
|
154
|
+
it("abandons the pad when the peer stops reading, instead of buffering it", async () => {
|
|
155
|
+
const fake = makeRes({
|
|
156
|
+
padBytes: MAX_PAD_BYTES,
|
|
157
|
+
highWaterMark: 64 * 1024,
|
|
158
|
+
});
|
|
159
|
+
await send(fake, CHALLENGE);
|
|
160
|
+
const paused = fake.written();
|
|
161
|
+
fake.close();
|
|
162
|
+
await flush();
|
|
163
|
+
expect(fake.written()).toBe(paused);
|
|
164
|
+
expect(fake.written()).toBeLessThan(128 * 1024);
|
|
165
|
+
expect(fake.ended()).toBe(false);
|
|
166
|
+
});
|
|
167
|
+
it("does not resume writing after a drain that follows a close", async () => {
|
|
168
|
+
const fake = makeRes({
|
|
169
|
+
padBytes: MAX_PAD_BYTES,
|
|
170
|
+
highWaterMark: 64 * 1024,
|
|
171
|
+
});
|
|
172
|
+
await send(fake, CHALLENGE);
|
|
173
|
+
fake.close();
|
|
174
|
+
await flush();
|
|
175
|
+
const paused = fake.written();
|
|
176
|
+
fake.emitter.emit("drain");
|
|
177
|
+
await flush();
|
|
178
|
+
expect(fake.written()).toBe(paused);
|
|
179
|
+
});
|
|
98
180
|
});
|
|
99
181
|
//# sourceMappingURL=tarpitPadding.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tarpitPadding.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/utils/tarpitPadding.unit.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"tarpitPadding.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/utils/tarpitPadding.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tarpitPadding.d.ts","sourceRoot":"","sources":["../../src/utils/tarpitPadding.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"tarpitPadding.d.ts","sourceRoot":"","sources":["../../src/utils/tarpitPadding.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAgH/D,eAAO,MAAM,qBAAqB,SAC3B,OAAO,OACR,QAAQ,QACP,YAAY,KAChB,IAkBF,CAAC"}
|
|
@@ -2,22 +2,93 @@ import { MAX_PAD_BYTES } from "@prosopo/types";
|
|
|
2
2
|
import { randomBytes } from "node:crypto";
|
|
3
3
|
//#region src/utils/tarpitPadding.ts
|
|
4
4
|
var POOL = randomBytes(Math.ceil(MAX_PAD_BYTES * 3 / 4)).toString("base64");
|
|
5
|
+
var CHUNK_BYTES = 64 * 1024;
|
|
6
|
+
var KEY_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
7
|
+
var MIN_KEY_LENGTH = 3;
|
|
8
|
+
var MAX_KEY_LENGTH = 12;
|
|
5
9
|
var clampPadBytes = (padBytes) => padBytes && padBytes > 0 ? Math.min(Math.floor(padBytes), MAX_PAD_BYTES) : 0;
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
const
|
|
10
|
+
var isPlainObject = (body) => typeof body === "object" && body !== null && !Array.isArray(body);
|
|
11
|
+
var bodyMembers = (body) => {
|
|
12
|
+
const serialised = JSON.stringify(body);
|
|
13
|
+
if (serialised === void 0 || !serialised.startsWith("{")) return void 0;
|
|
14
|
+
const normalised = JSON.parse(serialised);
|
|
15
|
+
return Object.entries(normalised).map(([key, value]) => ({
|
|
16
|
+
key,
|
|
17
|
+
encoded: `${JSON.stringify(key)}:${JSON.stringify(value)}`
|
|
18
|
+
}));
|
|
19
|
+
};
|
|
20
|
+
var randomKey = (taken) => {
|
|
21
|
+
for (;;) {
|
|
22
|
+
const length = MIN_KEY_LENGTH + Math.floor(Math.random() * (MAX_KEY_LENGTH - MIN_KEY_LENGTH + 1));
|
|
23
|
+
let key = "";
|
|
24
|
+
for (let index = 0; index < length; index++) key += KEY_ALPHABET.charAt(Math.floor(Math.random() * KEY_ALPHABET.length));
|
|
25
|
+
if (!taken.has(key)) {
|
|
26
|
+
taken.add(key);
|
|
27
|
+
return key;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
var partition = (total, parts) => {
|
|
32
|
+
const cuts = [0, total];
|
|
33
|
+
for (let index = 1; index < parts; index++) cuts.push(Math.floor(Math.random() * (total + 1)));
|
|
34
|
+
cuts.sort((a, b) => a - b);
|
|
35
|
+
const sizes = [];
|
|
36
|
+
for (let index = 1; index < cuts.length; index++) sizes.push((cuts[index] ?? 0) - (cuts[index - 1] ?? 0));
|
|
37
|
+
return sizes;
|
|
38
|
+
};
|
|
39
|
+
var awaitDrain = (res) => new Promise((resolve) => {
|
|
40
|
+
const settle = (drained) => {
|
|
41
|
+
res.removeListener("drain", onDrain);
|
|
42
|
+
res.removeListener("close", onClose);
|
|
43
|
+
resolve(drained);
|
|
44
|
+
};
|
|
45
|
+
const onDrain = () => settle(true);
|
|
46
|
+
const onClose = () => settle(false);
|
|
47
|
+
res.once("drain", onDrain);
|
|
48
|
+
res.once("close", onClose);
|
|
49
|
+
});
|
|
50
|
+
var write = async (res, chunk) => {
|
|
51
|
+
if (res.writableEnded || res.destroyed) return false;
|
|
52
|
+
return res.write(chunk) ? true : await awaitDrain(res);
|
|
53
|
+
};
|
|
54
|
+
var writePad = async (res, size) => {
|
|
55
|
+
const offset = Math.floor(Math.random() * (POOL.length - size + 1));
|
|
56
|
+
for (let written = 0; written < size; written += CHUNK_BYTES) {
|
|
57
|
+
const from = offset + written;
|
|
58
|
+
const to = offset + Math.min(written + CHUNK_BYTES, size);
|
|
59
|
+
if (!await write(res, POOL.slice(from, to))) return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
};
|
|
63
|
+
var streamWithPad = async (res, members, total) => {
|
|
64
|
+
const segments = Math.max(members.length, 1);
|
|
65
|
+
const sizes = partition(total, segments);
|
|
66
|
+
const taken = new Set(members.map((member) => member.key));
|
|
9
67
|
res.setHeader("content-type", "application/json; charset=utf-8");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
68
|
+
let separator = "{";
|
|
69
|
+
for (let index = 0; index < segments; index++) {
|
|
70
|
+
if (!await write(res, `${separator}"${randomKey(taken)}":"`)) return;
|
|
71
|
+
if (!await writePad(res, sizes[index] ?? 0)) return;
|
|
72
|
+
const member = members[index];
|
|
73
|
+
if (!await write(res, member ? `",${member.encoded}` : "\"")) return;
|
|
74
|
+
separator = ",";
|
|
75
|
+
}
|
|
76
|
+
if (!await write(res, "}")) return;
|
|
77
|
+
res.end();
|
|
14
78
|
};
|
|
15
|
-
var isPlainObject = (body) => typeof body === "object" && body !== null && !Array.isArray(body);
|
|
16
79
|
var padResponseMiddleware = (_req, res, next) => {
|
|
17
80
|
const originalJson = res.json.bind(res);
|
|
18
81
|
res.json = (body) => {
|
|
19
|
-
const
|
|
20
|
-
|
|
82
|
+
const total = clampPadBytes(res.locals.padBytes);
|
|
83
|
+
if (total === 0 || !isPlainObject(body)) return originalJson(body);
|
|
84
|
+
const members = bodyMembers(body);
|
|
85
|
+
if (members === void 0) return originalJson(body);
|
|
86
|
+
const swallow = () => void 0;
|
|
87
|
+
res.on("error", swallow);
|
|
88
|
+
streamWithPad(res, members, total).catch(() => {
|
|
89
|
+
if (!res.destroyed) res.destroy();
|
|
90
|
+
}).finally(() => res.removeListener("error", swallow));
|
|
91
|
+
return res;
|
|
21
92
|
};
|
|
22
93
|
next();
|
|
23
94
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tarpitPadding.js","sourceRoot":"","sources":["../../src/utils/tarpitPadding.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAEhF,MAAM,aAAa,GAAG,CAAC,QAA4B,EAAU,EAAE,CAC9D,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9E,MAAM,aAAa,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"tarpitPadding.js","sourceRoot":"","sources":["../../src/utils/tarpitPadding.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,104 +1,106 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
2
|
+
"name": "@prosopo/provider",
|
|
3
|
+
"version": "5.15.0",
|
|
4
|
+
"author": "PROSOPO LIMITED <info@prosopo.io>",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": "^24"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@noble/hashes": "2.4.0",
|
|
12
|
+
"@polkadot/util": "14.0.3",
|
|
13
|
+
"@prosopo/api": "4.4.0",
|
|
14
|
+
"@prosopo/api-express-router": "3.2.1",
|
|
15
|
+
"@prosopo/api-route": "2.6.63",
|
|
16
|
+
"@prosopo/captcha-severity": "1.2.0",
|
|
17
|
+
"@prosopo/common": "3.1.62",
|
|
18
|
+
"@prosopo/database": "4.1.4",
|
|
19
|
+
"@prosopo/datasets": "3.2.1",
|
|
20
|
+
"@prosopo/env": "3.6.69",
|
|
21
|
+
"@prosopo/ipinfo": "0.4.14",
|
|
22
|
+
"@prosopo/keyring": "2.10.1",
|
|
23
|
+
"@prosopo/load-balancer": "2.11.5",
|
|
24
|
+
"@prosopo/locale": "3.7.0",
|
|
25
|
+
"@prosopo/logger": "2.1.3",
|
|
26
|
+
"@prosopo/native-ja4": "0.0.7",
|
|
27
|
+
"@prosopo/native-merkle": "0.0.6",
|
|
28
|
+
"@prosopo/native-puzzle": "0.1.0",
|
|
29
|
+
"@prosopo/puzzle-assets": "0.2.0",
|
|
30
|
+
"@prosopo/redis-client": "1.0.40",
|
|
31
|
+
"@prosopo/types": "5.13.0",
|
|
32
|
+
"@prosopo/types-database": "5.8.0",
|
|
33
|
+
"@prosopo/types-env": "2.11.15",
|
|
34
|
+
"@prosopo/user-access-policy": "3.14.15",
|
|
35
|
+
"@prosopo/util": "3.3.14",
|
|
36
|
+
"@prosopo/util-crypto": "13.6.0",
|
|
37
|
+
"@prosopo/web-bot-auth": "0.1.3",
|
|
38
|
+
"cron": "3.1.7",
|
|
39
|
+
"express": "4.22.2",
|
|
40
|
+
"express-rate-limit": "7.4.0",
|
|
41
|
+
"geolib": "3.3.14",
|
|
42
|
+
"i18next": "26.4.2",
|
|
43
|
+
"ip-address": "10.7.0",
|
|
44
|
+
"mongoose": "9.10.0",
|
|
45
|
+
"prom-client": "15.1.3",
|
|
46
|
+
"uuid": "14.0.2",
|
|
47
|
+
"zod": "3.23.8"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@noble/curves": "2.4.0",
|
|
51
|
+
"@prosopo/config": "3.4.3",
|
|
52
|
+
"@types/cors": "2.8.19",
|
|
53
|
+
"@types/express": "4.17.25",
|
|
54
|
+
"@types/node": "22.5.5",
|
|
55
|
+
"@types/pg": "8.23.1",
|
|
56
|
+
"@types/uuid": "11.0.0",
|
|
57
|
+
"@vitest/coverage-v8": "4.1.11",
|
|
58
|
+
"@vitest/spy": "4.1.11",
|
|
59
|
+
"concurrently": "9.0.1",
|
|
60
|
+
"cors": "2.8.6",
|
|
61
|
+
"del-cli": "6.0.0",
|
|
62
|
+
"dotenv": "16.4.5",
|
|
63
|
+
"esbuild": "0.28.2",
|
|
64
|
+
"npm-run-all": "4.1.5",
|
|
65
|
+
"testcontainers": "12.1.0",
|
|
66
|
+
"tslib": "2.7.0",
|
|
67
|
+
"tsx": "4.20.3",
|
|
68
|
+
"typescript": "5.6.2",
|
|
69
|
+
"undici": "6.29.0",
|
|
70
|
+
"vite": "8.1.5",
|
|
71
|
+
"vitest": "4.1.11"
|
|
72
|
+
},
|
|
73
|
+
"repository": {
|
|
74
|
+
"type": "git",
|
|
75
|
+
"url": "git+https://github.com/prosopo/captcha.git",
|
|
76
|
+
"directory": "packages/provider"
|
|
77
|
+
},
|
|
78
|
+
"description": "The easiest way to deploy the Prosopo contract and run the Provider node is via the [captcha repository](https://github.com/prosopo/captcha/).",
|
|
79
|
+
"bugs": {
|
|
80
|
+
"url": "https://github.com/prosopo/captcha/issues"
|
|
81
|
+
},
|
|
82
|
+
"homepage": "https://github.com/prosopo/captcha#readme",
|
|
83
|
+
"sideEffects": false,
|
|
84
|
+
"main": "dist/index.js",
|
|
85
|
+
"types": "dist/index.d.ts",
|
|
86
|
+
"exports": {
|
|
87
|
+
".": {
|
|
88
|
+
"types": "./dist/index.d.ts",
|
|
89
|
+
"import": "./dist/index.js",
|
|
90
|
+
"require": "./dist/cjs/index.cjs"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"scripts": {
|
|
94
|
+
"clean": "del-cli --verbose dist tsconfig.tsbuildinfo",
|
|
95
|
+
"build": "pnpm run build:cross-env --mode ${NODE_ENV:-development}",
|
|
96
|
+
"build:cross-env": "vite build --config vite.esm.config.ts",
|
|
97
|
+
"build:tsc": "tsc --build --verbose",
|
|
98
|
+
"build:cjs": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
|
|
99
|
+
"build:edge": "node ./scripts/buildEdgeScript.mjs",
|
|
100
|
+
"typecheck": "tsc --project tsconfig.types.json",
|
|
101
|
+
"test:unit": "NODE_ENV=${NODE_ENV:-test}; TEST_TYPE=unit pnpm exec vitest run --config ./vite.test.config.ts",
|
|
102
|
+
"test:integration": "NODE_ENV=${NODE_ENV:-test}; TEST_TYPE=integration DECISION_MACHINE_ARTIFACT_CACHE_TTL_MS=1 pnpm exec vitest run --config ./vite.threads.test.config.ts",
|
|
103
|
+
"test": "pnpm run test:unit && pnpm run test:integration",
|
|
104
|
+
"mnemonic": "tsx ./scripts/generateMnemonic.ts"
|
|
105
|
+
}
|
|
106
|
+
}
|