@monetizationos/proxy 1.0.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.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/MOSProxy.d.ts +43 -0
  4. package/dist/MOSProxy.js +140 -0
  5. package/dist/MOSProxy.js.map +1 -0
  6. package/dist/MOSProxyBuilder.d.ts +75 -0
  7. package/dist/MOSProxyBuilder.js +126 -0
  8. package/dist/MOSProxyBuilder.js.map +1 -0
  9. package/dist/adapters/ClientMetadataProvider.d.ts +12 -0
  10. package/dist/adapters/ClientMetadataProvider.js +2 -0
  11. package/dist/adapters/ClientMetadataProvider.js.map +1 -0
  12. package/dist/adapters/Fetcher.d.ts +10 -0
  13. package/dist/adapters/Fetcher.js +2 -0
  14. package/dist/adapters/Fetcher.js.map +1 -0
  15. package/dist/adapters/HtmlRewriterAdapter.d.ts +60 -0
  16. package/dist/adapters/HtmlRewriterAdapter.js +2 -0
  17. package/dist/adapters/HtmlRewriterAdapter.js.map +1 -0
  18. package/dist/adapters/index.d.ts +3 -0
  19. package/dist/adapters/index.js +2 -0
  20. package/dist/adapters/index.js.map +1 -0
  21. package/dist/apiRequestHeaders.d.ts +4 -0
  22. package/dist/apiRequestHeaders.js +11 -0
  23. package/dist/apiRequestHeaders.js.map +1 -0
  24. package/dist/config.d.ts +16 -0
  25. package/dist/config.js +39 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/context.d.ts +12 -0
  28. package/dist/context.js +2 -0
  29. package/dist/context.js.map +1 -0
  30. package/dist/http.d.ts +1 -0
  31. package/dist/http.js +3 -0
  32. package/dist/http.js.map +1 -0
  33. package/dist/index.d.ts +5 -0
  34. package/dist/index.js +3 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/logger.d.ts +13 -0
  37. package/dist/logger.js +14 -0
  38. package/dist/logger.js.map +1 -0
  39. package/dist/stages/ContentElementHandler.d.ts +9 -0
  40. package/dist/stages/ContentElementHandler.js +37 -0
  41. package/dist/stages/ContentElementHandler.js.map +1 -0
  42. package/dist/stages/buildReplacementHandlers.d.ts +14 -0
  43. package/dist/stages/buildReplacementHandlers.js +116 -0
  44. package/dist/stages/buildReplacementHandlers.js.map +1 -0
  45. package/dist/stages/customEndpoint.d.ts +3 -0
  46. package/dist/stages/customEndpoint.js +18 -0
  47. package/dist/stages/customEndpoint.js.map +1 -0
  48. package/dist/stages/elements.d.ts +5 -0
  49. package/dist/stages/elements.js +42 -0
  50. package/dist/stages/elements.js.map +1 -0
  51. package/dist/stages/fetchSurfaceDecisions.d.ts +25 -0
  52. package/dist/stages/fetchSurfaceDecisions.js +86 -0
  53. package/dist/stages/fetchSurfaceDecisions.js.map +1 -0
  54. package/dist/stages/findMarkerPositions.d.ts +21 -0
  55. package/dist/stages/findMarkerPositions.js +138 -0
  56. package/dist/stages/findMarkerPositions.js.map +1 -0
  57. package/dist/stages/getTargetUrl.d.ts +1 -0
  58. package/dist/stages/getTargetUrl.js +9 -0
  59. package/dist/stages/getTargetUrl.js.map +1 -0
  60. package/dist/stages/isRedirectResponse.d.ts +1 -0
  61. package/dist/stages/isRedirectResponse.js +4 -0
  62. package/dist/stages/isRedirectResponse.js.map +1 -0
  63. package/dist/stages/linkRewriting.d.ts +2 -0
  64. package/dist/stages/linkRewriting.js +37 -0
  65. package/dist/stages/linkRewriting.js.map +1 -0
  66. package/dist/stages/originRequest.d.ts +3 -0
  67. package/dist/stages/originRequest.js +10 -0
  68. package/dist/stages/originRequest.js.map +1 -0
  69. package/dist/stages/pageMetadata.d.ts +4 -0
  70. package/dist/stages/pageMetadata.js +25 -0
  71. package/dist/stages/pageMetadata.js.map +1 -0
  72. package/dist/stages/shouldIgnorePath.d.ts +2 -0
  73. package/dist/stages/shouldIgnorePath.js +9 -0
  74. package/dist/stages/shouldIgnorePath.js.map +1 -0
  75. package/dist/stages/surfaceBehavior.d.ts +4 -0
  76. package/dist/stages/surfaceBehavior.js +60 -0
  77. package/dist/stages/surfaceBehavior.js.map +1 -0
  78. package/dist/stages/surfaceComponents.d.ts +4 -0
  79. package/dist/stages/surfaceComponents.js +71 -0
  80. package/dist/stages/surfaceComponents.js.map +1 -0
  81. package/dist/stages/surfaceDecisions.d.ts +6 -0
  82. package/dist/stages/surfaceDecisions.js +59 -0
  83. package/dist/stages/surfaceDecisions.js.map +1 -0
  84. package/dist/stages/transformOriginLinks.d.ts +1 -0
  85. package/dist/stages/transformOriginLinks.js +14 -0
  86. package/dist/stages/transformOriginLinks.js.map +1 -0
  87. package/dist/types.d.ts +116 -0
  88. package/dist/types.js +2 -0
  89. package/dist/types.js.map +1 -0
  90. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaceDecisions.js","sourceRoot":"","sources":["../../src/stages/surfaceDecisions.ts"],"names":[],"mappings":"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","sourcesContent":["import { parse, parseSetCookie } from 'cookie'\nimport type { ClientMetadataProvider } from '../adapters/ClientMetadataProvider'\nimport type { Fetcher } from '../adapters/Fetcher'\nimport type { HtmlRewriterAdapter } from '../adapters/HtmlRewriterAdapter'\nimport type { MOSConfig } from '../config'\nimport type { PipelineContext } from '../context'\nimport type { SurfaceDecisionResponse } from '../types'\nimport fetchSurfaceDecisions from './fetchSurfaceDecisions'\nimport { parsePageMetadata } from './pageMetadata'\n\nexport default async function getSurfaceDecisions(\n ctx: PipelineContext,\n request: Request,\n response: Response,\n apiFetcher: Fetcher,\n rewriter: HtmlRewriterAdapter | null,\n clientMetadataProvider: ClientMetadataProvider | null,\n): Promise<[Response, SurfaceDecisionResponse | null]> {\n const { config, logger } = ctx\n const { anonymousIdentifier, userJwt } = getExistingCookies(request, response, config)\n\n const [metadataStream, passThroughStream] = response.body?.tee() ?? [null, null]\n const pageMetadata = metadataStream && rewriter ? await parsePageMetadata(ctx, new Response(metadataStream, response), rewriter) : {}\n let modifiedResponse = passThroughStream ? new Response(passThroughStream, response) : response\n\n const clientMetadata = clientMetadataProvider?.build(request) ?? {}\n\n const result = await fetchSurfaceDecisions(\n ctx,\n {\n anonymousIdentifier,\n userJwt,\n path: new URL(request.url).pathname,\n url: request.url,\n clientMetadata,\n pageMetadata,\n userAgent: request.headers.get('User-Agent') ?? undefined,\n originStatus: response.status,\n },\n apiFetcher,\n )\n\n if (!result.ok) {\n logger.log({\n level: 'warn',\n code: 'surface-decisions-api-failed',\n message: 'Surface decisions API failed; continuing with the origin response.',\n context: {\n reason: result.reason,\n status: result.status,\n statusCode: result.statusCode,\n },\n error: result.error,\n })\n return [modifiedResponse, null]\n }\n\n const surfaceDecisions = result.data\n\n if (!anonymousIdentifier && !userJwt && surfaceDecisions?.identity?.identifier) {\n const headers = new Headers(modifiedResponse.headers)\n headers.append('Set-Cookie', `${config.anonymousSessionCookieName}=${surfaceDecisions.identity.identifier}; Path=/`)\n modifiedResponse = new Response(modifiedResponse.body, {\n status: modifiedResponse.status,\n statusText: modifiedResponse.statusText,\n headers,\n })\n }\n\n return [modifiedResponse, surfaceDecisions]\n}\n\nconst getExistingCookies = (request: Request, originResponse: Response, config: MOSConfig) => {\n const setCookies = originResponse.headers.getSetCookie().map((header) => parseSetCookie(header))\n const originAnonymousCookie = setCookies.find((s) => s.name === config.anonymousSessionCookieName)\n const originUserJwtCookie = setCookies.find((s) => s.name === config.authenticatedUserJwtCookieName)\n if (originAnonymousCookie || originUserJwtCookie) {\n return { anonymousIdentifier: originAnonymousCookie?.value, userJwt: originUserJwtCookie?.value }\n }\n\n const cookies = parse(request.headers.get('Cookie') || '')\n const anonymousIdentifier = cookies[config.anonymousSessionCookieName]\n const userJwt = cookies[config.authenticatedUserJwtCookieName]\n return { anonymousIdentifier, userJwt }\n}\n"]}
