@decohere/create 0.0.1-dev.16 → 0.0.1-dev.18

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 (186) hide show
  1. package/commonjs/src/cli.js +26 -5
  2. package/commonjs/src/models/compose.model.js +82 -0
  3. package/commonjs/src/models/config-yaml.model.js +34 -0
  4. package/commonjs/src/models/const.js +29 -0
  5. package/commonjs/src/models/container-image.model.js +88 -0
  6. package/commonjs/src/models/dev-container.model.js +73 -0
  7. package/commonjs/src/models/env-file.model.js +33 -0
  8. package/commonjs/src/models/gitignore.model.js +32 -0
  9. package/commonjs/src/models/launch-json.model.js +52 -0
  10. package/commonjs/src/models/package-json.model.js +64 -0
  11. package/commonjs/src/models/project.model.js +126 -0
  12. package/commonjs/src/models/source-file.js +6 -0
  13. package/commonjs/src/models/tsconfig.model.js +34 -0
  14. package/commonjs/src/models/vscode-settings.model.js +31 -0
  15. package/commonjs/src/services/scaffold.service.js +62 -0
  16. package/commonjs/src/webapi/create-api.js +169 -0
  17. package/commonjs/src/webapi/features/auth.feature.js +166 -0
  18. package/commonjs/src/webapi/features/auth0-cli.js +151 -0
  19. package/commonjs/src/webapi/features/database.feature.js +151 -0
  20. package/commonjs/src/webapi/features/finalize.feature.js +46 -0
  21. package/commonjs/src/webapi/features/postman.feature.js +309 -0
  22. package/commonjs/src/webapi/models/api-package-json.model.js +57 -0
  23. package/commonjs/src/webapi/models/auth-config.model.js +23 -0
  24. package/commonjs/src/webapi/models/controller-source-file.model.js +180 -0
  25. package/commonjs/src/webapi/models/main-source-file.model.js +132 -0
  26. package/commonjs/src/webapi/models/sample-files.model.js +60 -0
  27. package/commonjs/v1/cli.js +15 -0
  28. package/commonjs/v1/domain/class-model.js +106 -0
  29. package/commonjs/v1/domain/compose.model.js +74 -0
  30. package/commonjs/v1/domain/context.js +53 -0
  31. package/commonjs/v1/domain/devcontainer.model.js +116 -0
  32. package/commonjs/v1/domain/dockerfile.model.js +62 -0
  33. package/commonjs/v1/domain/feature.js +19 -0
  34. package/commonjs/v1/domain/import-map.js +74 -0
  35. package/commonjs/v1/domain/index.js +68 -0
  36. package/commonjs/v1/domain/prompt.js +45 -0
  37. package/commonjs/v1/domain/workflow.js +37 -0
  38. package/commonjs/v1/features/api-core/feature.js +103 -0
  39. package/commonjs/v1/features/api-core/hello-controller.model.js +100 -0
  40. package/commonjs/v1/features/api-core/main-ts.model.js +85 -0
  41. package/commonjs/v1/features/api-core/scaffold-files.template.js +158 -0
  42. package/commonjs/v1/features/auth0/auth0-cli.js +151 -0
  43. package/commonjs/v1/features/auth0/feature.js +187 -0
  44. package/commonjs/v1/features/auth0/models.js +14 -0
  45. package/commonjs/v1/features/auth0/prod-config.template.js +19 -0
  46. package/commonjs/v1/features/cli-core/feature.js +37 -0
  47. package/commonjs/v1/features/cli-core/scaffold-files.template.js +103 -0
  48. package/commonjs/v1/features/devcontainer/feature.js +38 -0
  49. package/commonjs/v1/features/finalize/feature.js +48 -0
  50. package/commonjs/v1/features/postgresql/feature.js +81 -0
  51. package/commonjs/v1/features/postgresql/models.js +14 -0
  52. package/commonjs/v1/features/postman/collection.template.js +80 -0
  53. package/commonjs/v1/features/postman/environment.template.js +24 -0
  54. package/commonjs/v1/features/postman/feature.js +192 -0
  55. package/commonjs/v1/features/typeorm/feature.js +66 -0
  56. package/commonjs/v1/features/typeorm/scaffold-files.template.js +80 -0
  57. package/commonjs/v1/scaffold.js +50 -0
  58. package/commonjs/v1/version.js +32 -0
  59. package/commonjs/v1/workflows/api.js +29 -0
  60. package/commonjs/v1/workflows/cli.js +19 -0
  61. package/es6/src/cli.js +26 -5
  62. package/es6/src/models/compose.model.js +77 -0
  63. package/es6/src/models/config-yaml.model.js +30 -0
  64. package/es6/src/models/const.js +19 -0
  65. package/es6/src/models/container-image.model.js +84 -0
  66. package/es6/src/models/dev-container.model.js +68 -0
  67. package/es6/src/models/env-file.model.js +29 -0
  68. package/es6/src/models/gitignore.model.js +22 -0
  69. package/es6/src/models/launch-json.model.js +42 -0
  70. package/es6/src/models/package-json.model.js +60 -0
  71. package/es6/src/models/project.model.js +111 -0
  72. package/es6/src/models/source-file.js +3 -0
  73. package/es6/src/models/tsconfig.model.js +24 -0
  74. package/es6/src/models/vscode-settings.model.js +21 -0
  75. package/es6/src/services/scaffold.service.js +52 -0
  76. package/es6/src/webapi/create-api.js +151 -0
  77. package/es6/src/webapi/features/auth.feature.js +115 -0
  78. package/es6/src/webapi/features/auth0-cli.js +116 -0
  79. package/es6/src/webapi/features/database.feature.js +141 -0
  80. package/es6/src/webapi/features/finalize.feature.js +36 -0
  81. package/es6/src/webapi/features/postman.feature.js +258 -0
  82. package/es6/src/webapi/models/api-package-json.model.js +52 -0
  83. package/es6/src/webapi/models/auth-config.model.js +19 -0
  84. package/es6/src/webapi/models/controller-source-file.model.js +171 -0
  85. package/es6/src/webapi/models/main-source-file.model.js +128 -0
  86. package/es6/src/webapi/models/sample-files.model.js +42 -0
  87. package/es6/v1/cli.js +11 -0
  88. package/es6/v1/domain/class-model.js +104 -0
  89. package/es6/v1/domain/compose.model.js +61 -0
  90. package/es6/v1/domain/context.js +37 -0
  91. package/es6/v1/domain/devcontainer.model.js +104 -0
  92. package/es6/v1/domain/dockerfile.model.js +52 -0
  93. package/es6/v1/domain/feature.js +9 -0
  94. package/es6/v1/domain/import-map.js +64 -0
  95. package/es6/v1/domain/index.js +11 -0
  96. package/es6/v1/domain/prompt.js +27 -0
  97. package/es6/v1/domain/workflow.js +24 -0
  98. package/es6/v1/features/api-core/feature.js +93 -0
  99. package/es6/v1/features/api-core/hello-controller.model.js +96 -0
  100. package/es6/v1/features/api-core/main-ts.model.js +74 -0
  101. package/es6/v1/features/api-core/scaffold-files.template.js +116 -0
  102. package/es6/v1/features/auth0/auth0-cli.js +116 -0
  103. package/es6/v1/features/auth0/feature.js +136 -0
  104. package/es6/v1/features/auth0/models.js +4 -0
  105. package/es6/v1/features/auth0/prod-config.template.js +9 -0
  106. package/es6/v1/features/cli-core/feature.js +27 -0
  107. package/es6/v1/features/cli-core/scaffold-files.template.js +73 -0
  108. package/es6/v1/features/devcontainer/feature.js +28 -0
  109. package/es6/v1/features/finalize/feature.js +38 -0
  110. package/es6/v1/features/postgresql/feature.js +71 -0
  111. package/es6/v1/features/postgresql/models.js +4 -0
  112. package/es6/v1/features/postman/collection.template.js +70 -0
  113. package/es6/v1/features/postman/environment.template.js +14 -0
  114. package/es6/v1/features/postman/feature.js +141 -0
  115. package/es6/v1/features/typeorm/feature.js +56 -0
  116. package/es6/v1/features/typeorm/scaffold-files.template.js +56 -0
  117. package/es6/v1/scaffold.js +40 -0
  118. package/es6/v1/version.js +22 -0
  119. package/es6/v1/workflows/api.js +25 -0
  120. package/es6/v1/workflows/cli.js +9 -0
  121. package/package.json +2 -2
  122. package/types/src/models/compose.model.d.ts +32 -0
  123. package/types/src/models/config-yaml.model.d.ts +16 -0
  124. package/types/src/models/const.d.ts +17 -0
  125. package/types/src/models/container-image.model.d.ts +15 -0
  126. package/types/src/models/dev-container.model.d.ts +21 -0
  127. package/types/src/models/env-file.model.d.ts +14 -0
  128. package/types/src/models/gitignore.model.d.ts +6 -0
  129. package/types/src/models/launch-json.model.d.ts +5 -0
  130. package/types/src/models/package-json.model.d.ts +18 -0
  131. package/types/src/models/project.model.d.ts +55 -0
  132. package/types/src/models/source-file.d.ts +11 -0
  133. package/types/src/models/tsconfig.model.d.ts +5 -0
  134. package/types/src/models/vscode-settings.model.d.ts +7 -0
  135. package/types/src/services/scaffold.service.d.ts +22 -0
  136. package/types/src/webapi/create-api.d.ts +7 -0
  137. package/types/src/webapi/features/auth.feature.d.ts +7 -0
  138. package/types/src/webapi/features/auth0-cli.d.ts +22 -0
  139. package/types/src/webapi/features/database.feature.d.ts +5 -0
  140. package/types/src/webapi/features/finalize.feature.d.ts +2 -0
  141. package/types/src/webapi/features/postman.feature.d.ts +7 -0
  142. package/types/src/webapi/models/api-package-json.model.d.ts +17 -0
  143. package/types/src/webapi/models/auth-config.model.d.ts +18 -0
  144. package/types/src/webapi/models/controller-source-file.model.d.ts +42 -0
  145. package/types/src/webapi/models/main-source-file.model.d.ts +36 -0
  146. package/types/src/webapi/models/sample-files.model.d.ts +7 -0
  147. package/types/v1/cli.d.ts +2 -0
  148. package/types/v1/domain/class-model.d.ts +70 -0
  149. package/types/v1/domain/compose.model.d.ts +25 -0
  150. package/types/v1/domain/context.d.ts +36 -0
  151. package/types/v1/domain/devcontainer.model.d.ts +35 -0
  152. package/types/v1/domain/dockerfile.model.d.ts +11 -0
  153. package/types/v1/domain/feature.d.ts +29 -0
  154. package/types/v1/domain/import-map.d.ts +24 -0
  155. package/types/v1/domain/index.d.ts +12 -0
  156. package/types/v1/domain/prompt.d.ts +2 -0
  157. package/types/v1/domain/workflow.d.ts +14 -0
  158. package/types/v1/features/api-core/feature.d.ts +2 -0
  159. package/types/v1/features/api-core/hello-controller.model.d.ts +9 -0
  160. package/types/v1/features/api-core/main-ts.model.d.ts +31 -0
  161. package/types/v1/features/api-core/scaffold-files.template.d.ts +10 -0
  162. package/types/v1/features/auth0/auth0-cli.d.ts +22 -0
  163. package/types/v1/features/auth0/feature.d.ts +2 -0
  164. package/types/v1/features/auth0/models.d.ts +5 -0
  165. package/types/v1/features/auth0/prod-config.template.d.ts +1 -0
  166. package/types/v1/features/cli-core/feature.d.ts +2 -0
  167. package/types/v1/features/cli-core/scaffold-files.template.d.ts +6 -0
  168. package/types/v1/features/devcontainer/feature.d.ts +2 -0
  169. package/types/v1/features/finalize/feature.d.ts +2 -0
  170. package/types/v1/features/postgresql/feature.d.ts +2 -0
  171. package/types/v1/features/postgresql/models.d.ts +6 -0
  172. package/types/v1/features/postman/collection.template.d.ts +1 -0
  173. package/types/v1/features/postman/environment.template.d.ts +6 -0
  174. package/types/v1/features/postman/feature.d.ts +2 -0
  175. package/types/v1/features/typeorm/feature.d.ts +2 -0
  176. package/types/v1/features/typeorm/scaffold-files.template.d.ts +9 -0
  177. package/types/v1/scaffold.d.ts +3 -0
  178. package/types/v1/version.d.ts +2 -0
  179. package/types/v1/workflows/api.d.ts +8 -0
  180. package/types/v1/workflows/cli.d.ts +1 -0
  181. package/commonjs/src/scaffold.js +0 -89
  182. package/commonjs/src/templates.js +0 -305
  183. package/es6/src/scaffold.js +0 -79
  184. package/es6/src/templates.js +0 -245
  185. package/types/src/scaffold.d.ts +0 -6
  186. package/types/src/templates.d.ts +0 -20
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "PostmanFeature", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return PostmanFeature;
9
+ }
10
+ });
11
+ const _prompt = require("../../../v1/domain/prompt.js");
12
+ const _const = require("../../models/const.js");
13
+ const _auth0cli = /*#__PURE__*/ _interop_require_wildcard(require("./auth0-cli.js"));
14
+ function _getRequireWildcardCache(nodeInterop) {
15
+ if (typeof WeakMap !== "function") return null;
16
+ var cacheBabelInterop = new WeakMap();
17
+ var cacheNodeInterop = new WeakMap();
18
+ return (_getRequireWildcardCache = function(nodeInterop) {
19
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
20
+ })(nodeInterop);
21
+ }
22
+ function _interop_require_wildcard(obj, nodeInterop) {
23
+ if (!nodeInterop && obj && obj.__esModule) {
24
+ return obj;
25
+ }
26
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
27
+ return {
28
+ default: obj
29
+ };
30
+ }
31
+ var cache = _getRequireWildcardCache(nodeInterop);
32
+ if (cache && cache.has(obj)) {
33
+ return cache.get(obj);
34
+ }
35
+ var newObj = {
36
+ __proto__: null
37
+ };
38
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
39
+ for(var key in obj){
40
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
41
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
42
+ if (desc && (desc.get || desc.set)) {
43
+ Object.defineProperty(newObj, key, desc);
44
+ } else {
45
+ newObj[key] = obj[key];
46
+ }
47
+ }
48
+ }
49
+ newObj.default = obj;
50
+ if (cache) {
51
+ cache.set(obj, newObj);
52
+ }
53
+ return newObj;
54
+ }
55
+ async function getOptions(_workspace, cliOptions) {
56
+ if (cliOptions.postmanProvider != null) return {};
57
+ const choices = [
58
+ {
59
+ label: "none",
60
+ description: "skip"
61
+ },
62
+ {
63
+ label: "local",
64
+ description: "write collection + environment files"
65
+ },
66
+ {
67
+ label: "api",
68
+ description: "write files and upload to Postman.com"
69
+ }
70
+ ];
71
+ const selected = await (0, _prompt.pick)("\n Postman: ", choices, (c)=>`${c.label} — ${c.description}`);
72
+ const provider = selected?.label ?? "none";
73
+ if (provider === "none") return {
74
+ postmanProvider: "none"
75
+ };
76
+ if (provider === "local") return {
77
+ postmanProvider: "local"
78
+ };
79
+ // api: collect API key + workspace selection
80
+ const apiKey = process.env.POSTMAN_API_KEY ?? await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../../v1/domain/prompt.js"))).then((m)=>m.ask("\n Postman API key (app.getpostman.com/settings/me/api-keys): "));
81
+ const headers = {
82
+ "X-Api-Key": apiKey,
83
+ "Content-Type": "application/json"
84
+ };
85
+ const wsRes = await fetch("https://api.getpostman.com/workspaces", {
86
+ headers
87
+ });
88
+ if (!wsRes.ok) {
89
+ console.error("\n Postman API key invalid — falling back to local files.");
90
+ return {
91
+ postmanProvider: "local"
92
+ };
93
+ }
94
+ const { workspaces } = await wsRes.json();
95
+ const wsChoices = [
96
+ {
97
+ label: "<new workspace>",
98
+ id: null
99
+ },
100
+ ...workspaces.map((w)=>({
101
+ label: `${w.name} (${w.type})`,
102
+ id: w.id
103
+ }))
104
+ ];
105
+ const wsPicked = await (0, _prompt.pick)("\n Postman workspace: ", wsChoices, (c)=>c.label);
106
+ let workspaceId;
107
+ if (!wsPicked || wsPicked.id === null) {
108
+ const { ask } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../../v1/domain/prompt.js")));
109
+ const wsName = await ask(` Workspace name: `);
110
+ const createRes = await fetch("https://api.getpostman.com/workspaces", {
111
+ method: "POST",
112
+ headers,
113
+ body: JSON.stringify({
114
+ workspace: {
115
+ name: wsName,
116
+ type: "personal"
117
+ }
118
+ })
119
+ });
120
+ const { workspace: ws } = await createRes.json();
121
+ workspaceId = ws.id;
122
+ console.log(` ✓ Workspace created: ${wsName}`);
123
+ } else {
124
+ workspaceId = wsPicked.id;
125
+ }
126
+ return {
127
+ postmanProvider: "api",
128
+ apiKey,
129
+ workspaceId
130
+ };
131
+ }
132
+ function buildCollection(projectName, auth) {
133
+ const authObj = auth?.auth0Domain ? {
134
+ type: "oauth2",
135
+ oauth2: [
136
+ {
137
+ key: "grant_type",
138
+ value: "authorization_code_with_pkce",
139
+ type: "string"
140
+ },
141
+ {
142
+ key: "authUrl",
143
+ value: "https://{{auth0Domain}}/authorize?audience={{auth0Audience}}",
144
+ type: "string"
145
+ },
146
+ {
147
+ key: "accessTokenUrl",
148
+ value: "https://{{auth0Domain}}/oauth/token",
149
+ type: "string"
150
+ },
151
+ {
152
+ key: "clientId",
153
+ value: "{{auth0ClientId}}",
154
+ type: "string"
155
+ },
156
+ {
157
+ key: "scope",
158
+ value: "openid profile email",
159
+ type: "string"
160
+ },
161
+ {
162
+ key: "addTokenTo",
163
+ value: "header",
164
+ type: "string"
165
+ },
166
+ {
167
+ key: "challengeAlgorithm",
168
+ value: "S256",
169
+ type: "string"
170
+ }
171
+ ]
172
+ } : undefined;
173
+ return {
174
+ info: {
175
+ name: `${projectName} WebAPI`,
176
+ schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
177
+ },
178
+ ...authObj ? {
179
+ auth: authObj
180
+ } : {},
181
+ item: [
182
+ {
183
+ name: "Hello",
184
+ request: {
185
+ method: "GET",
186
+ url: {
187
+ raw: "{{baseUrl}}/hello",
188
+ host: [
189
+ "{{baseUrl}}"
190
+ ],
191
+ path: [
192
+ "hello"
193
+ ]
194
+ }
195
+ }
196
+ }
197
+ ]
198
+ };
199
+ }
200
+ function buildEnvironmentYaml(name, auth) {
201
+ const auth0Section = auth?.auth0Domain ? [
202
+ " - key: auth0Domain",
203
+ ` value: ${auth.auth0Domain}`,
204
+ " - key: auth0Audience",
205
+ ` value: '${auth.auth0Audience ?? ""}'`,
206
+ " - key: auth0ClientId",
207
+ ` value: '${auth.auth0ClientId ?? ""}'`,
208
+ " description: Client ID of the Auth0 SPA application used by Postman for PKCE authentication"
209
+ ].join("\n") + "\n" : "";
210
+ return `name: ${name}\nvalues:\n - key: baseUrl\n value: 'http://localhost:3000'\n${auth0Section}`;
211
+ }
212
+ async function scaffold(workspace, options) {
213
+ if (options.postmanProvider === "none") return;
214
+ const authConfigModel = workspace.getModel(_const.WELL_KNOWN_FILES.AUTH_CONFIG);
215
+ const authCfg = authConfigModel?.config;
216
+ let spaClientId;
217
+ if (options.postmanProvider === "api" && options.apiKey && authCfg?.issuerBaseUrl) {
218
+ try {
219
+ const app = _auth0cli.createSpaApp(`${workspace.name} Postman`, "https://oauth.pstmn.io/v1/callback");
220
+ spaClientId = app.client_id;
221
+ console.log(" ✓ Auth0 SPA app created for Postman PKCE");
222
+ } catch {
223
+ console.error(" ✗ Failed to create Auth0 SPA app — continuing without it.");
224
+ }
225
+ }
226
+ const auth0Env = authCfg?.issuerBaseUrl ? {
227
+ auth0Domain: authCfg.issuerBaseUrl.replace(/^https?:\/\//, ""),
228
+ auth0Audience: authCfg.audience,
229
+ auth0ClientId: spaClientId
230
+ } : undefined;
231
+ const projectName = workspace.name;
232
+ const collection = buildCollection(projectName, auth0Env);
233
+ const envYaml = buildEnvironmentYaml(`${projectName} — Local`, auth0Env);
234
+ workspace.addFile({
235
+ files: ()=>[
236
+ {
237
+ filePath: `postman/environments/${projectName} \u2014 Local.environment.yaml`,
238
+ content: envYaml
239
+ },
240
+ {
241
+ filePath: `postman/collections/${projectName}.postman_collection.json`,
242
+ content: `${JSON.stringify(collection, null, 2)}\n`
243
+ }
244
+ ]
245
+ });
246
+ if (options.postmanProvider === "api" && options.apiKey) {
247
+ const headers = {
248
+ "X-Api-Key": options.apiKey,
249
+ "Content-Type": "application/json"
250
+ };
251
+ const colRes = await fetch(`https://api.getpostman.com/collections?workspace=${options.workspaceId}`, {
252
+ method: "POST",
253
+ headers,
254
+ body: JSON.stringify({
255
+ collection
256
+ })
257
+ });
258
+ if (colRes.ok) {
259
+ console.log(" ✓ Postman collection uploaded");
260
+ } else {
261
+ console.error(" ✗ Failed to upload Postman collection");
262
+ }
263
+ const envVars = [
264
+ {
265
+ key: "baseUrl",
266
+ value: "http://localhost:3000",
267
+ enabled: true
268
+ },
269
+ ...auth0Env?.auth0Domain ? [
270
+ {
271
+ key: "auth0Domain",
272
+ value: auth0Env.auth0Domain,
273
+ enabled: true
274
+ },
275
+ {
276
+ key: "auth0Audience",
277
+ value: auth0Env.auth0Audience ?? "",
278
+ enabled: true
279
+ },
280
+ {
281
+ key: "auth0ClientId",
282
+ value: auth0Env.auth0ClientId ?? "",
283
+ enabled: true
284
+ }
285
+ ] : []
286
+ ];
287
+ const envRes = await fetch(`https://api.getpostman.com/environments?workspace=${options.workspaceId}`, {
288
+ method: "POST",
289
+ headers,
290
+ body: JSON.stringify({
291
+ environment: {
292
+ name: `${projectName} — Local`,
293
+ values: envVars
294
+ }
295
+ })
296
+ });
297
+ if (envRes.ok) {
298
+ console.log(" ✓ Postman environment uploaded");
299
+ } else {
300
+ console.error(" ✗ Failed to upload Postman environment");
301
+ }
302
+ }
303
+ }
304
+ const PostmanFeature = {
305
+ getOptions,
306
+ scaffold
307
+ };
308
+
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4uLy4uLy4uL3YxL2RvbWFpbi9wcm9tcHQuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ29uZmlnTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL2F1dGgtY29uZmlnLm1vZGVsLmpzXCI7XG5pbXBvcnQgKiBhcyBhdXRoMENsaSBmcm9tIFwiLi9hdXRoMC1jbGkuanNcIjtcblxuZXhwb3J0IHR5cGUgUG9zdG1hbk9wdGlvbnMgPSB7XG5cdHBvc3RtYW5Qcm92aWRlcj86IFwiYXBpXCIgfCBcImxvY2FsXCIgfCBcIm5vbmVcIjtcblx0YXBpS2V5Pzogc3RyaW5nO1xuXHR3b3Jrc3BhY2VJZD86IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnMoXG5cdF93b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPFBvc3RtYW5PcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxQb3N0bWFuT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMucG9zdG1hblByb3ZpZGVyICE9IG51bGwpIHJldHVybiB7fTtcblxuXHRjb25zdCBjaG9pY2VzID0gW1xuXHRcdHsgbGFiZWw6IFwibm9uZVwiIGFzIGNvbnN0LCBkZXNjcmlwdGlvbjogXCJza2lwXCIgfSxcblx0XHR7IGxhYmVsOiBcImxvY2FsXCIgYXMgY29uc3QsIGRlc2NyaXB0aW9uOiBcIndyaXRlIGNvbGxlY3Rpb24gKyBlbnZpcm9ubWVudCBmaWxlc1wiIH0sXG5cdFx0eyBsYWJlbDogXCJhcGlcIiBhcyBjb25zdCwgZGVzY3JpcHRpb246IFwid3JpdGUgZmlsZXMgYW5kIHVwbG9hZCB0byBQb3N0bWFuLmNvbVwiIH0sXG5cdF07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcblx0XHRcIlxcbiAgUG9zdG1hbjogXCIsXG5cdFx0Y2hvaWNlcyxcblx0XHQoYykgPT4gYCR7Yy5sYWJlbH0g4oCUICR7Yy5kZXNjcmlwdGlvbn1gLFxuXHQpO1xuXHRjb25zdCBwcm92aWRlciA9IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIjtcblxuXHRpZiAocHJvdmlkZXIgPT09IFwibm9uZVwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibm9uZVwiIH07XG5cdGlmIChwcm92aWRlciA9PT0gXCJsb2NhbFwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibG9jYWxcIiB9O1xuXG5cdC8vIGFwaTogY29sbGVjdCBBUEkga2V5ICsgd29ya3NwYWNlIHNlbGVjdGlvblxuXHRjb25zdCBhcGlLZXkgPVxuXHRcdHByb2Nlc3MuZW52LlBPU1RNQU5fQVBJX0tFWSA/P1xuXHRcdChhd2FpdCBpbXBvcnQoXCIuLi8uLi8uLi92MS9kb21haW4vcHJvbXB0LmpzXCIpLnRoZW4oKG0pID0+XG5cdFx0XHRtLmFzayhcIlxcbiAgUG9zdG1hbiBBUEkga2V5IChhcHAuZ2V0cG9zdG1hbi5jb20vc2V0dGluZ3MvbWUvYXBpLWtleXMpOiBcIiksXG5cdFx0KSk7XG5cblx0Y29uc3QgaGVhZGVycyA9IHsgXCJYLUFwaS1LZXlcIjogYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXHRjb25zdCB3c1JlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7IGhlYWRlcnMgfSk7XG5cblx0aWYgKCF3c1Jlcy5vaykge1xuXHRcdGNvbnNvbGUuZXJyb3IoXCJcXG4gIFBvc3RtYW4gQVBJIGtleSBpbnZhbGlkIOKAlCBmYWxsaW5nIGJhY2sgdG8gbG9jYWwgZmlsZXMuXCIpO1xuXHRcdHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJsb2NhbFwiIH07XG5cdH1cblxuXHRjb25zdCB7IHdvcmtzcGFjZXMgfSA9IChhd2FpdCB3c1Jlcy5qc29uKCkpIGFzIHtcblx0XHR3b3Jrc3BhY2VzOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuXHR9O1xuXG5cdHR5cGUgV3NDaG9pY2UgPSB7IGxhYmVsOiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudWxsIH07XG5cdGNvbnN0IHdzQ2hvaWNlczogV3NDaG9pY2VbXSA9IFtcblx0XHR7IGxhYmVsOiBcIjxuZXcgd29ya3NwYWNlPlwiLCBpZDogbnVsbCB9LFxuXHRcdC4uLndvcmtzcGFjZXMubWFwKCh3KSA9PiAoeyBsYWJlbDogYCR7dy5uYW1lfSAoJHt3LnR5cGV9KWAsIGlkOiB3LmlkIH0pKSxcblx0XTtcblxuXHRjb25zdCB3c1BpY2tlZCA9IGF3YWl0IHBpY2soXCJcXG4gIFBvc3RtYW4gd29ya3NwYWNlOiBcIiwgd3NDaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cblx0bGV0IHdvcmtzcGFjZUlkOiBzdHJpbmc7XG5cdGlmICghd3NQaWNrZWQgfHwgd3NQaWNrZWQuaWQgPT09IG51bGwpIHtcblx0XHRjb25zdCB7IGFzayB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vLi4vdjEvZG9tYWluL3Byb21wdC5qc1wiKTtcblx0XHRjb25zdCB3c05hbWUgPSBhd2FpdCBhc2soYCAgV29ya3NwYWNlIG5hbWU6IGApO1xuXHRcdGNvbnN0IGNyZWF0ZVJlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7XG5cdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0aGVhZGVycyxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgd29ya3NwYWNlOiB7IG5hbWU6IHdzTmFtZSwgdHlwZTogXCJwZXJzb25hbFwiIH0gfSksXG5cdFx0fSk7XG5cdFx0Y29uc3QgeyB3b3Jrc3BhY2U6IHdzIH0gPSAoYXdhaXQgY3JlYXRlUmVzLmpzb24oKSkgYXMgeyB3b3Jrc3BhY2U6IHsgaWQ6IHN0cmluZyB9IH07XG5cdFx0d29ya3NwYWNlSWQgPSB3cy5pZDtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgV29ya3NwYWNlIGNyZWF0ZWQ6ICR7d3NOYW1lfWApO1xuXHR9IGVsc2Uge1xuXHRcdHdvcmtzcGFjZUlkID0gd3NQaWNrZWQuaWQ7XG5cdH1cblxuXHRyZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwiYXBpXCIsIGFwaUtleSwgd29ya3NwYWNlSWQgfTtcbn1cblxudHlwZSBBdXRoMEVudiA9IHtcblx0YXV0aDBEb21haW4/OiBzdHJpbmc7XG5cdGF1dGgwQXVkaWVuY2U/OiBzdHJpbmc7XG5cdGF1dGgwQ2xpZW50SWQ/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBidWlsZENvbGxlY3Rpb24ocHJvamVjdE5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KTogdW5rbm93biB7XG5cdGNvbnN0IGF1dGhPYmogPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8ge1xuXHRcdFx0XHR0eXBlOiBcIm9hdXRoMlwiLFxuXHRcdFx0XHRvYXV0aDI6IFtcblx0XHRcdFx0XHR7IGtleTogXCJncmFudF90eXBlXCIsIHZhbHVlOiBcImF1dGhvcml6YXRpb25fY29kZV93aXRoX3BrY2VcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJodHRwczovL3t7YXV0aDBEb21haW59fS9hdXRob3JpemU/YXVkaWVuY2U9e3thdXRoMEF1ZGllbmNlfX1cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRrZXk6IFwiYWNjZXNzVG9rZW5VcmxcIixcblx0XHRcdFx0XHRcdHZhbHVlOiBcImh0dHBzOi8ve3thdXRoMERvbWFpbn19L29hdXRoL3Rva2VuXCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2xpZW50SWRcIiwgdmFsdWU6IFwie3thdXRoMENsaWVudElkfX1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcInNjb3BlXCIsIHZhbHVlOiBcIm9wZW5pZCBwcm9maWxlIGVtYWlsXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJhZGRUb2tlblRvXCIsIHZhbHVlOiBcImhlYWRlclwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2hhbGxlbmdlQWxnb3JpdGhtXCIsIHZhbHVlOiBcIlMyNTZcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdHJldHVybiB7XG5cdFx0aW5mbzoge1xuXHRcdFx0bmFtZTogYCR7cHJvamVjdE5hbWV9IFdlYkFQSWAsXG5cdFx0XHRzY2hlbWE6IFwiaHR0cHM6Ly9zY2hlbWEuZ2V0cG9zdG1hbi5jb20vanNvbi9jb2xsZWN0aW9uL3YyLjEuMC9jb2xsZWN0aW9uLmpzb25cIixcblx0XHR9LFxuXHRcdC4uLihhdXRoT2JqID8geyBhdXRoOiBhdXRoT2JqIH0gOiB7fSksXG5cdFx0aXRlbTogW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkhlbGxvXCIsXG5cdFx0XHRcdHJlcXVlc3Q6IHtcblx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdFx0dXJsOiB7IHJhdzogXCJ7e2Jhc2VVcmx9fS9oZWxsb1wiLCBob3N0OiBbXCJ7e2Jhc2VVcmx9fVwiXSwgcGF0aDogW1wiaGVsbG9cIl0gfSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XSxcblx0fTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbnZpcm9ubWVudFlhbWwobmFtZTogc3RyaW5nLCBhdXRoPzogQXV0aDBFbnYpOiBzdHJpbmcge1xuXHRjb25zdCBhdXRoMFNlY3Rpb24gPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8gW1xuXHRcdFx0XHRcIiAgLSBrZXk6IGF1dGgwRG9tYWluXCIsXG5cdFx0XHRcdGAgICAgdmFsdWU6ICR7YXV0aC5hdXRoMERvbWFpbn1gLFxuXHRcdFx0XHRcIiAgLSBrZXk6IGF1dGgwQXVkaWVuY2VcIixcblx0XHRcdFx0YCAgICB2YWx1ZTogJyR7YXV0aC5hdXRoMEF1ZGllbmNlID8/IFwiXCJ9J2AsXG5cdFx0XHRcdFwiICAtIGtleTogYXV0aDBDbGllbnRJZFwiLFxuXHRcdFx0XHRgICAgIHZhbHVlOiAnJHthdXRoLmF1dGgwQ2xpZW50SWQgPz8gXCJcIn0nYCxcblx0XHRcdFx0XCIgICAgZGVzY3JpcHRpb246IENsaWVudCBJRCBvZiB0aGUgQXV0aDAgU1BBIGFwcGxpY2F0aW9uIHVzZWQgYnkgUG9zdG1hbiBmb3IgUEtDRSBhdXRoZW50aWNhdGlvblwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpICsgXCJcXG5cIlxuXHRcdDogXCJcIjtcblxuXHRyZXR1cm4gYG5hbWU6ICR7bmFtZX1cXG52YWx1ZXM6XFxuICAtIGtleTogYmFzZVVybFxcbiAgICB2YWx1ZTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCdcXG4ke2F1dGgwU2VjdGlvbn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBQb3N0bWFuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwibm9uZVwiKSByZXR1cm47XG5cblx0Y29uc3QgYXV0aENvbmZpZ01vZGVsID0gd29ya3NwYWNlLmdldE1vZGVsPEF1dGhDb25maWdNb2RlbD4oV0VMTF9LTk9XTl9GSUxFUy5BVVRIX0NPTkZJRyk7XG5cdGNvbnN0IGF1dGhDZmcgPSBhdXRoQ29uZmlnTW9kZWw/LmNvbmZpZztcblxuXHRsZXQgc3BhQ2xpZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwiYXBpXCIgJiYgb3B0aW9ucy5hcGlLZXkgJiYgYXV0aENmZz8uaXNzdWVyQmFzZVVybCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBhcHAgPSBhdXRoMENsaS5jcmVhdGVTcGFBcHAoXG5cdFx0XHRcdGAke3dvcmtzcGFjZS5uYW1lfSBQb3N0bWFuYCxcblx0XHRcdFx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2NhbGxiYWNrXCIsXG5cdFx0XHQpO1xuXHRcdFx0c3BhQ2xpZW50SWQgPSBhcHAuY2xpZW50X2lkO1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBBdXRoMCBTUEEgYXBwIGNyZWF0ZWQgZm9yIFBvc3RtYW4gUEtDRVwiKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gY3JlYXRlIEF1dGgwIFNQQSBhcHAg4oCUIGNvbnRpbnVpbmcgd2l0aG91dCBpdC5cIik7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgYXV0aDBFbnY6IEF1dGgwRW52IHwgdW5kZWZpbmVkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybFxuXHRcdD8ge1xuXHRcdFx0XHRhdXRoMERvbWFpbjogYXV0aENmZy5pc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIiksXG5cdFx0XHRcdGF1dGgwQXVkaWVuY2U6IGF1dGhDZmcuYXVkaWVuY2UsXG5cdFx0XHRcdGF1dGgwQ2xpZW50SWQ6IHNwYUNsaWVudElkLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGNvbGxlY3Rpb24gPSBidWlsZENvbGxlY3Rpb24ocHJvamVjdE5hbWUsIGF1dGgwRW52KTtcblx0Y29uc3QgZW52WWFtbCA9IGJ1aWxkRW52aXJvbm1lbnRZYW1sKGAke3Byb2plY3ROYW1lfSDigJQgTG9jYWxgLCBhdXRoMEVudik7XG5cblx0d29ya3NwYWNlLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBgcG9zdG1hbi9lbnZpcm9ubWVudHMvJHtwcm9qZWN0TmFtZX0gXFx1MjAxNCBMb2NhbC5lbnZpcm9ubWVudC55YW1sYCxcblx0XHRcdFx0Y29udGVudDogZW52WWFtbCxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBgcG9zdG1hbi9jb2xsZWN0aW9ucy8ke3Byb2plY3ROYW1lfS5wb3N0bWFuX2NvbGxlY3Rpb24uanNvbmAsXG5cdFx0XHRcdGNvbnRlbnQ6IGAke0pTT04uc3RyaW5naWZ5KGNvbGxlY3Rpb24sIG51bGwsIDIpfVxcbmAsXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0pO1xuXG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJhcGlcIiAmJiBvcHRpb25zLmFwaUtleSkge1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IG9wdGlvbnMuYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXG5cdFx0Y29uc3QgY29sUmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vY29sbGVjdGlvbnM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbGxlY3Rpb24gfSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGNvbFJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGNvbGxlY3Rpb24gdXBsb2FkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gdXBsb2FkIFBvc3RtYW4gY29sbGVjdGlvblwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnZWYXJzID0gW1xuXHRcdFx0eyBrZXk6IFwiYmFzZVVybFwiLCB2YWx1ZTogXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0Li4uKGF1dGgwRW52Py5hdXRoMERvbWFpblxuXHRcdFx0XHQ/IFtcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwRG9tYWluXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMERvbWFpbiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBBdWRpZW5jZVwiLCB2YWx1ZTogYXV0aDBFbnYuYXV0aDBBdWRpZW5jZSA/PyBcIlwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMENsaWVudElkXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMENsaWVudElkID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRdXG5cdFx0XHRcdDogW10pLFxuXHRcdF07XG5cdFx0Y29uc3QgZW52UmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vZW52aXJvbm1lbnRzP3dvcmtzcGFjZT0ke29wdGlvbnMud29ya3NwYWNlSWR9YCxcblx0XHRcdHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdGVudmlyb25tZW50OiB7IG5hbWU6IGAke3Byb2plY3ROYW1lfSDigJQgTG9jYWxgLCB2YWx1ZXM6IGVudlZhcnMgfSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGVudlJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGVudmlyb25tZW50IHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgUG9zdG1hbkZlYXR1cmU6IEZlYXR1cmU8UG9zdG1hbk9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuIl0sIm5hbWVzIjpbIlBvc3RtYW5GZWF0dXJlIiwiZ2V0T3B0aW9ucyIsIl93b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwicG9zdG1hblByb3ZpZGVyIiwiY2hvaWNlcyIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJzZWxlY3RlZCIsInBpY2siLCJjIiwicHJvdmlkZXIiLCJhcGlLZXkiLCJwcm9jZXNzIiwiZW52IiwiUE9TVE1BTl9BUElfS0VZIiwidGhlbiIsIm0iLCJhc2siLCJoZWFkZXJzIiwid3NSZXMiLCJmZXRjaCIsIm9rIiwiY29uc29sZSIsImVycm9yIiwid29ya3NwYWNlcyIsImpzb24iLCJ3c0Nob2ljZXMiLCJpZCIsIm1hcCIsInciLCJuYW1lIiwidHlwZSIsIndzUGlja2VkIiwid29ya3NwYWNlSWQiLCJ3c05hbWUiLCJjcmVhdGVSZXMiLCJtZXRob2QiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIndvcmtzcGFjZSIsIndzIiwibG9nIiwiYnVpbGRDb2xsZWN0aW9uIiwicHJvamVjdE5hbWUiLCJhdXRoIiwiYXV0aE9iaiIsImF1dGgwRG9tYWluIiwib2F1dGgyIiwia2V5IiwidmFsdWUiLCJ1bmRlZmluZWQiLCJpbmZvIiwic2NoZW1hIiwiaXRlbSIsInJlcXVlc3QiLCJ1cmwiLCJyYXciLCJob3N0IiwicGF0aCIsImJ1aWxkRW52aXJvbm1lbnRZYW1sIiwiYXV0aDBTZWN0aW9uIiwiYXV0aDBBdWRpZW5jZSIsImF1dGgwQ2xpZW50SWQiLCJqb2luIiwic2NhZmZvbGQiLCJvcHRpb25zIiwiYXV0aENvbmZpZ01vZGVsIiwiZ2V0TW9kZWwiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiQVVUSF9DT05GSUciLCJhdXRoQ2ZnIiwiY29uZmlnIiwic3BhQ2xpZW50SWQiLCJpc3N1ZXJCYXNlVXJsIiwiYXBwIiwiYXV0aDBDbGkiLCJjcmVhdGVTcGFBcHAiLCJjbGllbnRfaWQiLCJhdXRoMEVudiIsInJlcGxhY2UiLCJhdWRpZW5jZSIsImNvbGxlY3Rpb24iLCJlbnZZYW1sIiwiYWRkRmlsZSIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiY29sUmVzIiwiZW52VmFycyIsImVuYWJsZWQiLCJlbnZSZXMiLCJlbnZpcm9ubWVudCIsInZhbHVlcyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkEyT2FBOzs7ZUFBQUE7Ozt3QkEzT1E7dUJBQ1k7a0VBSVA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVExQixlQUFlQyxXQUNkQyxVQUE2QixFQUM3QkMsVUFBbUM7SUFFbkMsSUFBSUEsV0FBV0MsZUFBZSxJQUFJLE1BQU0sT0FBTyxDQUFDO0lBRWhELE1BQU1DLFVBQVU7UUFDZjtZQUFFQyxPQUFPO1lBQWlCQyxhQUFhO1FBQU87UUFDOUM7WUFBRUQsT0FBTztZQUFrQkMsYUFBYTtRQUF1QztRQUMvRTtZQUFFRCxPQUFPO1lBQWdCQyxhQUFhO1FBQXdDO0tBQzlFO0lBQ0QsTUFBTUMsV0FBVyxNQUFNQyxJQUFBQSxZQUFJLEVBQzFCLGlCQUNBSixTQUNBLENBQUNLLElBQU0sR0FBR0EsRUFBRUosS0FBSyxDQUFDLEdBQUcs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
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ApiPackageJson", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return ApiPackageJson;
9
+ }
10
+ });
11
+ const _version = require("../../../v1/version.js");
12
+ const _const = require("../../models/const.js");
13
+ class ApiPackageJson {
14
+ projectName;
15
+ key = _const.WELL_KNOWN_FILES.API_PACKAGE_JSON;
16
+ _dependencies;
17
+ _devDependencies = {};
18
+ constructor(projectName){
19
+ this.projectName = projectName;
20
+ this._dependencies = {
21
+ "@decohere/cortex": _version.CREATE_VERSION,
22
+ "@decohere/crucible": _version.CREATE_VERSION
23
+ };
24
+ }
25
+ addDependency(name, version) {
26
+ this._dependencies[name] = version;
27
+ return this;
28
+ }
29
+ addDevDependency(name, version) {
30
+ this._devDependencies[name] = version;
31
+ return this;
32
+ }
33
+ files() {
34
+ const pkg = {
35
+ name: `@${this.projectName}/api`,
36
+ version: "0.0.1",
37
+ type: "module",
38
+ main: "src/main.ts",
39
+ dependencies: {
40
+ ...this._dependencies
41
+ }
42
+ };
43
+ if (Object.keys(this._devDependencies).length > 0) {
44
+ pkg.devDependencies = {
45
+ ...this._devDependencies
46
+ };
47
+ }
48
+ return [
49
+ {
50
+ filePath: "package.json",
51
+ content: JSON.stringify(pkg, null, 2)
52
+ }
53
+ ];
54
+ }
55
+ }
56
+
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENSRUFURV9WRVJTSU9OIH0gZnJvbSBcIi4uLy4uLy4uL3YxL3ZlcnNpb24uanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYHByb2plY3RzL2FwaS9wYWNrYWdlLmpzb25gLlxuICpcbiAqIFN0YXJ0cyB3aXRoIHRoZSBjb3JlIGNvcnRleCArIGNydWNpYmxlIGRlcHMuIEZlYXR1cmVzIGNhbiBjYWxsXG4gKiBgYWRkRGVwZW5kZW5jeWAgLyBgYWRkRGV2RGVwZW5kZW5jeWAgdG8gZXh0ZW5kLlxuICovXG5leHBvcnQgY2xhc3MgQXBpUGFja2FnZUpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuQVBJX1BBQ0tBR0VfSlNPTjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9kZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2RldkRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2plY3ROYW1lOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9jcnVjaWJsZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGFkZERlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZERldkRlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgcGtnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcblx0XHRcdG5hbWU6IGBAJHt0aGlzLnByb2plY3ROYW1lfS9hcGlgLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0dHlwZTogXCJtb2R1bGVcIixcblx0XHRcdG1haW46IFwic3JjL21haW4udHNcIixcblx0XHRcdGRlcGVuZGVuY2llczogeyAuLi50aGlzLl9kZXBlbmRlbmNpZXMgfSxcblx0XHR9O1xuXHRcdGlmIChPYmplY3Qua2V5cyh0aGlzLl9kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdHBrZy5kZXZEZXBlbmRlbmNpZXMgPSB7IC4uLnRoaXMuX2RldkRlcGVuZGVuY2llcyB9O1xuXHRcdH1cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJwYWNrYWdlLmpzb25cIixcblx0XHRcdFx0Y29udGVudDogSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkFwaVBhY2thZ2VKc29uIiwia2V5IiwiV0VMTF9LTk9XTl9GSUxFUyIsIkFQSV9QQUNLQUdFX0pTT04iLCJfZGVwZW5kZW5jaWVzIiwiX2RldkRlcGVuZGVuY2llcyIsInByb2plY3ROYW1lIiwiQ1JFQVRFX1ZFUlNJT04iLCJhZGREZXBlbmRlbmN5IiwibmFtZSIsInZlcnNpb24iLCJhZGREZXZEZXBlbmRlbmN5IiwiZmlsZXMiLCJwa2ciLCJ0eXBlIiwibWFpbiIsImRlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJkZXZEZXBlbmRlbmNpZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiOzs7OytCQVVhQTs7O2VBQUFBOzs7eUJBVmtCO3VCQUNFO0FBUzFCLE1BQU1BOztJQUNJQyxNQUFNQyx1QkFBZ0IsQ0FBQ0MsZ0JBQWdCLENBQUM7SUFFdkNDLGNBQXNDO0lBQ3RDQyxtQkFBMkMsQ0FBQyxFQUFFO0lBRS9ELFlBQW1CLEFBQWlCQyxXQUFtQixDQUFFO2FBQXJCQSxjQUFBQTtRQUNuQyxJQUFJLENBQUNGLGFBQWEsR0FBRztZQUNwQixvQkFBb0JHLHVCQUFjO1lBQ2xDLHNCQUFzQkEsdUJBQWM7UUFDckM7SUFDRDtJQUVPQyxjQUFjQyxJQUFZLEVBQUVDLE9BQWUsRUFBUTtRQUN6RCxJQUFJLENBQUNOLGFBQWEsQ0FBQ0ssS0FBSyxHQUFHQztRQUMzQixPQUFPLElBQUk7SUFDWjtJQUVPQyxpQkFBaUJGLElBQVksRUFBRUMsT0FBZSxFQUFRO1FBQzVELElBQUksQ0FBQ0wsZ0JBQWdCLENBQUNJLEtBQUssR0FBR0M7UUFDOUIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsUUFBc0I7UUFDNUIsTUFBTUMsTUFBK0I7WUFDcENKLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDSCxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2hDSSxTQUFTO1lBQ1RJLE1BQU07WUFDTkMsTUFBTTtZQUNOQyxjQUFjO2dCQUFFLEdBQUcsSUFBSSxDQUFDWixhQUFhO1lBQUM7UUFDdkM7UUFDQSxJQUFJYSxPQUFPQyxJQUFJLENBQUMsSUFBSSxDQUFDYixnQkFBZ0IsRUFBRWMsTUFBTSxHQUFHLEdBQUc7WUFDbEROLElBQUlPLGVBQWUsR0FBRztnQkFBRSxHQUFHLElBQUksQ0FBQ2YsZ0JBQWdCO1lBQUM7UUFDbEQ7UUFDQSxPQUFPO1lBQ047Z0JBQ0NnQixVQUFVO2dCQUNWQyxTQUFTQyxLQUFLQyxTQUFTLENBQUNYLEtBQUssTUFBTTtZQUNwQztTQUNBO0lBQ0Y7QUFDRCJ9
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "AuthConfigModel", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return AuthConfigModel;
9
+ }
10
+ });
11
+ const _const = require("../../models/const.js");
12
+ class AuthConfigModel {
13
+ config;
14
+ key = _const.WELL_KNOWN_FILES.AUTH_CONFIG;
15
+ constructor(config){
16
+ this.config = config;
17
+ }
18
+ files() {
19
+ return [];
20
+ }
21
+ }
22
+
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hdXRoLWNvbmZpZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBBdXRoQ29uZmlnID0ge1xuXHRpc3N1ZXJCYXNlVXJsOiBzdHJpbmc7XG5cdGF1ZGllbmNlOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIERhdGEtY2FycmllciBtb2RlbCBmb3IgYXV0aCBjb25maWd1cmF0aW9uLlxuICpcbiAqIFJlZ2lzdGVyZWQgYnkgQXV0aEZlYXR1cmUgd2hlbiBhdXRoMCBpcyBjb25maWd1cmVkLiBPdGhlciBmZWF0dXJlcyAoZS5nLlxuICogUG9zdG1hbkZlYXR1cmUpIHJldHJpZXZlIGl0IHZpYSB3b3Jrc3BhY2UuZ2V0TW9kZWwoV0VMTF9LTk9XTl9GSUxFUy5BVVRIX0NPTkZJRykuXG4gKiBQcm9kdWNlcyBubyBmaWxlcyDigJQgZXhpc3RzIHNvbGVseSBzbyBmZWF0dXJlcyBjYW4gY29tbXVuaWNhdGUgYXV0aCBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQXV0aENvbmZpZ01vZGVsIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkFVVEhfQ09ORklHO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBBdXRoQ29uZmlnKSB7fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdHJldHVybiBbXTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkF1dGhDb25maWdNb2RlbCIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJBVVRIX0NPTkZJRyIsImNvbmZpZyIsImZpbGVzIl0sIm1hcHBpbmdzIjoiOzs7OytCQWVhQTs7O2VBQUFBOzs7dUJBZm9CO0FBZTFCLE1BQU1BOztJQUNJQyxNQUFNQyx1QkFBZ0IsQ0FBQ0MsV0FBVyxDQUFDO0lBRW5ELFlBQW1CLEFBQWdCQyxNQUFrQixDQUFFO2FBQXBCQSxTQUFBQTtJQUFxQjtJQUVqREMsUUFBc0I7UUFDNUIsT0FBTyxFQUFFO0lBQ1Y7QUFDRCJ9
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get ControllerMethod () {
13
+ return ControllerMethod;
14
+ },
15
+ get ControllerSourceFile () {
16
+ return ControllerSourceFile;
17
+ }
18
+ });
19
+ const _const = require("../../models/const.js");
20
+ /** Tracks named imports from a single module path, split into values and types. */ class ImportGroup {
21
+ _values = [];
22
+ _types = [];
23
+ add(name, typeOnly = false) {
24
+ if (typeOnly) {
25
+ // Value import already present — value wins, skip
26
+ if (!this._values.includes(name) && !this._types.includes(name)) {
27
+ this._types.push(name);
28
+ }
29
+ } else {
30
+ // Promote: remove from types if it was previously type-only
31
+ const typeIdx = this._types.indexOf(name);
32
+ if (typeIdx !== -1) this._types.splice(typeIdx, 1);
33
+ if (!this._values.includes(name)) this._values.push(name);
34
+ }
35
+ return this;
36
+ }
37
+ render(from) {
38
+ const values = [
39
+ ...this._values
40
+ ].sort();
41
+ const types = [
42
+ ...this._types
43
+ ].sort().map((n)=>`type ${n}`);
44
+ return `import { ${[
45
+ ...values,
46
+ ...types
47
+ ].join(", ")} } from "${from}";`;
48
+ }
49
+ }
50
+ class ControllerMethod {
51
+ name;
52
+ _httpDecorator;
53
+ _params;
54
+ _isAsync;
55
+ _body;
56
+ _extraDecorators = [];
57
+ constructor(name, _httpDecorator, _params, _isAsync, _body){
58
+ this.name = name;
59
+ this._httpDecorator = _httpDecorator;
60
+ this._params = _params;
61
+ this._isAsync = _isAsync;
62
+ this._body = _body;
63
+ }
64
+ addDecorator(decorator) {
65
+ this._extraDecorators.push(decorator);
66
+ return this;
67
+ }
68
+ render() {
69
+ const lines = [];
70
+ for (const d of this._extraDecorators){
71
+ lines.push(`\t${d}`);
72
+ }
73
+ lines.push(`\t${this._httpDecorator}`);
74
+ const asyncKw = this._isAsync ? "async " : "";
75
+ lines.push(`\tpublic ${asyncKw}${this.name}(${this._params}) {`);
76
+ for (const line of this._body){
77
+ lines.push(`\t\t${line}`);
78
+ }
79
+ lines.push("\t}");
80
+ return lines;
81
+ }
82
+ }
83
+ class ControllerSourceFile {
84
+ key = _const.WELL_KNOWN_FILES.CONTROLLER_TS;
85
+ _cortexImports = new ImportGroup().add("Controller").add("Delete").add("Field").add("Get").add("Param").add("Post").add("Put").add("Query");
86
+ _extraImportGroups = new Map();
87
+ _classDecorators = [];
88
+ _ctorParams = [
89
+ "private readonly sample: SampleService"
90
+ ];
91
+ _methods = new Map([
92
+ [
93
+ "getAll",
94
+ new ControllerMethod("getAll", "@Get()", '@Query("filter") filter: string', true, [
95
+ "const greeting = await this.sample.getGreeting();",
96
+ "return { filter, message: greeting };"
97
+ ])
98
+ ],
99
+ [
100
+ "getOne",
101
+ new ControllerMethod("getOne", '@Get("/:id")', '@Param("id") id: string', false, // biome-ignore lint/suspicious/noTemplateCurlyInString: template literal in generated code
102
+ [
103
+ "return { id, message: `Hello ${id}!` };"
104
+ ])
105
+ ],
106
+ [
107
+ "create",
108
+ new ControllerMethod("create", '@Post("/")', "body: HelloBody", false, [
109
+ "return { message: body.message };"
110
+ ])
111
+ ],
112
+ [
113
+ "update",
114
+ new ControllerMethod("update", '@Put("/:id")', '@Param("id") id: string, body: HelloBody', false, [
115
+ "return { id, message: body.message };"
116
+ ])
117
+ ],
118
+ [
119
+ "remove",
120
+ new ControllerMethod("remove", '@Delete("/:id")', '@Param("id") id: string', false, [
121
+ "return { id, deleted: true };"
122
+ ])
123
+ ]
124
+ ]);
125
+ /** Retrieve a method by name to mutate its decorators. */ getMethod(name) {
126
+ const m = this._methods.get(name);
127
+ if (m == null) throw new Error(`No method '${name}' on ControllerSourceFile`);
128
+ return m;
129
+ }
130
+ /** Add a class-level decorator (e.g. `@Authorize`). */ addDecorator(decorator) {
131
+ this._classDecorators.push(decorator);
132
+ return this;
133
+ }
134
+ /** Add a named import from `@decohere/cortex`. */ addCortexImport(name, typeOnly = false) {
135
+ this._cortexImports.add(name, typeOnly);
136
+ return this;
137
+ }
138
+ /** Add a named import from any other module. */ addImport(name, from, typeOnly = false) {
139
+ const group = this._extraImportGroups.get(from) ?? new ImportGroup();
140
+ group.add(name, typeOnly);
141
+ this._extraImportGroups.set(from, group);
142
+ return this;
143
+ }
144
+ /** Add a constructor parameter (e.g. an injected dependency). */ addConstructorParam(param) {
145
+ this._ctorParams.push(param);
146
+ return this;
147
+ }
148
+ files() {
149
+ const lines = [
150
+ this._cortexImports.render("@decohere/cortex"),
151
+ 'import { SampleService } from "../sample.service.js";'
152
+ ];
153
+ for (const [from, group] of this._extraImportGroups){
154
+ lines.push(group.render(from));
155
+ }
156
+ lines.push("", "class HelloBody {", '\t@Field("body", "message")', "\tpublic message!: string;", "}", "");
157
+ for (const d of this._classDecorators){
158
+ lines.push(d);
159
+ }
160
+ lines.push('@Controller({ prefix: "/hello" })', "export class HelloController {", "");
161
+ lines.push("\tpublic constructor(");
162
+ for (const p of this._ctorParams){
163
+ lines.push(`\t\t${p},`);
164
+ }
165
+ lines.push("\t) {}");
166
+ lines.push("");
167
+ for (const method of this._methods.values()){
168
+ lines.push(...method.render(), "");
169
+ }
170
+ lines.push("}", "");
171
+ return [
172
+ {
173
+ filePath: "src/controllers/hello.controller.ts",
174
+ content: lines.join("\n")
175
+ }
176
+ ];
177
+ }
178
+ }
179
+
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9jb250cm9sbGVyLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKiBUcmFja3MgbmFtZWQgaW1wb3J0cyBmcm9tIGEgc2luZ2xlIG1vZHVsZSBwYXRoLCBzcGxpdCBpbnRvIHZhbHVlcyBhbmQgdHlwZXMuICovXG5jbGFzcyBJbXBvcnRHcm91cCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3ZhbHVlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfdHlwZXM6IHN0cmluZ1tdID0gW107XG5cblx0cHVibGljIGFkZChuYW1lOiBzdHJpbmcsIHR5cGVPbmx5ID0gZmFsc2UpOiB0aGlzIHtcblx0XHRpZiAodHlwZU9ubHkpIHtcblx0XHRcdC8vIFZhbHVlIGltcG9ydCBhbHJlYWR5IHByZXNlbnQg4oCUIHZhbHVlIHdpbnMsIHNraXBcblx0XHRcdGlmICghdGhpcy5fdmFsdWVzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLl90eXBlcy5pbmNsdWRlcyhuYW1lKSkge1xuXHRcdFx0XHR0aGlzLl90eXBlcy5wdXNoKG5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBQcm9tb3RlOiByZW1vdmUgZnJvbSB0eXBlcyBpZiBpdCB3YXMgcHJldmlvdXNseSB0eXBlLW9ubHlcblx0XHRcdGNvbnN0IHR5cGVJZHggPSB0aGlzLl90eXBlcy5pbmRleE9mKG5hbWUpO1xuXHRcdFx0aWYgKHR5cGVJZHggIT09IC0xKSB0aGlzLl90eXBlcy5zcGxpY2UodHlwZUlkeCwgMSk7XG5cdFx0XHRpZiAoIXRoaXMuX3ZhbHVlcy5pbmNsdWRlcyhuYW1lKSkgdGhpcy5fdmFsdWVzLnB1c2gobmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHJlbmRlcihmcm9tOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHZhbHVlcyA9IFsuLi50aGlzLl92YWx1ZXNdLnNvcnQoKTtcblx0XHRjb25zdCB0eXBlcyA9IFsuLi50aGlzLl90eXBlc10uc29ydCgpLm1hcCgobikgPT4gYHR5cGUgJHtufWApO1xuXHRcdHJldHVybiBgaW1wb3J0IHsgJHtbLi4udmFsdWVzLCAuLi50eXBlc10uam9pbihcIiwgXCIpfSB9IGZyb20gXCIke2Zyb219XCI7YDtcblx0fVxufVxuXG4vKipcbiAqIEEgY29udHJvbGxlciBtZXRob2QuIEZlYXR1cmVzIGNhbGwgYGFkZERlY29yYXRvcigpYCB0byBwcmVwZW5kIGRlY29yYXRvcnNcbiAqIGJlZm9yZSB0aGUgSFRUUCB2ZXJiIGRlY29yYXRvciAoZS5nLiBgQEFsbG93QW5vbnltb3VzYCBiZWZvcmUgYEBHZXQoKWApLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbGxlck1ldGhvZCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2V4dHJhRGVjb3JhdG9yczogc3RyaW5nW10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0cHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcblx0XHRwcml2YXRlIHJlYWRvbmx5IF9odHRwRGVjb3JhdG9yOiBzdHJpbmcsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBfcGFyYW1zOiBzdHJpbmcsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBfaXNBc3luYzogYm9vbGVhbixcblx0XHRwcml2YXRlIHJlYWRvbmx5IF9ib2R5OiBzdHJpbmdbXSxcblx0KSB7fVxuXG5cdHB1YmxpYyBhZGREZWNvcmF0b3IoZGVjb3JhdG9yOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9leHRyYURlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHJlbmRlcigpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkIG9mIHRoaXMuX2V4dHJhRGVjb3JhdG9ycykge1xuXHRcdFx0bGluZXMucHVzaChgXFx0JHtkfWApO1xuXHRcdH1cblx0XHRsaW5lcy5wdXNoKGBcXHQke3RoaXMuX2h0dHBEZWNvcmF0b3J9YCk7XG5cdFx0Y29uc3QgYXN5bmNLdyA9IHRoaXMuX2lzQXN5bmMgPyBcImFzeW5jIFwiIDogXCJcIjtcblx0XHRsaW5lcy5wdXNoKGBcXHRwdWJsaWMgJHthc3luY0t3fSR7dGhpcy5uYW1lfSgke3RoaXMuX3BhcmFtc30pIHtgKTtcblx0XHRmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy5fYm9keSkge1xuXHRcdFx0bGluZXMucHVzaChgXFx0XFx0JHtsaW5lfWApO1xuXHRcdH1cblx0XHRsaW5lcy5wdXNoKFwiXFx0fVwiKTtcblx0XHRyZXR1cm4gbGluZXM7XG5cdH1cbn1cblxuLyoqXG4gKiBNb2RlbCBmb3IgYHByb2plY3RzL2FwaS9zcmMvY29udHJvbGxlcnMvaGVsbG8uY29udHJvbGxlci50c2AuXG4gKlxuICogUHJlLWluaXRpYWxpc2VkIHdpdGggYWxsIHJvdXRlcyBhbmQgdGhlaXIgSFRUUCBkZWNvcmF0b3JzLiBGZWF0dXJlcyBtdXRhdGVcbiAqIHRoZSBtb2RlbCB2aWEgYGdldE1ldGhvZChuYW1lKS5hZGREZWNvcmF0b3IoLi4uKWAsIGBhZGREZWNvcmF0b3IoLi4uKWAgKGNsYXNzXG4gKiBsZXZlbCksIGBhZGRDb3J0ZXhJbXBvcnQoLi4uKWAsIGBhZGRJbXBvcnQoLi4uKWAsIGFuZCBgYWRkQ29uc3RydWN0b3JQYXJhbSguLi4pYC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xsZXJTb3VyY2VGaWxlIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkNPTlRST0xMRVJfVFM7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfY29ydGV4SW1wb3J0cyA9IG5ldyBJbXBvcnRHcm91cCgpXG5cdFx0LmFkZChcIkNvbnRyb2xsZXJcIilcblx0XHQuYWRkKFwiRGVsZXRlXCIpXG5cdFx0LmFkZChcIkZpZWxkXCIpXG5cdFx0LmFkZChcIkdldFwiKVxuXHRcdC5hZGQoXCJQYXJhbVwiKVxuXHRcdC5hZGQoXCJQb3N0XCIpXG5cdFx0LmFkZChcIlB1dFwiKVxuXHRcdC5hZGQoXCJRdWVyeVwiKTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9leHRyYUltcG9ydEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBJbXBvcnRHcm91cD4oKTtcblx0cHJpdmF0ZSByZWFkb25seSBfY2xhc3NEZWNvcmF0b3JzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9jdG9yUGFyYW1zOiBzdHJpbmdbXSA9IFtcInByaXZhdGUgcmVhZG9ubHkgc2FtcGxlOiBTYW1wbGVTZXJ2aWNlXCJdO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX21ldGhvZHMgPSBuZXcgTWFwPHN0cmluZywgQ29udHJvbGxlck1ldGhvZD4oW1xuXHRcdFtcblx0XHRcdFwiZ2V0QWxsXCIsXG5cdFx0XHRuZXcgQ29udHJvbGxlck1ldGhvZChcImdldEFsbFwiLCBcIkBHZXQoKVwiLCAnQFF1ZXJ5KFwiZmlsdGVyXCIpIGZpbHRlcjogc3RyaW5nJywgdHJ1ZSwgW1xuXHRcdFx0XHRcImNvbnN0IGdyZWV0aW5nID0gYXdhaXQgdGhpcy5zYW1wbGUuZ2V0R3JlZXRpbmcoKTtcIixcblx0XHRcdFx0XCJyZXR1cm4geyBmaWx0ZXIsIG1lc3NhZ2U6IGdyZWV0aW5nIH07XCIsXG5cdFx0XHRdKSxcblx0XHRdLFxuXHRcdFtcblx0XHRcdFwiZ2V0T25lXCIsXG5cdFx0XHRuZXcgQ29udHJvbGxlck1ldGhvZChcblx0XHRcdFx0XCJnZXRPbmVcIixcblx0XHRcdFx0J0BHZXQoXCIvOmlkXCIpJyxcblx0XHRcdFx0J0BQYXJhbShcImlkXCIpIGlkOiBzdHJpbmcnLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogdGVtcGxhdGUgbGl0ZXJhbCBpbiBnZW5lcmF0ZWQgY29kZVxuXHRcdFx0XHRbXCJyZXR1cm4geyBpZCwgbWVzc2FnZTogYEhlbGxvICR7aWR9IWAgfTtcIl0sXG5cdFx0XHQpLFxuXHRcdF0sXG5cdFx0W1xuXHRcdFx0XCJjcmVhdGVcIixcblx0XHRcdG5ldyBDb250cm9sbGVyTWV0aG9kKFwiY3JlYXRlXCIsICdAUG9zdChcIi9cIiknLCBcImJvZHk6IEhlbGxvQm9keVwiLCBmYWxzZSwgW1xuXHRcdFx0XHRcInJldHVybiB7IG1lc3NhZ2U6IGJvZHkubWVzc2FnZSB9O1wiLFxuXHRcdFx0XSksXG5cdFx0XSxcblx0XHRbXG5cdFx0XHRcInVwZGF0ZVwiLFxuXHRcdFx0bmV3IENvbnRyb2xsZXJNZXRob2QoXG5cdFx0XHRcdFwidXBkYXRlXCIsXG5cdFx0XHRcdCdAUHV0KFwiLzppZFwiKScsXG5cdFx0XHRcdCdAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nLCBib2R5OiBIZWxsb0JvZHknLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0W1wicmV0dXJuIHsgaWQsIG1lc3NhZ2U6IGJvZHkubWVzc2FnZSB9O1wiXSxcblx0XHRcdCksXG5cdFx0XSxcblx0XHRbXG5cdFx0XHRcInJlbW92ZVwiLFxuXHRcdFx0bmV3IENvbnRyb2xsZXJNZXRob2QoXCJyZW1vdmVcIiwgJ0BEZWxldGUoXCIvOmlkXCIpJywgJ0BQYXJhbShcImlkXCIpIGlkOiBzdHJpbmcnLCBmYWxzZSwgW1xuXHRcdFx0XHRcInJldHVybiB7IGlkLCBkZWxldGVkOiB0cnVlIH07XCIsXG5cdFx0XHRdKSxcblx0XHRdLFxuXHRdKTtcblxuXHQvKiogUmV0cmlldmUgYSBtZXRob2QgYnkgbmFtZSB0byBtdXRhdGUgaXRzIGRlY29yYXRvcnMuICovXG5cdHB1YmxpYyBnZXRNZXRob2QobmFtZTogc3RyaW5nKTogQ29udHJvbGxlck1ldGhvZCB7XG5cdFx0Y29uc3QgbSA9IHRoaXMuX21ldGhvZHMuZ2V0KG5hbWUpO1xuXHRcdGlmIChtID09IG51bGwpIHRocm93IG5ldyBFcnJvcihgTm8gbWV0aG9kICcke25hbWV9JyBvbiBDb250cm9sbGVyU291cmNlRmlsZWApO1xuXHRcdHJldHVybiBtO1xuXHR9XG5cblx0LyoqIEFkZCBhIGNsYXNzLWxldmVsIGRlY29yYXRvciAoZS5nLiBgQEF1dGhvcml6ZWApLiAqL1xuXHRwdWJsaWMgYWRkRGVjb3JhdG9yKGRlY29yYXRvcjogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fY2xhc3NEZWNvcmF0b3JzLnB1c2goZGVjb3JhdG9yKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGQgYSBuYW1lZCBpbXBvcnQgZnJvbSBgQGRlY29oZXJlL2NvcnRleGAuICovXG5cdHB1YmxpYyBhZGRDb3J0ZXhJbXBvcnQobmFtZTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0dGhpcy5fY29ydGV4SW1wb3J0cy5hZGQobmFtZSwgdHlwZU9ubHkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFkZCBhIG5hbWVkIGltcG9ydCBmcm9tIGFueSBvdGhlciBtb2R1bGUuICovXG5cdHB1YmxpYyBhZGRJbXBvcnQobmFtZTogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHR5cGVPbmx5ID0gZmFsc2UpOiB0aGlzIHtcblx0XHRjb25zdCBncm91cCA9IHRoaXMuX2V4dHJhSW1wb3J0R3JvdXBzLmdldChmcm9tKSA/PyBuZXcgSW1wb3J0R3JvdXAoKTtcblx0XHRncm91cC5hZGQobmFtZSwgdHlwZU9ubHkpO1xuXHRcdHRoaXMuX2V4dHJhSW1wb3J0R3JvdXBzLnNldChmcm9tLCBncm91cCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyIChlLmcuIGFuIGluamVjdGVkIGRlcGVuZGVuY3kpLiAqL1xuXHRwdWJsaWMgYWRkQ29uc3RydWN0b3JQYXJhbShwYXJhbTogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fY3RvclBhcmFtcy5wdXNoKHBhcmFtKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcblx0XHRcdHRoaXMuX2NvcnRleEltcG9ydHMucmVuZGVyKFwiQGRlY29oZXJlL2NvcnRleFwiKSxcblx0XHRcdCdpbXBvcnQgeyBTYW1wbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3NhbXBsZS5zZXJ2aWNlLmpzXCI7Jyxcblx0XHRdO1xuXG5cdFx0Zm9yIChjb25zdCBbZnJvbSwgZ3JvdXBdIG9mIHRoaXMuX2V4dHJhSW1wb3J0R3JvdXBzKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGdyb3VwLnJlbmRlcihmcm9tKSk7XG5cdFx0fVxuXG5cdFx0bGluZXMucHVzaChcblx0XHRcdFwiXCIsXG5cdFx0XHRcImNsYXNzIEhlbGxvQm9keSB7XCIsXG5cdFx0XHQnXFx0QEZpZWxkKFwiYm9keVwiLCBcIm1lc3NhZ2VcIiknLFxuXHRcdFx0XCJcXHRwdWJsaWMgbWVzc2FnZSE6IHN0cmluZztcIixcblx0XHRcdFwifVwiLFxuXHRcdFx0XCJcIixcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBkIG9mIHRoaXMuX2NsYXNzRGVjb3JhdG9ycykge1xuXHRcdFx0bGluZXMucHVzaChkKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaCgnQENvbnRyb2xsZXIoeyBwcmVmaXg6IFwiL2hlbGxvXCIgfSknLCBcImV4cG9ydCBjbGFzcyBIZWxsb0NvbnRyb2xsZXIge1wiLCBcIlwiKTtcblxuXHRcdGxpbmVzLnB1c2goXCJcXHRwdWJsaWMgY29uc3RydWN0b3IoXCIpO1xuXHRcdGZvciAoY29uc3QgcCBvZiB0aGlzLl9jdG9yUGFyYW1zKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGBcXHRcXHQke3B9LGApO1xuXHRcdH1cblx0XHRsaW5lcy5wdXNoKFwiXFx0KSB7fVwiKTtcblx0XHRsaW5lcy5wdXNoKFwiXCIpO1xuXG5cdFx0Zm9yIChjb25zdCBtZXRob2Qgb2YgdGhpcy5fbWV0aG9kcy52YWx1ZXMoKSkge1xuXHRcdFx0bGluZXMucHVzaCguLi5tZXRob2QucmVuZGVyKCksIFwiXCIpO1xuXHRcdH1cblxuXHRcdGxpbmVzLnB1c2goXCJ9XCIsIFwiXCIpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIudHNcIixcblx0XHRcdFx0Y29udGVudDogbGluZXMuam9pbihcIlxcblwiKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkNvbnRyb2xsZXJNZXRob2QiLCJDb250cm9sbGVyU291cmNlRmlsZSIsIkltcG9ydEdyb3VwIiwiX3ZhbHVlcyIsIl90eXBlcyIsImFkZCIsIm5hbWUiLCJ0eXBlT25seSIsImluY2x1ZGVzIiwicHVzaCIsInR5cGVJZHgiLCJpbmRleE9mIiwic3BsaWNlIiwicmVuZGVyIiwiZnJvbSIsInZhbHVlcyIsInNvcnQiLCJ0eXBlcyIsIm1hcCIsIm4iLCJqb2luIiwiX2V4dHJhRGVjb3JhdG9ycyIsIl9odHRwRGVjb3JhdG9yIiwiX3BhcmFtcyIsIl9pc0FzeW5jIiwiX2JvZHkiLCJhZGREZWNvcmF0b3IiLCJkZWNvcmF0b3IiLCJsaW5lcyIsImQiLCJhc3luY0t3IiwibGluZSIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJDT05UUk9MTEVSX1RTIiwiX2NvcnRleEltcG9ydHMiLCJfZXh0cmFJbXBvcnRHcm91cHMiLCJNYXAiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX2N0b3JQYXJhbXMiLCJfbWV0aG9kcyIsImdldE1ldGhvZCIsIm0iLCJnZXQiLCJFcnJvciIsImFkZENvcnRleEltcG9ydCIsImFkZEltcG9ydCIsImdyb3VwIiwic2V0IiwiYWRkQ29uc3RydWN0b3JQYXJhbSIsInBhcmFtIiwiZmlsZXMiLCJwIiwibWV0aG9kIiwiZmlsZVBhdGgiLCJjb250ZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQWtDYUE7ZUFBQUE7O1FBdUNBQztlQUFBQTs7O3VCQXpFb0I7QUFHakMsaUZBQWlGLEdBQ2pGLE1BQU1DO0lBQ1lDLFVBQW9CLEVBQUUsQ0FBQztJQUN2QkMsU0FBbUIsRUFBRSxDQUFDO0lBRWhDQyxJQUFJQyxJQUFZLEVBQUVDLFdBQVcsS0FBSyxFQUFRO1FBQ2hELElBQUlBLFVBQVU7WUFDYixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQ0osT0FBTyxDQUFDSyxRQUFRLENBQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ksUUFBUSxDQUFDRixPQUFPO2dCQUNoRSxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ssSUFBSSxDQUFDSDtZQUNsQjtRQUNELE9BQU87WUFDTiw0REFBNEQ7WUFDNUQsTUFBTUksVUFBVSxJQUFJLENBQUNOLE1BQU0sQ0FBQ08sT0FBTyxDQUFDTDtZQUNwQyxJQUFJSSxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUNOLE1BQU0sQ0FBQ1EsTUFBTSxDQUFDRixTQUFTO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUNQLE9BQU8sQ0FBQ0ssUUFBUSxDQUFDRixPQUFPLElBQUksQ0FBQ0gsT0FBTyxDQUFDTSxJQUFJLENBQUNIO1FBQ3JEO1FBQ0EsT0FBTyxJQUFJO0lBQ1o7SUFFT08sT0FBT0MsSUFBWSxFQUFVO1FBQ25DLE1BQU1DLFNBQVM7ZUFBSSxJQUFJLENBQUNaLE9BQU87U0FBQyxDQUFDYSxJQUFJO1FBQ3JDLE1BQU1DLFFBQVE7ZUFBSSxJQUFJLENBQUNiLE1BQU07U0FBQyxDQUFDWSxJQUFJLEdBQUdFLEdBQUcsQ0FBQyxD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