careerly-data-mcp 2.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 (70) hide show
  1. package/README.md +230 -0
  2. package/dist/bigquery/auth.d.ts +18 -0
  3. package/dist/bigquery/auth.d.ts.map +1 -0
  4. package/dist/bigquery/auth.js +46 -0
  5. package/dist/bigquery/auth.js.map +1 -0
  6. package/dist/bigquery/client.d.ts +77 -0
  7. package/dist/bigquery/client.d.ts.map +1 -0
  8. package/dist/bigquery/client.js +495 -0
  9. package/dist/bigquery/client.js.map +1 -0
  10. package/dist/bigquery/index.d.ts +7 -0
  11. package/dist/bigquery/index.d.ts.map +1 -0
  12. package/dist/bigquery/index.js +7 -0
  13. package/dist/bigquery/index.js.map +1 -0
  14. package/dist/bigquery/types.d.ts +137 -0
  15. package/dist/bigquery/types.d.ts.map +1 -0
  16. package/dist/bigquery/types.js +40 -0
  17. package/dist/bigquery/types.js.map +1 -0
  18. package/dist/cli/setup.d.ts +30 -0
  19. package/dist/cli/setup.d.ts.map +1 -0
  20. package/dist/cli/setup.js +859 -0
  21. package/dist/cli/setup.js.map +1 -0
  22. package/dist/ga4/auth.d.ts +29 -0
  23. package/dist/ga4/auth.d.ts.map +1 -0
  24. package/dist/ga4/auth.js +73 -0
  25. package/dist/ga4/auth.js.map +1 -0
  26. package/dist/ga4/client.d.ts +51 -0
  27. package/dist/ga4/client.d.ts.map +1 -0
  28. package/dist/ga4/client.js +223 -0
  29. package/dist/ga4/client.js.map +1 -0
  30. package/dist/ga4/index.d.ts +7 -0
  31. package/dist/ga4/index.d.ts.map +1 -0
  32. package/dist/ga4/index.js +7 -0
  33. package/dist/ga4/index.js.map +1 -0
  34. package/dist/ga4/types.d.ts +115 -0
  35. package/dist/ga4/types.d.ts.map +1 -0
  36. package/dist/ga4/types.js +63 -0
  37. package/dist/ga4/types.js.map +1 -0
  38. package/dist/index.d.ts +7 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +114 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/insight/renderer.d.ts +29 -0
  43. package/dist/insight/renderer.d.ts.map +1 -0
  44. package/dist/insight/renderer.js +194 -0
  45. package/dist/insight/renderer.js.map +1 -0
  46. package/dist/mcp/server.d.ts +20 -0
  47. package/dist/mcp/server.d.ts.map +1 -0
  48. package/dist/mcp/server.js +50 -0
  49. package/dist/mcp/server.js.map +1 -0
  50. package/dist/tools/bq-ga4-events.d.ts +10 -0
  51. package/dist/tools/bq-ga4-events.d.ts.map +1 -0
  52. package/dist/tools/bq-ga4-events.js +396 -0
  53. package/dist/tools/bq-ga4-events.js.map +1 -0
  54. package/dist/tools/bq-metadata.d.ts +10 -0
  55. package/dist/tools/bq-metadata.d.ts.map +1 -0
  56. package/dist/tools/bq-metadata.js +237 -0
  57. package/dist/tools/bq-metadata.js.map +1 -0
  58. package/dist/tools/bq-query.d.ts +10 -0
  59. package/dist/tools/bq-query.d.ts.map +1 -0
  60. package/dist/tools/bq-query.js +357 -0
  61. package/dist/tools/bq-query.js.map +1 -0
  62. package/dist/tools/metadata.d.ts +11 -0
  63. package/dist/tools/metadata.d.ts.map +1 -0
  64. package/dist/tools/metadata.js +135 -0
  65. package/dist/tools/metadata.js.map +1 -0
  66. package/dist/tools/query.d.ts +10 -0
  67. package/dist/tools/query.d.ts.map +1 -0
  68. package/dist/tools/query.js +188 -0
  69. package/dist/tools/query.js.map +1 -0
  70. package/package.json +53 -0
