npm-cli-gh-issue-preparator 1.8.0 → 1.10.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/CHANGELOG.md +14 -0
- package/bin/adapter/entry-points/cli/index.js +33 -8
- package/bin/adapter/entry-points/cli/index.js.map +1 -1
- package/bin/adapter/repositories/GitHubIssueCommentRepository.js +183 -0
- package/bin/adapter/repositories/GitHubIssueCommentRepository.js.map +1 -0
- package/bin/adapter/repositories/GraphqlIssueRepository.js +417 -0
- package/bin/adapter/repositories/GraphqlIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/TowerDefenceIssueRepository.js +47 -0
- package/bin/adapter/repositories/TowerDefenceIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/TowerDefenceProjectRepository.js +45 -0
- package/bin/adapter/repositories/TowerDefenceProjectRepository.js.map +1 -0
- package/bin/domain/entities/Member.js +3 -0
- package/bin/domain/entities/Member.js.map +1 -0
- package/bin/domain/entities/StoryObjectMap.js +3 -0
- package/bin/domain/entities/StoryObjectMap.js.map +1 -0
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +43 -2
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
- package/bin/domain/usecases/StartPreparationUseCase.js +35 -3
- package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
- package/bin/domain/usecases/adapter-interfaces/IssueCommentRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/IssueCommentRepository.js.map +1 -0
- package/package.json +3 -2
- package/src/adapter/entry-points/cli/index.integration.test.ts +64 -117
- package/src/adapter/entry-points/cli/index.test.ts +124 -2
- package/src/adapter/entry-points/cli/index.ts +68 -8
- package/src/adapter/repositories/GitHubIssueCommentRepository.test.ts +418 -0
- package/src/adapter/repositories/GitHubIssueCommentRepository.ts +277 -0
- package/src/adapter/repositories/GraphqlIssueRepository.integration.test.ts +162 -0
- package/src/adapter/repositories/GraphqlIssueRepository.test.ts +1333 -0
- package/src/adapter/repositories/{GitHubIssueRepository.ts → GraphqlIssueRepository.ts} +203 -412
- package/src/adapter/repositories/TowerDefenceIssueRepository.integration.test.ts +106 -0
- package/src/adapter/repositories/TowerDefenceIssueRepository.test.ts +141 -0
- package/src/adapter/repositories/TowerDefenceIssueRepository.ts +66 -0
- package/src/adapter/repositories/TowerDefenceProjectRepository.test.ts +215 -0
- package/src/adapter/repositories/TowerDefenceProjectRepository.ts +58 -0
- package/src/domain/entities/Issue.ts +23 -7
- package/src/domain/entities/Member.ts +3 -0
- package/src/domain/entities/Project.ts +52 -3
- package/src/domain/entities/StoryObjectMap.ts +13 -0
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +470 -26
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +83 -4
- package/src/domain/usecases/StartPreparationUseCase.test.ts +358 -96
- package/src/domain/usecases/StartPreparationUseCase.ts +66 -15
- package/src/domain/usecases/adapter-interfaces/IssueCommentRepository.ts +7 -0
- package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +2 -0
- package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
- package/types/adapter/repositories/GitHubIssueCommentRepository.d.ts +12 -0
- package/types/adapter/repositories/GitHubIssueCommentRepository.d.ts.map +1 -0
- package/types/adapter/repositories/GitHubIssueRepository.d.ts +16 -13
- package/types/adapter/repositories/GitHubProjectRepository.d.ts +6 -6
- package/types/adapter/repositories/GraphqlIssueRepository.d.ts +14 -0
- package/types/adapter/repositories/GraphqlIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/TowerDefenceIssueRepository.d.ts +16 -0
- package/types/adapter/repositories/TowerDefenceIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/TowerDefenceProjectRepository.d.ts +14 -0
- package/types/adapter/repositories/TowerDefenceProjectRepository.d.ts.map +1 -0
- package/types/domain/entities/Issue.d.ts +23 -6
- package/types/domain/entities/Issue.d.ts.map +1 -1
- package/types/domain/entities/Member.d.ts +4 -0
- package/types/domain/entities/Member.d.ts.map +1 -0
- package/types/domain/entities/Project.d.ts +43 -3
- package/types/domain/entities/Project.d.ts.map +1 -1
- package/types/domain/entities/StoryObjectMap.d.ts +10 -0
- package/types/domain/entities/StoryObjectMap.d.ts.map +1 -0
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +6 -2
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/StartPreparationUseCase.d.ts +6 -1
- package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/adapter-interfaces/IssueCommentRepository.d.ts +7 -0
- package/types/domain/usecases/adapter-interfaces/IssueCommentRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +2 -0
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
- package/src/adapter/repositories/GitHubIssueRepository.integration.test.ts +0 -66
- package/src/adapter/repositories/GitHubIssueRepository.test.ts +0 -2395
- package/src/adapter/repositories/GitHubProjectRepository.test.ts +0 -403
- package/src/adapter/repositories/GitHubProjectRepository.ts +0 -249
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [1.10.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.9.0...v1.10.0) (2026-02-13)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **core:** add PR status checking to notify finished issue preparation ([72e5562](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/72e556229200a14669240e37da75da60a34530c0))
|
|
7
|
+
|
|
8
|
+
# [1.9.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.8.0...v1.9.0) (2026-02-11)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **core:** use getStoryObjectMap from tower-defence library ([980aed8](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/980aed86127965c68d38e1336ef007aad5d810ee)), closes [#82](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/issues/82)
|
|
14
|
+
|
|
1
15
|
# [1.8.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.7.1...v1.8.0) (2026-02-09)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -10,8 +10,10 @@ dotenv_1.default.config();
|
|
|
10
10
|
const commander_1 = require("commander");
|
|
11
11
|
const StartPreparationUseCase_1 = require("../../../domain/usecases/StartPreparationUseCase");
|
|
12
12
|
const NotifyFinishedIssuePreparationUseCase_1 = require("../../../domain/usecases/NotifyFinishedIssuePreparationUseCase");
|
|
13
|
-
const
|
|
14
|
-
const
|
|
13
|
+
const TowerDefenceIssueRepository_1 = require("../../repositories/TowerDefenceIssueRepository");
|
|
14
|
+
const GraphqlIssueRepository_1 = require("../../repositories/GraphqlIssueRepository");
|
|
15
|
+
const TowerDefenceProjectRepository_1 = require("../../repositories/TowerDefenceProjectRepository");
|
|
16
|
+
const GitHubIssueCommentRepository_1 = require("../../repositories/GitHubIssueCommentRepository");
|
|
15
17
|
const NodeLocalCommandRunner_1 = require("../../repositories/NodeLocalCommandRunner");
|
|
16
18
|
const program = new commander_1.Command();
|
|
17
19
|
exports.program = program;
|
|
@@ -25,6 +27,7 @@ program
|
|
|
25
27
|
.requiredOption('--awaitingWorkspaceStatus <status>', 'Status for issues awaiting workspace')
|
|
26
28
|
.requiredOption('--preparationStatus <status>', 'Status for issues in preparation')
|
|
27
29
|
.requiredOption('--defaultAgentName <name>', 'Default agent name')
|
|
30
|
+
.requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
|
|
28
31
|
.option('--logFilePath <path>', 'Path to log file')
|
|
29
32
|
.option('--maximumPreparingIssuesCount <count>', 'Maximum number of issues in preparation status (default: 6)')
|
|
30
33
|
.action(async (options) => {
|
|
@@ -33,10 +36,15 @@ program
|
|
|
33
36
|
console.error('GH_TOKEN environment variable is required');
|
|
34
37
|
process.exit(1);
|
|
35
38
|
}
|
|
36
|
-
const projectRepository = new
|
|
37
|
-
const
|
|
39
|
+
const projectRepository = new TowerDefenceProjectRepository_1.TowerDefenceProjectRepository(options.configFilePath, token);
|
|
40
|
+
const towerDefenceIssueRepository = new TowerDefenceIssueRepository_1.TowerDefenceIssueRepository(options.configFilePath, token);
|
|
41
|
+
const graphqlIssueRepository = new GraphqlIssueRepository_1.GraphqlIssueRepository(token);
|
|
38
42
|
const localCommandRunner = new NodeLocalCommandRunner_1.NodeLocalCommandRunner();
|
|
39
|
-
const useCase = new StartPreparationUseCase_1.StartPreparationUseCase(projectRepository,
|
|
43
|
+
const useCase = new StartPreparationUseCase_1.StartPreparationUseCase(projectRepository, {
|
|
44
|
+
getAllOpened: towerDefenceIssueRepository.getAllOpened.bind(towerDefenceIssueRepository),
|
|
45
|
+
getStoryObjectMap: towerDefenceIssueRepository.getStoryObjectMap.bind(towerDefenceIssueRepository),
|
|
46
|
+
update: graphqlIssueRepository.update.bind(graphqlIssueRepository),
|
|
47
|
+
}, localCommandRunner);
|
|
40
48
|
let maximumPreparingIssuesCount = null;
|
|
41
49
|
if (options.maximumPreparingIssuesCount !== undefined) {
|
|
42
50
|
const parsedCount = Number(options.maximumPreparingIssuesCount);
|
|
@@ -63,21 +71,38 @@ program
|
|
|
63
71
|
.requiredOption('--projectUrl <url>', 'GitHub project URL')
|
|
64
72
|
.requiredOption('--issueUrl <url>', 'GitHub issue URL')
|
|
65
73
|
.requiredOption('--preparationStatus <status>', 'Status for issues in preparation')
|
|
74
|
+
.requiredOption('--awaitingWorkspaceStatus <status>', 'Status for issues awaiting workspace')
|
|
66
75
|
.requiredOption('--awaitingQualityCheckStatus <status>', 'Status for issues awaiting quality check')
|
|
76
|
+
.requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
|
|
77
|
+
.option('--thresholdForAutoReject <count>', 'Threshold for auto-escalation after consecutive rejections (default: 3)')
|
|
67
78
|
.action(async (options) => {
|
|
68
79
|
const token = process.env.GH_TOKEN;
|
|
69
80
|
if (!token) {
|
|
70
81
|
console.error('GH_TOKEN environment variable is required');
|
|
71
82
|
process.exit(1);
|
|
72
83
|
}
|
|
73
|
-
const projectRepository = new
|
|
74
|
-
const
|
|
75
|
-
const
|
|
84
|
+
const projectRepository = new TowerDefenceProjectRepository_1.TowerDefenceProjectRepository(options.configFilePath, token);
|
|
85
|
+
const graphqlIssueRepository = new GraphqlIssueRepository_1.GraphqlIssueRepository(token);
|
|
86
|
+
const issueCommentRepository = new GitHubIssueCommentRepository_1.GitHubIssueCommentRepository(token);
|
|
87
|
+
const useCase = new NotifyFinishedIssuePreparationUseCase_1.NotifyFinishedIssuePreparationUseCase(projectRepository, graphqlIssueRepository, issueCommentRepository);
|
|
88
|
+
let thresholdForAutoReject = 3;
|
|
89
|
+
if (options.thresholdForAutoReject !== undefined) {
|
|
90
|
+
const parsed = Number(options.thresholdForAutoReject);
|
|
91
|
+
if (!Number.isFinite(parsed) ||
|
|
92
|
+
!Number.isInteger(parsed) ||
|
|
93
|
+
parsed <= 0) {
|
|
94
|
+
console.error('Invalid value for --thresholdForAutoReject. It must be a positive integer.');
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
thresholdForAutoReject = parsed;
|
|
98
|
+
}
|
|
76
99
|
await useCase.run({
|
|
77
100
|
projectUrl: options.projectUrl,
|
|
78
101
|
issueUrl: options.issueUrl,
|
|
79
102
|
preparationStatus: options.preparationStatus,
|
|
103
|
+
awaitingWorkspaceStatus: options.awaitingWorkspaceStatus,
|
|
80
104
|
awaitingQualityCheckStatus: options.awaitingQualityCheckStatus,
|
|
105
|
+
thresholdForAutoReject,
|
|
81
106
|
});
|
|
82
107
|
});
|
|
83
108
|
/* istanbul ignore next */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";;;;;;;AACA,oDAA4B;AAC5B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,yCAAoC;AACpC,8FAA2F;AAC3F,0HAAuH;AACvH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GitHubIssueCommentRepository = void 0;
|
|
4
|
+
function isIssueCommentsResponse(value) {
|
|
5
|
+
if (typeof value !== 'object' || value === null)
|
|
6
|
+
return false;
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
function isCreateCommentResponse(value) {
|
|
10
|
+
if (typeof value !== 'object' || value === null)
|
|
11
|
+
return false;
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
function isIssueIdResponse(value) {
|
|
15
|
+
if (typeof value !== 'object' || value === null)
|
|
16
|
+
return false;
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
class GitHubIssueCommentRepository {
|
|
20
|
+
constructor(token) {
|
|
21
|
+
this.token = token;
|
|
22
|
+
}
|
|
23
|
+
parseIssueUrl(issue) {
|
|
24
|
+
const urlMatch = issue.url.match(/github\.com\/([^/]+)\/([^/]+)\/issues\/(\d+)/);
|
|
25
|
+
if (!urlMatch) {
|
|
26
|
+
throw new Error(`Invalid GitHub issue URL: ${issue.url}`);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
owner: urlMatch[1],
|
|
30
|
+
repo: urlMatch[2],
|
|
31
|
+
issueNumber: parseInt(urlMatch[3], 10),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async getCommentsFromIssue(issue) {
|
|
35
|
+
const { owner, repo, issueNumber } = this.parseIssueUrl(issue);
|
|
36
|
+
const query = `
|
|
37
|
+
query($owner: String!, $repo: String!, $issueNumber: Int!, $after: String) {
|
|
38
|
+
repository(owner: $owner, name: $repo) {
|
|
39
|
+
issue(number: $issueNumber) {
|
|
40
|
+
comments(first: 100, after: $after) {
|
|
41
|
+
pageInfo {
|
|
42
|
+
endCursor
|
|
43
|
+
hasNextPage
|
|
44
|
+
}
|
|
45
|
+
nodes {
|
|
46
|
+
author {
|
|
47
|
+
login
|
|
48
|
+
}
|
|
49
|
+
body
|
|
50
|
+
createdAt
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
const comments = [];
|
|
58
|
+
let after = null;
|
|
59
|
+
let hasNextPage = true;
|
|
60
|
+
while (hasNextPage) {
|
|
61
|
+
const response = await fetch('https://api.github.com/graphql', {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
headers: {
|
|
64
|
+
Authorization: `Bearer ${this.token}`,
|
|
65
|
+
'Content-Type': 'application/json',
|
|
66
|
+
},
|
|
67
|
+
body: JSON.stringify({
|
|
68
|
+
query,
|
|
69
|
+
variables: {
|
|
70
|
+
owner,
|
|
71
|
+
repo,
|
|
72
|
+
issueNumber,
|
|
73
|
+
after,
|
|
74
|
+
},
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new Error(`Failed to fetch comments from GitHub GraphQL API: ${response.status} ${response.statusText}`);
|
|
79
|
+
}
|
|
80
|
+
const responseData = await response.json();
|
|
81
|
+
if (!isIssueCommentsResponse(responseData)) {
|
|
82
|
+
throw new Error('Unexpected response shape when fetching comments from GitHub GraphQL API');
|
|
83
|
+
}
|
|
84
|
+
const issueData = responseData.data?.repository?.issue;
|
|
85
|
+
if (!issueData) {
|
|
86
|
+
throw new Error('Issue not found when fetching comments from GitHub GraphQL API');
|
|
87
|
+
}
|
|
88
|
+
const commentNodes = issueData.comments.nodes;
|
|
89
|
+
for (const node of commentNodes) {
|
|
90
|
+
comments.push({
|
|
91
|
+
author: node.author?.login || '',
|
|
92
|
+
content: node.body,
|
|
93
|
+
createdAt: new Date(node.createdAt),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
hasNextPage = issueData.comments.pageInfo.hasNextPage;
|
|
97
|
+
after = issueData.comments.pageInfo.endCursor;
|
|
98
|
+
}
|
|
99
|
+
return comments;
|
|
100
|
+
}
|
|
101
|
+
async getIssueNodeId(issue) {
|
|
102
|
+
const { owner, repo, issueNumber } = this.parseIssueUrl(issue);
|
|
103
|
+
const query = `
|
|
104
|
+
query($owner: String!, $repo: String!, $issueNumber: Int!) {
|
|
105
|
+
repository(owner: $owner, name: $repo) {
|
|
106
|
+
issue(number: $issueNumber) {
|
|
107
|
+
id
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
`;
|
|
112
|
+
const response = await fetch('https://api.github.com/graphql', {
|
|
113
|
+
method: 'POST',
|
|
114
|
+
headers: {
|
|
115
|
+
Authorization: `Bearer ${this.token}`,
|
|
116
|
+
'Content-Type': 'application/json',
|
|
117
|
+
},
|
|
118
|
+
body: JSON.stringify({
|
|
119
|
+
query,
|
|
120
|
+
variables: {
|
|
121
|
+
owner,
|
|
122
|
+
repo,
|
|
123
|
+
issueNumber,
|
|
124
|
+
},
|
|
125
|
+
}),
|
|
126
|
+
});
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
throw new Error(`Failed to fetch issue ID from GitHub GraphQL API: ${response.status} ${response.statusText}`);
|
|
129
|
+
}
|
|
130
|
+
const responseData = await response.json();
|
|
131
|
+
if (!isIssueIdResponse(responseData)) {
|
|
132
|
+
throw new Error('Unexpected response shape when fetching issue ID from GitHub GraphQL API');
|
|
133
|
+
}
|
|
134
|
+
const issueId = responseData.data?.repository?.issue?.id;
|
|
135
|
+
if (!issueId) {
|
|
136
|
+
throw new Error('Issue not found when fetching issue ID from GitHub GraphQL API');
|
|
137
|
+
}
|
|
138
|
+
return issueId;
|
|
139
|
+
}
|
|
140
|
+
async createComment(issue, commentContent) {
|
|
141
|
+
const issueId = await this.getIssueNodeId(issue);
|
|
142
|
+
const mutation = `
|
|
143
|
+
mutation($issueId: ID!, $body: String!) {
|
|
144
|
+
addComment(input: {
|
|
145
|
+
subjectId: $issueId
|
|
146
|
+
body: $body
|
|
147
|
+
}) {
|
|
148
|
+
commentEdge {
|
|
149
|
+
node {
|
|
150
|
+
id
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
`;
|
|
156
|
+
const response = await fetch('https://api.github.com/graphql', {
|
|
157
|
+
method: 'POST',
|
|
158
|
+
headers: {
|
|
159
|
+
Authorization: `Bearer ${this.token}`,
|
|
160
|
+
'Content-Type': 'application/json',
|
|
161
|
+
},
|
|
162
|
+
body: JSON.stringify({
|
|
163
|
+
query: mutation,
|
|
164
|
+
variables: {
|
|
165
|
+
issueId,
|
|
166
|
+
body: commentContent,
|
|
167
|
+
},
|
|
168
|
+
}),
|
|
169
|
+
});
|
|
170
|
+
if (!response.ok) {
|
|
171
|
+
throw new Error(`Failed to create comment via GitHub GraphQL API: ${response.status} ${response.statusText}`);
|
|
172
|
+
}
|
|
173
|
+
const responseData = await response.json();
|
|
174
|
+
if (!isCreateCommentResponse(responseData)) {
|
|
175
|
+
throw new Error('Invalid API response format when creating comment');
|
|
176
|
+
}
|
|
177
|
+
if (responseData.errors) {
|
|
178
|
+
throw new Error(`GraphQL errors when creating comment: ${JSON.stringify(responseData.errors)}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
exports.GitHubIssueCommentRepository = GitHubIssueCommentRepository;
|
|
183
|
+
//# sourceMappingURL=GitHubIssueCommentRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubIssueCommentRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GitHubIssueCommentRepository.ts"],"names":[],"mappings":"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"}
|