@@ -0,0 +1 @@
1
+ export default function transformOriginLinks(requestUrl: URL, originUrl: URL, input: string): string;
@@ -0,0 +1,14 @@
1
+ const protocolPattern = '(https?:)?//';
2
+ export default function transformOriginLinks(requestUrl, originUrl, input) {
3
+ if (!input) {
4
+ return input;
5
+ }
6
+ const originPort = originUrl.port ? `:${originUrl.port}` : '';
7
+ const originBasePath = originUrl.pathname.replace(/\/$/, '') ?? '';
8
+ const originUrlRegex = new RegExp(`${protocolPattern}${escapeRegExp(`${originUrl.hostname}${originPort}${originBasePath}`)}`, 'g');
9
+ const requestPort = requestUrl.port ? `:${requestUrl.port}` : '';
10
+ const requestUrlValue = `${requestUrl.protocol}//${requestUrl.hostname}${requestPort}`;
11
+ return input.replaceAll(originUrlRegex, requestUrlValue);
12
+ }
13
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
14
+ //# sourceMappingURL=transformOriginLinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformOriginLinks.js","sourceRoot":"","sources":["../../src/stages/transformOriginLinks.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,cAAc,CAAA;AAEtC,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,UAAe,EAAE,SAAc,EAAE,KAAa;IACvF,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7D,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;IAClE,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,GAAG,eAAe,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC,QAAQ,GAAG,UAAU,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAElI,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAChE,MAAM,eAAe,GAAG,GAAG,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,GAAG,WAAW,EAAE,CAAA;IAEtF,OAAO,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA","sourcesContent":["const protocolPattern = '(https?:)?//'\n\nexport default function transformOriginLinks(requestUrl: URL, originUrl: URL, input: string): string {\n if (!input) {\n return input\n }\n\n const originPort = originUrl.port ? `:${originUrl.port}` : ''\n const originBasePath = originUrl.pathname.replace(/\\/$/, '') ?? ''\n const originUrlRegex = new RegExp(`${protocolPattern}${escapeRegExp(`${originUrl.hostname}${originPort}${originBasePath}`)}`, 'g')\n\n const requestPort = requestUrl.port ? `:${requestUrl.port}` : ''\n const requestUrlValue = `${requestUrl.protocol}//${requestUrl.hostname}${requestPort}`\n\n return input.replaceAll(originUrlRegex, requestUrlValue)\n}\n\nconst escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n"]}
@@ -0,0 +1,116 @@
1
+ export type PageMetadata = Record<string, string>;
2
+ export interface FeatureMeterableProperty {
3
+ type: 'meterable';
4
+ hasAccess: boolean;
5
+ remainingUnits?: number;
6
+ }
7
+ export interface FeatureNumberProperty {
8
+ type: 'number';
9
+ value: number;
10
+ }
11
+ export interface Feature {
12
+ featureSlug: string;
13
+ properties: Record<string, FeatureMeterableProperty | FeatureNumberProperty>;
14
+ sideEffects: unknown[];
15
+ }
16
+ export interface SubSurfaceMetadataApi {
17
+ cssSelector?: string | null;
18
+ }
19
+ export type SetHttpResponse = {
20
+ headers?: Record<string, string>;
21
+ cookies?: string[];
22
+ status: number;
23
+ statusText?: string;
24
+ body: string | null;
25
+ };
26
+ export type ModifyHttpResponse = {
27
+ addHeaders?: {
28
+ name: string;
29
+ value: string;
30
+ }[];
31
+ removeHeaders?: string[];
32
+ addCookies?: string[];
33
+ status?: number;
34
+ statusText?: string;
35
+ body?: string | null;
36
+ };
37
+ export type SurfaceBehaviorApi = {
38
+ http?: ModifyHttpResponse | SetHttpResponse;
39
+ properties?: Record<string, unknown>;
40
+ } & Record<string, unknown>;
41
+ export type WebComponentElement<T = Record<string, unknown>> = {
42
+ schema: string;
43
+ props: T;
44
+ };
45
+ export type WebElement = {
46
+ type: 'html';
47
+ content: string;
48
+ } | {
49
+ type: 'text';
50
+ content: string;
51
+ } | ({
52
+ type: 'element';
53
+ } & WebComponentElement) | ({
54
+ type: 'custom';
55
+ } & Record<string, unknown>);
56
+ export type WebComponentRangeReplacement = {
57
+ fromMarker?: string;
58
+ toMarker?: string;
59
+ replaceWith?: WebElement[] | null;
60
+ };
61
+ export type WebContentSurfaceBehavior = {
62
+ before?: WebElement[];
63
+ prepend?: WebElement[];
64
+ remove?: boolean;
65
+ replaceRange?: WebComponentRangeReplacement | null;
66
+ append?: WebElement[];
67
+ after?: WebElement[];
68
+ };
69
+ export type SubSurfaceBehaviorApi = {
70
+ content?: WebContentSurfaceBehavior;
71
+ properties?: Record<string, unknown>;
72
+ metadata: SubSurfaceMetadataApi;
73
+ } & Record<string, unknown>;
74
+ export interface SurfaceDecisionResponse {
75
+ status: 'success';
76
+ identity: {
77
+ identifier: string;
78
+ isAuthenticated: boolean;
79
+ authType: string;
80
+ jwtClaims: Record<string, unknown>;
81
+ };
82
+ features: Record<string, Feature>;
83
+ customer: {
84
+ hasProducts: boolean;
85
+ };
86
+ surfaceBehavior: SurfaceBehaviorApi;
87
+ componentsSkipped: boolean;
88
+ componentBehaviors: Record<string, SubSurfaceBehaviorApi>;
89
+ }
90
+ export interface SurfaceDecisionError {
91
+ message: string;
92
+ status: 'error';
93
+ statusCode: number;
94
+ }
95
+ export interface MOSConfigInput {
96
+ /** Origin website base URL, e.g. `https://news.example.com`. */
97
+ originUrl: string;
98
+ /** Surface slug identifying the MonetizationOS surface. */
99
+ surfaceSlug: string;
100
+ /** MonetizationOS API base URL. */
101
+ mosHost: string;
102
+ /** MonetizationOS secret key; expected format `sk_<env>_<suffix>` */
103
+ mosSecretKey: string;
104
+ /** Path prefix routed to the MonetizationOS endpoint proxy. Default: `/mos-endpoints/`. */
105
+ mosEndpointsPrefix?: string;
106
+ /** Cookie name storing the anonymous session id. */
107
+ anonymousSessionCookieName: string;
108
+ /** Cookie name storing the authenticated user JWT. */
109
+ authenticatedUserJwtCookieName: string;
110
+ /** Optional script URL injected into the `<head>` of HTML responses. */
111
+ injectScriptUrl?: string;
112
+ /** Comma-separated regex patterns; matching pathnames skip surface decisions. */
113
+ surfaceDecisionsIgnorePaths?: string;
114
+ /** Optional headers added to or replacing client headers on every origin request. */
115
+ originRequestHeaders?: Record<string, string>;
116
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["export type PageMetadata = Record<string, string>\n\nexport interface FeatureMeterableProperty {\n type: 'meterable'\n hasAccess: boolean\n remainingUnits?: number\n}\n\nexport interface FeatureNumberProperty {\n type: 'number'\n value: number\n}\n\nexport interface Feature {\n featureSlug: string\n properties: Record<string, FeatureMeterableProperty | FeatureNumberProperty>\n sideEffects: unknown[]\n}\n\nexport interface SubSurfaceMetadataApi {\n cssSelector?: string | null\n}\n\nexport type SetHttpResponse = {\n headers?: Record<string, string>\n cookies?: string[]\n status: number\n statusText?: string\n body: string | null\n}\n\nexport type ModifyHttpResponse = {\n addHeaders?: { name: string; value: string }[]\n removeHeaders?: string[]\n addCookies?: string[]\n status?: number\n statusText?: string\n body?: string | null\n}\n\nexport type SurfaceBehaviorApi = {\n http?: ModifyHttpResponse | SetHttpResponse\n properties?: Record<string, unknown>\n} & Record<string, unknown>\n\nexport type WebComponentElement<T = Record<string, unknown>> = {\n schema: string\n props: T\n}\n\nexport type WebElement =\n | {\n type: 'html'\n content: string\n }\n | {\n type: 'text'\n content: string\n }\n | ({\n type: 'element'\n } & WebComponentElement)\n | ({\n type: 'custom'\n } & Record<string, unknown>)\n\nexport type WebComponentRangeReplacement = {\n fromMarker?: string\n toMarker?: string\n replaceWith?: WebElement[] | null\n}\n\nexport type WebContentSurfaceBehavior = {\n before?: WebElement[]\n prepend?: WebElement[]\n remove?: boolean\n replaceRange?: WebComponentRangeReplacement | null\n append?: WebElement[]\n after?: WebElement[]\n}\n\nexport type SubSurfaceBehaviorApi = {\n content?: WebContentSurfaceBehavior\n properties?: Record<string, unknown>\n metadata: SubSurfaceMetadataApi\n} & Record<string, unknown>\n\nexport interface SurfaceDecisionResponse {\n status: 'success'\n identity: {\n identifier: string\n isAuthenticated: boolean\n authType: string\n jwtClaims: Record<string, unknown>\n }\n features: Record<string, Feature>\n customer: {\n hasProducts: boolean\n }\n surfaceBehavior: SurfaceBehaviorApi\n componentsSkipped: boolean\n componentBehaviors: Record<string, SubSurfaceBehaviorApi>\n}\n\nexport interface SurfaceDecisionError {\n message: string\n status: 'error'\n statusCode: number\n}\n\nexport interface MOSConfigInput {\n /** Origin website base URL, e.g. `https://news.example.com`. */\n originUrl: string\n /** Surface slug identifying the MonetizationOS surface. */\n surfaceSlug: string\n /** MonetizationOS API base URL. */\n mosHost: string\n /** MonetizationOS secret key; expected format `sk_<env>_<suffix>` */\n mosSecretKey: string\n /** Path prefix routed to the MonetizationOS endpoint proxy. Default: `/mos-endpoints/`. */\n mosEndpointsPrefix?: string\n /** Cookie name storing the anonymous session id. */\n anonymousSessionCookieName: string\n /** Cookie name storing the authenticated user JWT. */\n authenticatedUserJwtCookieName: string\n /** Optional script URL injected into the `<head>` of HTML responses. */\n injectScriptUrl?: string\n /** Comma-separated regex patterns; matching pathnames skip surface decisions. */\n surfaceDecisionsIgnorePaths?: string\n /** Optional headers added to or replacing client headers on every origin request. */\n originRequestHeaders?: Record<string, string>\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@monetizationos/proxy",
3
+ "version": "1.0.0",
4
+ "description": "Platform-agnostic MonetizationOS proxy core",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": ["dist", "README.md", "LICENSE"],
16
+ "sideEffects": false,
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/MonetizationOS/mos-proxy.git"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/MonetizationOS/mos-proxy/issues"
23
+ },
24
+ "homepage": "https://github.com/MonetizationOS/mos-proxy#readme",
25
+ "keywords": ["monetization", "proxy", "cloudflare-workers", "fastly", "akamai", "html-rewriter"],
26
+ "engines": {
27
+ "node": ">=22"
28
+ },
29
+ "packageManager": "pnpm@10.32.1",
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc -p tsconfig.build.json",
35
+ "test": "vitest",
36
+ "test:run": "vitest run",
37
+ "typecheck": "tsc --noEmit",
38
+ "lint": "biome check --diagnostic-level=error --no-errors-on-unmatched",
39
+ "format": "biome check --write --no-errors-on-unmatched",
40
+ "changeset": "changeset",
41
+ "version": "changeset version && node scripts/sync-version.mjs && pnpm run format",
42
+ "release": "changeset publish",
43
+ "prepublishOnly": "pnpm run typecheck && pnpm run test:run && pnpm run build"
44
+ },
45
+ "dependencies": {
46
+ "cookie": "^1.1.1"
47
+ },
48
+ "devDependencies": {
49
+ "@biomejs/biome": "2.4.15",
50
+ "@changesets/changelog-github": "^0.7.0",
51
+ "@changesets/cli": "^2.31.0",
52
+ "@types/node": "^24.12.3",
53
+ "html-rewriter-wasm": "^0.4.1",
54
+ "typescript": "^6.0.3",
55
+ "vitest": "~4.1.5"
56
+ }
57
+ }