anilink-api-wrapper 1.22.0 → 1.24.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/README.md CHANGED
@@ -122,6 +122,10 @@ List of methods in `anilist.mutation`:
122
122
  - deleteActivity
123
123
  - toggleActivityPin
124
124
  - toggleActivitySubscription
125
+ - saveActivityReply
126
+ - deleteActivityReply
127
+ - toggleLike
128
+ - toggleLikeV2
125
129
 
126
130
  ### Error Handling
127
131
 
package/dist/AniLink.js CHANGED
@@ -55,6 +55,10 @@ const SaveListActivity_1 = require("./apis/anilist/mutation/SaveListActivity");
55
55
  const DeleteActivity_1 = require("./apis/anilist/mutation/DeleteActivity");
56
56
  const ToggleActivitySubscription_1 = require("./apis/anilist/mutation/ToggleActivitySubscription");
57
57
  const ToggleActivityPin_1 = require("./apis/anilist/mutation/ToggleActivityPin");
58
+ const SaveActivityReply_1 = require("./apis/anilist/mutation/SaveActivityReply");
59
+ const DeleteActivityReply_1 = require("./apis/anilist/mutation/DeleteActivityReply");
60
+ const ToggleLike_1 = require("./apis/anilist/mutation/ToggleLike");
61
+ const ToggleLikeV2_1 = require("./apis/anilist/mutation/ToggleLikeV2");
58
62
  /**
59
63
  * `AniLink` is a class for interacting with the APIs.
60
64
  * It provides methods for querying and mutating data.
@@ -126,6 +130,10 @@ class AniLink {
126
130
  const deleteActivityMutationInstance = new DeleteActivity_1.DeleteActivityMutation(authToken);
127
131
  const toggleActivityPinMutationInstance = new ToggleActivityPin_1.ToggleActivityPinMutation(authToken);
128
132
  const toggleActivitySubscriptionMutationInstance = new ToggleActivitySubscription_1.ToggleActivitySubscriptionMutation(authToken);
133
+ const saveActivityReplyMutationInstance = new SaveActivityReply_1.SaveActivityReplyMutation(authToken);
134
+ const deleteActivityReplyMutationInstance = new DeleteActivityReply_1.DeleteActivityReplyMutation(authToken);
135
+ const toggleLikeMutationInstance = new ToggleLike_1.ToggleLikeMutation(authToken);
136
+ const toggleLikeV2MutationInstance = new ToggleLikeV2_1.ToggleLikeV2Mutation(authToken);
129
137
  this.anilist = {
130
138
  query: {
131
139
  user: userQueryInstance.user.bind(userQueryInstance),
@@ -185,7 +193,11 @@ class AniLink {
185
193
  saveListActivity: saveListActivityMutationInstance.saveListActivity.bind(saveListActivityMutationInstance),
186
194
  deleteActivity: deleteActivityMutationInstance.deleteActivity.bind(deleteActivityMutationInstance),
187
195
  toggleActivityPin: toggleActivityPinMutationInstance.toggleActivityPin.bind(toggleActivityPinMutationInstance),
188
- toggleActivitySubscription: toggleActivitySubscriptionMutationInstance.toggleActivitySubscription.bind(toggleActivitySubscriptionMutationInstance)
196
+ toggleActivitySubscription: toggleActivitySubscriptionMutationInstance.toggleActivitySubscription.bind(toggleActivitySubscriptionMutationInstance),
197
+ saveActivityReply: saveActivityReplyMutationInstance.saveActivityReply.bind(saveActivityReplyMutationInstance),
198
+ deleteActivityReply: deleteActivityReplyMutationInstance.deleteActivityReply.bind(deleteActivityReplyMutationInstance),
199
+ toggleLike: toggleLikeMutationInstance.toggleLike.bind(toggleLikeMutationInstance),
200
+ toggleLikeV2: toggleLikeV2MutationInstance.toggleLikeV2.bind(toggleLikeV2MutationInstance)
189
201
  }
190
202
  };
191
203
  }
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MessageActivitySchema = exports.ListActivitySchema = exports.TextActivitySchema = exports.ActivityWithRepliesSchema = exports.ActivitySchema = void 0;
3
+ exports.MessageActivitySchema = exports.ListActivitySchema = exports.TextActivitySchema = exports.ActivityWithRepliesSchema = exports.ActivitySchemaV2 = exports.ActivitySchema = void 0;
4
4
  const BasicUser_1 = require("./BasicUser");
5
5
  const ActivityReply_1 = require("./ActivityReply");
6
+ const Title_1 = require("./Title");
6
7
  /**
7
8
  * `ActivitySchema` is a constant representing the GraphQL schema for an activity query.
8
9
  * It includes the TextActivity, ListActivity, and MessageActivity each having their own properties.
@@ -62,6 +63,163 @@ exports.ActivitySchema = `
62
63
  }
63
64
  }
64
65
  `;
66
+ exports.ActivitySchemaV2 = `
67
+ ... on TextActivity {
68
+ id
69
+ userId
70
+ type
71
+ replyCount
72
+ text (asHtml: $asHtml)
73
+ siteUrl
74
+ isLocked
75
+ isSubscribed
76
+ likeCount
77
+ isLiked
78
+ isPinned
79
+ createdAt
80
+ user {
81
+ ${BasicUser_1.BasicUserSchema}
82
+ }
83
+ replies {
84
+ ${ActivityReply_1.ActivityReplySchema}
85
+ }
86
+ likes {
87
+ ${BasicUser_1.BasicUserSchema}
88
+ }
89
+ }
90
+ ... on ListActivity {
91
+ id
92
+ userId
93
+ type
94
+ replyCount
95
+ status
96
+ progress
97
+ isLocked
98
+ isSubscribed
99
+ likeCount
100
+ isLiked
101
+ isPinned
102
+ siteUrl
103
+ createdAt
104
+ media {
105
+ id
106
+ title {
107
+ romaji
108
+ english
109
+ }
110
+ }
111
+ user {
112
+ ${BasicUser_1.BasicUserSchema}
113
+ }
114
+ replies {
115
+ ${ActivityReply_1.ActivityReplySchema}
116
+ }
117
+ likes {
118
+ ${BasicUser_1.BasicUserSchema}
119
+ }
120
+ }
121
+ ... on MessageActivity {
122
+ id
123
+ recipientId
124
+ messengerId
125
+ type
126
+ replyCount
127
+ message (asHtml: $asHtml)
128
+ isLocked
129
+ isSubscribed
130
+ likeCount
131
+ isLiked
132
+ isPrivate
133
+ siteUrl
134
+ createdAt
135
+ recipient {
136
+ ${BasicUser_1.BasicUserSchema}
137
+ }
138
+ messenger {
139
+ ${BasicUser_1.BasicUserSchema}
140
+ }
141
+ replies {
142
+ ${ActivityReply_1.ActivityReplySchema}
143
+ }
144
+ likes {
145
+ ${BasicUser_1.BasicUserSchema}
146
+ }
147
+ }
148
+ ... on ActivityReply {
149
+ id
150
+ userId
151
+ activityId
152
+ text (asHtml: $asHtml)
153
+ likeCount
154
+ isLiked
155
+ createdAt
156
+ user {
157
+ ${BasicUser_1.BasicUserSchema}
158
+ }
159
+ likes {
160
+ ${BasicUser_1.BasicUserSchema}
161
+ }
162
+ }
163
+ ... on Thread {
164
+ id
165
+ title
166
+ body (asHtml: $asHtml)
167
+ ThreadUserId: userId
168
+ replyUserId
169
+ replyCommentId
170
+ ThreadReplyCount: replyCount
171
+ viewCount
172
+ isLocked
173
+ isSticky
174
+ isSubscribed
175
+ likeCount
176
+ isLiked
177
+ repliedAt
178
+ createdAt
179
+ updatedAt
180
+ user {
181
+ ${BasicUser_1.BasicUserSchema}
182
+ }
183
+ replyUser {
184
+ ${BasicUser_1.BasicUserSchema}
185
+ }
186
+ likes {
187
+ ${BasicUser_1.BasicUserSchema}
188
+ }
189
+ siteUrl
190
+ categories {
191
+ id
192
+ name
193
+ }
194
+ mediaCategories {
195
+ id
196
+ ${Title_1.TitleSchema}
197
+ }
198
+ }
199
+ ... on ThreadComment {
200
+ id
201
+ userId
202
+ threadId
203
+ comment (asHtml: $asHtml)
204
+ likeCount
205
+ isLiked
206
+ siteUrl
207
+ createdAt
208
+ updatedAt
209
+ thread {
210
+ id
211
+ title
212
+ }
213
+ user {
214
+ ${BasicUser_1.BasicUserSchema}
215
+ }
216
+ likes {
217
+ ${BasicUser_1.BasicUserSchema}
218
+ }
219
+ childComments
220
+ isLocked
221
+ }
222
+ `;
65
223
  /**
66
224
  * `ActivityWithRepliesSchema` is a constant representing the GraphQL schema for an activity query with replies.
67
225
  * It includes the TextActivity, ListActivity, and MessageActivity each having their own properties and replies.
@@ -15,7 +15,7 @@ const RequestHandler_1 = require("../../../base/RequestHandler");
15
15
  const ValidateVariables_1 = require("../../../base/ValidateVariables");
16
16
  /**
17
17
  * `DeleteActivityMutation` is a class representing a mutation to delete a activity.
18
- * It includes a method to delete a activity
18
+ * It includes a method to delete an activity
19
19
  */