package/README.md ADDED
@@ -0,0 +1,230 @@
1
+ # Careerly GA4 MCP Server
2
+
3
+ Claude Code에서 자연어로 GA4 데이터를 분석하는 MCP(Model Context Protocol) 서버입니다.
4
+
5
+ ## 빠른 시작
6
+
7
+ ```bash
8
+ # 1. Service Account JSON 키 파일이 있는 폴더에서 실행
9
+ cd /path/to/your/project
10
+
11
+ # 2. 설정 실행 (키 파일 자동 탐지 + Claude Code 자동 등록!)
12
+ npx careerly-ga4-mcp setup
13
+
14
+ # 3. Claude Code 재시작 후 /mcp 확인!
15
+ ```
16
+
17
+ ### 자동 설정 기능
18
+
19
+ `setup` 명령어는 다음을 자동으로 처리합니다:
20
+
21
+ 1. **Service Account 키 파일 자동 탐지** - 현재 폴더에서 JSON 파일 스캔
22
+ 2. **GA4 연결 테스트** - Property ID와 키 파일 검증
23
+ 3. **Claude Code MCP 자동 등록** - `claude mcp add` 명령어로 자동 설정
24
+
25
+ ```
26
+ Careerly GA4 MCP Server
27
+ ─────────────────────────────────────
28
+
29
+ ✔ GA4 Property ID 517059569
30
+ ✔ 1개의 Service Account 키 파일 발견
31
+ ✔ 사용할 키 파일 선택 my-project-key.json (my-project-id)
32
+ ✔ 연결 성공!
33
+ ✔ Claude Code MCP 서버 등록 완료
34
+
35
+ ✓ 설정 완료!
36
+ ```
37
+
38
+ ## 사전 준비
39
+
40
+ ### 1. Google Cloud 설정
41
+
42
+ 1. [Google Cloud Console](https://console.cloud.google.com/)에서 프로젝트 생성
43
+ 2. **Google Analytics Data API** 활성화
44
+ 3. **서비스 계정** 생성 후 JSON 키 다운로드
45
+
46
+ ### 2. GA4 권한 설정
47
+
48
+ 1. [GA4 Admin](https://analytics.google.com/) > 속성 설정 > 속성 액세스 관리
49
+ 2. 서비스 계정 이메일 추가 (뷰어/읽기 전용 권한)
50
+
51
+ > **Tip**: Service Account 이메일은 JSON 키 파일의 `client_email` 필드에서 확인할 수 있습니다.
52
+
53
+ ## 기능
54
+
55
+ | Tool | 설명 |
56
+ |------|------|
57
+ | `ga4_query` | GA4 데이터 조회 + 인사이트 생성 |
58
+ | `ga4_metadata` | 지표/차원 목록 확인 |
59
+ | `ga4_status` | 연결 상태 확인 |
60
+
61
+ ## 사용 예시
62
+
63
+ Claude Code에서 자연어로 질문:
64
+
65
+ ```
66
+ "지난 7일 세션수 보여줘"
67
+ "채널별 전환수 알려줘"
68
+ "어제 대비 오늘 트래픽 어때?"
69
+ "랜딩 페이지별 이탈률 분석해줘"
70
+ "캠페인별 성과 비교해줘"
71
+ ```
72
+
73
+ ## CLI 명령어
74
+
75
+ ```bash
76
+ # 인터랙티브 메뉴
77
+ npx careerly-ga4-mcp
78
+
79
+ # 초기 설정 (자동 키 파일 탐지 + Claude Code 자동 등록)
80
+ npx careerly-ga4-mcp setup
81
+
82
+ # 서버 정보 확인
83
+ npx careerly-ga4-mcp info
84
+
85
+ # GA4 연결 테스트
86
+ npx careerly-ga4-mcp test-connection
87
+
88
+ # MCP 서버 시작 (수동)
89
+ npx careerly-ga4-mcp serve
90
+ ```
91
+
92
+ ## 인터랙티브 메뉴
93
+
94
+ ```bash
95
+ npx careerly-ga4-mcp
96
+ ```
97
+
98
+ ```
99
+ Careerly GA4 MCP Server
100
+ ─────────────────────────────────────
101
+
102
+ Status: ✓ connected
103
+ Property ID: 123456789
104
+ Credentials: ~/project/service-account.json
105
+ Tools: 3 tools
106
+
107
+ ? 선택하세요
108
+ ❯ View tools
109
+ Reconnect
110
+ Test connection
111
+ Disable
112
+ ```
113
+
114
+ ## 수동 설정
115
+
116
+ ### Claude CLI로 추가
117
+
118
+ ```bash
119
+ claude mcp add careerly-ga4 \
120
+ -s user \
121
+ -e GA4_PROPERTY_ID=123456789 \
122
+ -e GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json \
123
+ -- npx -y careerly-ga4-mcp serve
124
+ ```
125
+
126
+ ### 설정 파일 직접 수정
127
+
128
+ `~/.claude/settings.local.json`에 직접 추가:
129
+
130
+ ```json
131
+ {
132
+ "mcpServers": {
133
+ "careerly-ga4": {
134
+ "command": "npx",
135
+ "args": ["-y", "careerly-ga4-mcp", "serve"],
136
+ "env": {
137
+ "GA4_PROPERTY_ID": "123456789",
138
+ "GOOGLE_APPLICATION_CREDENTIALS": "/path/to/service-account.json"
139
+ }
140
+ }
141
+ }
142
+ }
143
+ ```
144
+
145
+ ## 문제 해결
146
+
147
+ ### MCP 서버가 `/mcp`에 안 보여요
148
+
149
+ 1. Claude Code를 완전히 종료 후 재시작
150
+ 2. 설정 확인: `claude mcp list`
151
+ 3. 재설정: `npx careerly-ga4-mcp setup`
152
+
153
+ ### PERMISSION_DENIED 에러
154
+
155
+ GA4에 Service Account 권한이 없습니다:
156
+
157
+ 1. GA4 Admin > 속성 설정 > 속성 액세스 관리
158
+ 2. Service Account 이메일 추가 (JSON의 `client_email`)
159
+ 3. 역할: 뷰어 (읽기 전용)
160
+
161
+ ### 설정 삭제
162
+
163
+ ```bash
164
+ # Claude CLI로 삭제
165
+ claude mcp remove careerly-ga4 -s user
166
+
167
+ # 또는 인터랙티브 메뉴에서
168
+ npx careerly-ga4-mcp
169
+ # → Disable 선택
170
+ ```
171
+
172
+ ## Tool 스키마
173
+
174
+ ### ga4_query
175
+
176
+ ```typescript
177
+ {
178
+ metrics: string[] // 필수: ["sessions", "totalUsers", "conversions"]
179
+ dimensions?: string[] // 선택: ["date", "sessionDefaultChannelGroup"]
180
+ startDate?: string // 기본: "7daysAgo"
181
+ endDate?: string // 기본: "today"
182
+ datePreset?: string // "last_7_days", "last_30_days" 등
183
+ limit?: number // 기본: 10
184
+ }
185
+ ```
186
+
187
+ ### 지표 (Metrics)
188
+
189
+ | 지표 | 설명 |
190
+ |------|------|
191
+ | `sessions` | 세션 수 |
192
+ | `totalUsers` | 전체 사용자 |
193
+ | `newUsers` | 신규 사용자 |
194
+ | `activeUsers` | 활성 사용자 |
195
+ | `bounceRate` | 이탈률 |
196
+ | `conversions` | 전환 수 |
197
+ | `screenPageViews` | 페이지뷰 |
198
+ | `engagementRate` | 참여율 |
199
+
200
+ ### 차원 (Dimensions)
201
+
202
+ | 차원 | 설명 |
203
+ |------|------|
204
+ | `date` | 날짜 |
205
+ | `sessionDefaultChannelGroup` | 채널 |
206
+ | `sessionSourceMedium` | 소스/매체 |
207
+ | `sessionCampaignName` | 캠페인 |
208
+ | `landingPage` | 랜딩 페이지 |
209
+ | `deviceCategory` | 디바이스 |
210
+ | `country` | 국가 |
211
+
212
+ ## 개발
213
+
214
+ ```bash
215
+ # 의존성 설치
216
+ npm install
217
+
218
+ # 빌드
219
+ npm run build
220
+
221
+ # 개발 모드
222
+ npm run dev
223
+
224
+ # 타입 체크
225
+ npm run typecheck
226
+ ```
227
+
228
+ ## 라이선스
229
+
230
+ MIT
@@ -0,0 +1,18 @@
1
+ /**
2
+ * BigQuery 인증 모듈
3
+ * GA4 auth.ts와 유사한 패턴
4
+ */
5
+ import { BigQueryConfig } from "./types.js";
6
+ /**
7
+ * 환경 변수에서 BigQuery 설정 로드
8
+ */
9
+ export declare function loadBigQueryConfigFromEnv(): BigQueryConfig;
10
+ /**
11
+ * 설정 검증 및 초기화
12
+ */
13
+ export declare function initializeBigQueryAuth(config?: Partial<BigQueryConfig>): BigQueryConfig;
14
+ /**
15
+ * Project ID 검증
16
+ */
17
+ export declare function validateProjectId(projectId: string): boolean;
18
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/bigquery/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAE3D;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,cAAc,CAe1D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,cAAc,CAqBhB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAI5D"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * BigQuery 인증 모듈
3
+ * GA4 auth.ts와 유사한 패턴
4
+ */
5
+ import { BigQueryError } from "./types.js";
6
+ /**
7
+ * 환경 변수에서 BigQuery 설정 로드
8
+ */
9
+ export function loadBigQueryConfigFromEnv() {
10
+ const projectId = process.env.BQ_PROJECT_ID || process.env.GOOGLE_CLOUD_PROJECT;
11
+ const credentialsPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;
12
+ const location = process.env.BQ_LOCATION || "US";
13
+ if (!projectId) {
14
+ throw new BigQueryError("BQ_PROJECT_ID 또는 GOOGLE_CLOUD_PROJECT 환경 변수가 설정되지 않았습니다.\n" +
15
+ "설정 방법: export BQ_PROJECT_ID=your-project-id", "CONFIG_ERROR");
16
+ }
17
+ return { projectId, credentialsPath, location };
18
+ }
19
+ /**
20
+ * 설정 검증 및 초기화
21
+ */
22
+ export function initializeBigQueryAuth(config) {
23
+ const envConfig = loadBigQueryConfigFromEnv();
24
+ const finalConfig = {
25
+ projectId: config?.projectId || envConfig.projectId,
26
+ credentialsPath: config?.credentialsPath || envConfig.credentialsPath,
27
+ location: config?.location || envConfig.location,
28
+ };
29
+ // 자격증명 파일 경로가 설정되어 있으면 로그 출력
30
+ if (finalConfig.credentialsPath) {
31
+ console.error(`[BigQuery] Service Account: ${finalConfig.credentialsPath}`);
32
+ }
33
+ else {
34
+ console.error("[BigQuery] Application Default Credentials(ADC) 사용 중");
35
+ }
36
+ return finalConfig;
37
+ }
38
+ /**
39
+ * Project ID 검증
40
+ */
41
+ export function validateProjectId(projectId) {
42
+ // GCP 프로젝트 ID 규칙: 6-30자, 소문자/숫자/하이픈
43
+ const projectIdRegex = /^[a-z][a-z0-9-]{4,28}[a-z0-9]$/;
44
+ return projectIdRegex.test(projectId);
45
+ }
46
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/bigquery/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAkB,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAChE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;IACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC;IAEjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CACrB,4DAA4D;YAC1D,6CAA6C,EAC/C,cAAc,CACf,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAgC;IAEhC,MAAM,SAAS,GAAG,yBAAyB,EAAE,CAAC;IAE9C,MAAM,WAAW,GAAmB;QAClC,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS,CAAC,SAAS;QACnD,eAAe,EAAE,MAAM,EAAE,eAAe,IAAI,SAAS,CAAC,eAAe;QACrE,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS,CAAC,QAAQ;KACjD,CAAC;IAEF,6BAA6B;IAC7B,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CACX,+BAA+B,WAAW,CAAC,eAAe,EAAE,CAC7D,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CACX,sDAAsD,CACvD,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,oCAAoC;IACpC,MAAM,cAAc,GAAG,gCAAgC,CAAC;IACxD,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * BigQuery 클라이언트
3
+ * @google-cloud/bigquery 래퍼
4
+ */
5
+ import type { BigQueryConfig, BigQueryRequest, BigQueryResponse, GA4EventsRequest, DatasetInfo, TableInfo } from "./types.js";
6
+ export declare class BigQueryClient {
7
+ private client;
8
+ private projectId;
9
+ private location;
10
+ constructor(config?: Partial<BigQueryConfig>);
11
+ /**
12
+ * 연결 테스트
13
+ */
14
+ testConnection(): Promise<{
15
+ success: boolean;
16
+ message: string;
17
+ }>;
18
+ /**
19
+ * 파라미터 기반 쿼리 실행
20
+ */
21
+ runQuery(request: BigQueryRequest): Promise<BigQueryResponse>;
22
+ /**
23
+ * GA4 Export 이벤트 쿼리 실행
24
+ */
25
+ runGA4EventsQuery(request: GA4EventsRequest): Promise<BigQueryResponse>;
26
+ /**
27
+ * 데이터셋 목록 조회
28
+ */
29
+ listDatasets(): Promise<DatasetInfo[]>;
30
+ /**
31
+ * 테이블 목록 조회
32
+ */
33
+ listTables(datasetId: string): Promise<TableInfo[]>;
34
+ /**
35
+ * 테이블 스키마 조회
36
+ */
37
+ getTableSchema(datasetId: string, tableId: string): Promise<TableInfo>;
38
+ /**
39
+ * SELECT 쿼리 빌드 (SQL Injection 방지)
40
+ */
41
+ private buildSelectQuery;
42
+ /**
43
+ * GA4 Export 쿼리 빌드
44
+ */
45
+ private buildGA4EventsQuery;
46
+ /**
47
+ * WHERE 조건 빌드
48
+ */
49
+ private buildWhereCondition;
50
+ /**
51
+ * 집계 함수 빌드
52
+ */
53
+ private buildAggregation;
54
+ /**
55
+ * 식별자 이스케이프 (SQL Injection 방지)
56
+ */
57
+ private escapeIdentifier;
58
+ /**
59
+ * 스키마 변환
60
+ */
61
+ private transformSchema;
62
+ /**
63
+ * 에러 처리
64
+ */
65
+ private handleError;
66
+ /**
67
+ * Project ID 반환
68
+ */
69
+ getProjectId(): string;
70
+ /**
71
+ * Location 반환
72
+ */
73
+ getLocation(): string;
74
+ }
75
+ export declare function getBigQueryClient(config?: Partial<BigQueryConfig>): BigQueryClient;
76
+ export declare function resetBigQueryClient(): void;
77
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/bigquery/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,SAAS,EAIV,MAAM,YAAY,CAAC;AAIpB,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAW5C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBtE;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+BnE;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,gBAAgB,CAAC;IA+B5B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAqB5C;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAgCzD;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC;IAgCrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4ExB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiH3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmE3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,CAAC,WAAW;IAuDnB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB;AAKD,wBAAgB,iBAAiB,CAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,cAAc,CAKhB;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}