20
20
  class DeleteActivityMutation extends APIWrapper_1.APIWrapper {
21
21
  /**
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DeleteActivityReplyMutation = void 0;
13
+ const APIWrapper_1 = require("../../../base/APIWrapper");
14
+ const RequestHandler_1 = require("../../../base/RequestHandler");
15
+ const ValidateVariables_1 = require("../../../base/ValidateVariables");
16
+ /**
17
+ * `DeleteActivityReplyMutation` is a class representing a mutation to delete an activity reply.
18
+ * It includes a method to delete an activity
19
+ */
20
+ class DeleteActivityReplyMutation extends APIWrapper_1.APIWrapper {
21
+ /**
22
+ * Constructs a new `DeleteActivityReplyMutation` instance.
23
+ *
24
+ * @param authToken - The authentication token.
25
+ */
26
+ constructor(authToken) {
27
+ super('https://graphql.anilist.co');
28
+ this.authToken = authToken;
29
+ }
30
+ /**
31
+ * `DeleteActivityReply` is a method that sends a mutation request to delete an activity reply.
32
+ *
33
+ * @param variables - An object of type `DeleteActivityReplyVariables` representing the variables for the mutation.
34
+ * @returns A Promise that resolves to the response from the mutation request.
35
+ * @throws Will throw an error if the mutation request fails or if the provided variables do not pass the validation checks.
36
+ * */
37
+ deleteActivityReply(variables) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ if (!this.authToken) {
40
+ throw new Error('DeleteActivityReplyMutation requires an authentication token. Create a new instance of AniLink and pass the token as an argument.');
41
+ }
42
+ if (!variables.id) {
43
+ throw new Error('id variable is required');
44
+ }
45
+ const variableTypeMappings = {
46
+ id: 'number'
47
+ };
48
+ (0, ValidateVariables_1.validateVariables)(variables, variableTypeMappings);
49
+ const mutation = `
50
+ mutation ($id: Int) {
51
+ DeleteActivityReply (id: $id) {
52
+ deleted
53
+ }
54
+ }
55
+ `;
56
+ const data = { query: mutation, variables };
57
+ return yield (0, RequestHandler_1.sendRequest)(this.baseURL, 'POST', data, this.authToken);
58
+ });
59
+ }
60
+ }
61
+ exports.DeleteActivityReplyMutation = DeleteActivityReplyMutation;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SaveActivityReplyMutation = void 0;
13
+ const APIWrapper_1 = require("../../../base/APIWrapper");
14
+ const RequestHandler_1 = require("../../../base/RequestHandler");
15
+ const ValidateVariables_1 = require("../../../base/ValidateVariables");
16
+ const ActivityReply_1 = require("../interfaces/ActivityReply");
17
+ /**
18
+ * `SaveActivityReplyMutation` is a class representing a mutation to save an activity reply.
19
+ * It includes a method to save an activity reply
20
+ */
21
+ class SaveActivityReplyMutation extends APIWrapper_1.APIWrapper {
22
+ /**
23
+ * Constructs a new `SaveActivityReplyMutation` instance.
24
+ *
25
+ * @param authToken - The authentication token.
26
+ */
27
+ constructor(authToken) {
28
+ super('https://graphql.anilist.co');
29
+ this.authToken = authToken;
30
+ }
31
+ /**
32
+ * `SaveActivityReply` is a method that sends a mutation request to save an activity reply.
33
+ *
34
+ * @param variables - An object of type `SaveActivityReplyVariables` representing the variables for the mutation.
35
+ * @returns A Promise that resolves to the response from the mutation request.
36
+ * @throws Will throw an error if the mutation request fails or if the provided variables do not pass the validation checks.
37
+ * */
38
+ saveActivityReply(variables) {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ if (!this.authToken) {
41
+ throw new Error('SaveActivityReplyMutation requires an authentication token. Create a new instance of AniLink and pass the token as an argument.');
42
+ }
43
+ if (!variables.id && !variables.text) {
44
+ throw new Error('id or text variable is required');
45
+ }
46
+ const variableTypeMappings = {
47
+ id: 'number',
48
+ activityId: 'number',
49
+ text: 'string',
50
+ asMod: 'boolean',
51
+ asHtml: 'boolean'
52
+ };
53
+ (0, ValidateVariables_1.validateVariables)(variables, variableTypeMappings);
54
+ const mutation = `
55
+ mutation ($id: Int, $activityId: Int, $text: String, $asMod: Boolean, $asHtml: Boolean) {
56
+ SaveActivityReply (id: $id, activityId: $activityId, text: $text, asMod: $asMod) {
57
+ ${ActivityReply_1.ActivityReplySchema}
58
+ }
59
+ }
60
+ `;
61
+ const data = { query: mutation, variables };
62
+ return yield (0, RequestHandler_1.sendRequest)(this.baseURL, 'POST', data, this.authToken);
63
+ });
64
+ }
65
+ }
66
+ exports.SaveActivityReplyMutation = SaveActivityReplyMutation;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ToggleLikeMutation = void 0;
13
+ const APIWrapper_1 = require("../../../base/APIWrapper");
14
+ const RequestHandler_1 = require("../../../base/RequestHandler");
15
+ const ValidateVariables_1 = require("../../../base/ValidateVariables");
16
+ const Type_1 = require("../types/Type");
17
+ const BasicUser_1 = require("../interfaces/BasicUser");
18
+ /**
19
+ * `ToggleLikeMutation` is a class representing a mutation to toggle a like.
20
+ * It includes a method to delete an activity
21
+ */
22
+ class ToggleLikeMutation extends APIWrapper_1.APIWrapper {
23
+ /**
24
+ * Constructs a new `ToggleLikeMutation` instance.
25
+ *
26
+ * @param authToken - The authentication token.
27
+ */
28
+ constructor(authToken) {
29
+ super('https://graphql.anilist.co');
30
+ this.authToken = authToken;
31
+ }
32
+ /**
33
+ * `ToggleLike` is a method that sends a mutation request to toggle a like.
34
+ *
35
+ * @param variables - An object of type `ToggleLikeVariables` representing the variables for the mutation.
36
+ * @returns A Promise that resolves to the response from the mutation request.
37
+ * @throws Will throw an error if the mutation request fails or if the provided variables do not pass the validation checks.
38
+ * */
39
+ toggleLike(variables) {
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ if (!this.authToken) {
42
+ throw new Error('ToggleLikeMutation requires an authentication token. Create a new instance of AniLink and pass the token as an argument.');
43
+ }
44
+ if (!variables.id || !variables.type) {
45
+ throw new Error('id and type variables are required.');
46
+ }
47
+ const variableTypeMappings = {
48
+ id: 'number',
49
+ type: Type_1.LikeableTypeMappings
50
+ };
51
+ (0, ValidateVariables_1.validateVariables)(variables, variableTypeMappings);
52
+ const mutation = `
53
+ mutation ($id: Int, $type: LikeableType) {
54
+ ToggleLike (id: $id, type: $type) {
55
+ ${BasicUser_1.BasicUserSchema}
56
+ }
57
+ }
58
+ `;
59
+ const data = { query: mutation, variables };
60
+ return yield (0, RequestHandler_1.sendRequest)(this.baseURL, 'POST', data, this.authToken);
61
+ });
62
+ }
63
+ }
64
+ exports.ToggleLikeMutation = ToggleLikeMutation;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ToggleLikeV2Mutation = void 0;
13
+ const APIWrapper_1 = require("../../../base/APIWrapper");
14
+ const RequestHandler_1 = require("../../../base/RequestHandler");
15
+ const ValidateVariables_1 = require("../../../base/ValidateVariables");
16
+ const Type_1 = require("../types/Type");
17
+ const Activity_1 = require("../interfaces/Activity");
18
+ /**
19
+ * `ToggleLikeV2Mutation` is a class representing a mutation to toggle a like.
20
+ * It includes a method to delete an activity
21
+ */
22
+ class ToggleLikeV2Mutation extends APIWrapper_1.APIWrapper {
23
+ /**
24
+ * Constructs a new `ToggleLikeV2Mutation` instance.
25
+ *
26
+ * @param authToken - The authentication token.
27
+ */
28
+ constructor(authToken) {
29
+ super('https://graphql.anilist.co');
30
+ this.authToken = authToken;
31
+ }
32
+ /**
33
+ * `ToggleLikeV2` is a method that sends a mutation request to toggle a like.
34
+ *
35
+ * @param variables - An object of type `ToggleLikeV2Variables` representing the variables for the mutation.
36
+ * @returns A Promise that resolves to the response from the mutation request.
37
+ * @throws Will throw an error if the mutation request fails or if the provided variables do not pass the validation checks.
38
+ * */
39
+ toggleLikeV2(variables) {
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ if (!this.authToken) {
42
+ throw new Error('ToggleLikeV2Mutation requires an authentication token. Create a new instance of AniLink and pass the token as an argument.');
43
+ }
44
+ if (!variables.id || !variables.type) {
45
+ throw new Error('id and type variables are required.');
46
+ }
47
+ const variableTypeMappings = {
48
+ id: 'number',
49
+ type: Type_1.LikeableTypeMappings
50
+ };
51
+ (0, ValidateVariables_1.validateVariables)(variables, variableTypeMappings);
52
+ const mutation = `
53
+ mutation ($id: Int, $type: LikeableType, $asHtml: Boolean) {
54
+ ToggleLikeV2 (id: $id, type: $type) {
55
+ ${Activity_1.ActivitySchemaV2}
56
+ }
57
+ }
58
+ `;
59
+ const data = { query: mutation, variables };
60
+ return yield (0, RequestHandler_1.sendRequest)(this.baseURL, 'POST', data, this.authToken);
61
+ });
62
+ }
63
+ }
64
+ exports.ToggleLikeV2Mutation = ToggleLikeV2Mutation;
package/package.json CHANGED
@@ -1,13 +1,16 @@
1
1
  {
2
2
  "name": "anilink-api-wrapper",
3
- "version": "1.22.0",
3
+ "version": "1.24.0",
4
4
  "description": "API wrapper for AniManga sites such as Anilist, MyAnimeList, Kitsu.",
5
5
  "main": "dist/AniLink.js",
6
6
  "scripts": {
7
7
  "test": "jest",
8
- "build": "tsc",
8
+ "build": "rimraf dist && tsc",
9
9
  "generate-docs": "typedoc --entryPoints ./src --entryPointStrategy expand --out docs --plugin typedoc-theme-hierarchy --theme hierarchy && node add-ga.js",
10
- "prepublishOnly": "npm run build"
10
+ "prepublishOnly": "npm run build",
11
+ "publish:both": "npm run build && npm run publish:npm && npm run publish:github",
12
+ "publish:npm": "npm publish --registry https://registry.npmjs.org/",
13
+ "publish:github": "npm publish"
11
14
  },
12
15
  "keywords": [
13
16
  "anilist",
@@ -22,6 +25,10 @@
22
25
  ],
23
26
  "author": "RLAlpha49",
24
27
  "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/RLAlpha49/AniLink.git"
31
+ },
25
32
  "devDependencies": {
26
33
  "@babel/preset-typescript": "^7.24.1",
27
34
  "@types/jest": "^29.5.12",
@@ -33,6 +40,7 @@
33
40
  "eslint-plugin-n": "^15.7.0",
34
41
  "eslint-plugin-promise": "^6.1.1",
35
42
  "jest": "^29.7.0",
43
+ "rimraf": "^5.0.5",
36
44
  "standard": "^17.1.0",
37
45
  "ts-jest": "^29.1.2",
38
46
  "typedoc": "^0.25.13",
@@ -42,4 +50,4 @@
42
50
  "dependencies": {
43
51
  "axios": "^1.6.8"
44
52
  }
45
- }
53
+ }