@decohere/create 0.0.1-dev.43 → 0.0.1-dev.45

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 (47) hide show
  1. package/commonjs/src/models/config-yaml.model.js +58 -4
  2. package/commonjs/src/models/env-file.model.js +14 -1
  3. package/commonjs/src/models/launch-json.model.js +49 -27
  4. package/commonjs/src/models/package-json.model.js +64 -7
  5. package/commonjs/src/models/project.model.js +4 -1
  6. package/commonjs/src/program.js +52 -21
  7. package/commonjs/src/runner.js +13 -2
  8. package/commonjs/src/webapi/api-name.js +95 -0
  9. package/commonjs/src/webapi/const.js +32 -4
  10. package/commonjs/src/webapi/create-api.js +62 -18
  11. package/commonjs/src/webapi/features/auth.feature.js +56 -51
  12. package/commonjs/src/webapi/features/biome-format.js +6 -4
  13. package/commonjs/src/webapi/features/database.feature.js +125 -98
  14. package/commonjs/src/webapi/features/finalize.feature.js +19 -7
  15. package/commonjs/src/webapi/models/api-package-json.model.js +7 -5
  16. package/commonjs/src/webapi/models/main-source-file.model.js +12 -3
  17. package/commonjs/src/webapi/models/production-dockerfile.model.js +76 -36
  18. package/es6/src/models/config-yaml.model.js +47 -1
  19. package/es6/src/models/env-file.model.js +14 -1
  20. package/es6/src/models/launch-json.model.js +49 -27
  21. package/es6/src/models/package-json.model.js +62 -5
  22. package/es6/src/models/project.model.js +4 -1
  23. package/es6/src/program.js +52 -21
  24. package/es6/src/runner.js +13 -2
  25. package/es6/src/webapi/api-name.js +59 -0
  26. package/es6/src/webapi/const.js +18 -5
  27. package/es6/src/webapi/create-api.js +64 -20
  28. package/es6/src/webapi/features/auth.feature.js +56 -51
  29. package/es6/src/webapi/features/biome-format.js +6 -4
  30. package/es6/src/webapi/features/database.feature.js +125 -98
  31. package/es6/src/webapi/features/finalize.feature.js +19 -7
  32. package/es6/src/webapi/models/api-package-json.model.js +8 -6
  33. package/es6/src/webapi/models/main-source-file.model.js +12 -3
  34. package/es6/src/webapi/models/production-dockerfile.model.js +71 -36
  35. package/package.json +2 -2
  36. package/types/src/models/config-yaml.model.d.ts +11 -0
  37. package/types/src/models/env-file.model.d.ts +1 -0
  38. package/types/src/models/launch-json.model.d.ts +2 -0
  39. package/types/src/models/package-json.model.d.ts +16 -6
  40. package/types/src/models/project.model.d.ts +3 -0
  41. package/types/src/webapi/api-name.d.ts +14 -0
  42. package/types/src/webapi/const.d.ts +15 -5
  43. package/types/src/webapi/create-api.d.ts +4 -0
  44. package/types/src/webapi/features/biome-format.d.ts +1 -1
  45. package/types/src/webapi/models/api-package-json.model.d.ts +4 -3
  46. package/types/src/webapi/models/main-source-file.model.d.ts +6 -0
  47. package/types/src/webapi/models/production-dockerfile.model.d.ts +13 -2
@@ -4,7 +4,7 @@ import { join } from "node:path";
4
4
  import { pick } from "../../domain/prompt.js";
5
5
  import { WELL_KNOWN_FILES } from "../../models/const.js";
6
6
  import { CREATE_VERSION } from "../../version.js";
7
- import { WEBAPI_PROJECT_DIR } from "../const.js";
7
+ import { apiEnvPrefix, apiNameFromProjectDir } from "../api-name.js";
8
8
  /** Read a single KEY= from an existing target `.env` (if any). */ function readExistingEnvValue(workspace, key) {
9
9
  try {
10
10
  const raw = readFileSync(join(workspace.targetDir, ".env"), "utf8");
@@ -31,31 +31,39 @@ function passwordOrExisting(workspace, key, fallbackExistingKeys = []) {
31
31
  }
32
32
  return randomPassword();
33
33
  }
34
- // Production base: runtime app role only — no bootstrap, no admin/migrate secrets required.
35
- const DATABASE_BASE_CONFIG_YAML = `database:
36
- dataSources:
37
- - name: default
38
- provider: postgres
39
- host: \${DB_HOST}
40
- port: \${DB_PORT}
41
- database: \${DB_NAME}
42
- username: \${DB_USER}
43
- password: \${DB_PASSWORD}
44
- synchronize: false
45
- seed: false
46
- bootstrap: false
47
- `;
48
- // Dev: enable bootstrap + migrate role; synchronize uses app DDL (dev-only exception).
49
- const DATABASE_DEV_CONFIG_YAML = `database:
50
- dataSources:
51
- - synchronize: true
52
- seed: true
53
- bootstrap: true
54
- adminUser: \${DB_ADMIN_USER}
55
- adminPassword: \${DB_ADMIN_PASSWORD}
56
- migrateUsername: \${DB_MIGRATE_USER}
57
- migratePassword: \${DB_MIGRATE_PASSWORD}
58
- `;
34
+ // Production: runtime app role only — no bootstrap, no admin/migrate secrets required.
35
+ function renderBaseDataSource(apiName) {
36
+ const p = apiEnvPrefix(apiName);
37
+ return [
38
+ ` - name: ${apiName}`,
39
+ ` provider: postgres`,
40
+ ` host: \${${p}_DB_HOST}`,
41
+ ` port: \${${p}_DB_PORT}`,
42
+ ` database: \${${p}_DB_NAME}`,
43
+ ` username: \${${p}_DB_USER}`,
44
+ ` password: \${${p}_DB_PASSWORD}`,
45
+ ` synchronize: false`,
46
+ ` seed: false`,
47
+ ` bootstrap: false`
48
+ ].join("\n");
49
+ }
50
+ // Dev overlay (merged by list index onto config.yaml). Enable bootstrap + migrate role.
51
+ function renderDevDataSource(apiName) {
52
+ const p = apiEnvPrefix(apiName);
53
+ return [
54
+ ` - name: ${apiName}`,
55
+ ` synchronize: true`,
56
+ ` seed: true`,
57
+ ` bootstrap: true`,
58
+ ` adminUser: \${DB_ADMIN_USER}`,
59
+ ` adminPassword: \${DB_ADMIN_PASSWORD}`,
60
+ ` migrateUsername: \${${p}_DB_MIGRATE_USER}`,
61
+ ` migratePassword: \${${p}_DB_MIGRATE_PASSWORD}`
62
+ ].join("\n");
63
+ }
64
+ function renderDatabaseSection(apiNames, items) {
65
+ return `database:\n dataSources:\n${apiNames.map(items).join("\n")}\n`;
66
+ }
59
67
  /** Runs once on first Postgres volume init — creates restricted bootstrap role (not superuser). */ const POSTGRES_INIT_BOOTSTRAP_SH = `#!/bin/bash
60
68
  set -euo pipefail
61
69
  # Container superuser (POSTGRES_USER) creates a restricted provisioner role.
@@ -124,95 +132,117 @@ function scaffold(workspace, options) {
124
132
  if (options.databaseProvider !== "postgres/typeorm") return;
125
133
  const name = workspace.name;
126
134
  const ident = toSqlIdentFragment(name);
127
- const db = `${ident}_dev`;
128
- // Container init superuser — never reused as the API runtime role.
135
+ const apiProjects = workspace.getProjects();
136
+ const apiNames = apiProjects.map((project)=>apiNameFromProjectDir(project.dir));
137
+ // Container init superuser — never reused as an API runtime role.
129
138
  const postgresSuperuser = "postgres";
130
139
  const postgresPassword = passwordOrExisting(workspace, "POSTGRES_PASSWORD");
131
140
  const bootstrapUser = "decohere_bootstrap";
132
141
  const bootstrapPassword = passwordOrExisting(workspace, "DB_ADMIN_PASSWORD", [
133
142
  "POSTGRES_PASSWORD"
134
143
  ]);
135
- const appUser = `${ident}_app`;
136
- const appPassword = passwordOrExisting(workspace, "DB_PASSWORD");
137
- const migrateUser = `${ident}_migrate`;
138
- const migratePassword = passwordOrExisting(workspace, "DB_MIGRATE_PASSWORD");
139
144
  const devContainer = workspace.getModel(WELL_KNOWN_FILES.DEVCONTAINER_JSON);
140
145
  const compose = workspace.getModel(WELL_KNOWN_FILES.DOCKER_COMPOSE);
141
146
  const networkKey = name;
142
147
  const volumeName = `${name}-postgres-data`;
143
- // Isolated compose project network + volume (not ark's shared Postgres).
144
- // Alias `postgres` so other stacks on the same named network can use DB_HOST=postgres.
145
- compose?.addService("postgres", {
146
- image: "postgres:16",
147
- container_name: `samples-${name}-postgres`,
148
- restart: "unless-stopped",
149
- // Loopback-only: avoid exposing Postgres on LAN/public interfaces.
150
- // Host 5433 avoids clashing with a local/other Postgres on 5432.
151
- ports: [
152
- "127.0.0.1:5433:5432"
153
- ],
154
- volumes: [
155
- `${volumeName}:/var/lib/postgresql/data`,
156
- "../.devcontainer/postgres-init:/docker-entrypoint-initdb.d:ro"
157
- ],
158
- networks: [
159
- {
160
- [networkKey]: {
161
- aliases: [
162
- "postgres"
163
- ]
164
- }
165
- }
166
- ],
167
- healthcheck: {
168
- test: [
169
- "CMD-SHELL",
170
- `pg_isready -U ${postgresSuperuser} -d ${db}`
148
+ if (compose) {
149
+ // One shared instance. Each API owns a database on it (created at bootstrap).
150
+ // Point `{PREFIX}_DB_HOST` / `{PREFIX}_DB_PORT` at another server to split later.
151
+ compose.addService("postgres", {
152
+ image: "postgres:16",
153
+ container_name: `samples-${name}-postgres`,
154
+ restart: "unless-stopped",
155
+ ports: [
156
+ "127.0.0.1:5433:5432"
171
157
  ],
172
- interval: "2s",
173
- timeout: "5s",
174
- retries: 15
175
- }
176
- }).addEnvFile("postgres", "../.env").addVolume(volumeName);
177
- // Optional DB UI — enable with: docker compose --profile tools up -d
178
- compose?.addService("adminer", {
179
- image: "adminer",
180
- profiles: [
181
- "tools"
182
- ],
183
- ports: [
184
- "127.0.0.1:8081:8080"
185
- ],
186
- networks: [
187
- networkKey
188
- ]
189
- });
190
- workspace.addFile({
191
- files: ()=>[
158
+ volumes: [
159
+ `${volumeName}:/var/lib/postgresql/data`,
160
+ "../.devcontainer/postgres-init:/docker-entrypoint-initdb.d:ro"
161
+ ],
162
+ networks: [
192
163
  {
193
- filePath: ".devcontainer/postgres-init/01-create-bootstrap-role.sh",
194
- content: POSTGRES_INIT_BOOTSTRAP_SH
164
+ [networkKey]: {
165
+ aliases: [
166
+ "postgres"
167
+ ]
168
+ }
195
169
  }
170
+ ],
171
+ healthcheck: {
172
+ test: [
173
+ "CMD-SHELL",
174
+ `pg_isready -U ${postgresSuperuser}`
175
+ ],
176
+ interval: "2s",
177
+ timeout: "5s",
178
+ retries: 15
179
+ }
180
+ }).addEnvFile("postgres", "../.env").addVolume(volumeName);
181
+ compose.addService("adminer", {
182
+ image: "adminer",
183
+ profiles: [
184
+ "tools"
185
+ ],
186
+ ports: [
187
+ "127.0.0.1:8081:8080"
188
+ ],
189
+ networks: [
190
+ networkKey
196
191
  ]
197
- });
198
- // Add SQLTools extension for DB browsing in VS Code
192
+ });
193
+ workspace.addFile({
194
+ files: ()=>[
195
+ {
196
+ filePath: ".devcontainer/postgres-init/01-create-bootstrap-role.sh",
197
+ content: POSTGRES_INIT_BOOTSTRAP_SH
198
+ }
199
+ ]
200
+ });
201
+ compose.addEnvFile("devcontainer", "../.env");
202
+ }
199
203
  devContainer?.addExtension("mtxr.sqltools");
200
- // Wire up main.ts
201
- workspace.getModel(WELL_KNOWN_FILES.MAIN_TS)?.addSideEffectImport("@decohere/codex-typeorm").addEntity({
204
+ workspace.getModel(WELL_KNOWN_FILES.PACKAGE_JSON)?.addDependency("@decohere/codex", CREATE_VERSION).addDependency("typeorm", "^0.3.28").addDependency("@decohere/codex-typeorm", CREATE_VERSION).addScript("db:up", "docker compose -f .devcontainer/docker-compose.yml up -d postgres").addScript("db:down", "docker compose -f .devcontainer/docker-compose.yml down").addScript("db:reset", "docker compose -f .devcontainer/docker-compose.yml down -v && docker compose -f .devcontainer/docker-compose.yml up -d postgres");
205
+ writeDatabaseConfig(workspace, apiNames);
206
+ for (const project of apiProjects){
207
+ wireApiDatabase(project);
208
+ }
209
+ const env = workspace.getModel(WELL_KNOWN_FILES.ENV_FILE);
210
+ env?.addEntry("POSTGRES_DB", ident).addEntry("POSTGRES_USER", postgresSuperuser).addEntry("POSTGRES_PASSWORD", postgresPassword).addEntry("DB_ADMIN_USER", bootstrapUser).addEntry("DB_ADMIN_PASSWORD", bootstrapPassword);
211
+ for (const apiName of apiNames){
212
+ writeApiDatabaseEnv(workspace, ident, apiName);
213
+ }
214
+ }
215
+ function writeDatabaseConfig(workspace, apiNames) {
216
+ const config = workspace.getModel(WELL_KNOWN_FILES.CONFIG_YAML);
217
+ const devConfig = workspace.getModel(WELL_KNOWN_FILES.CONFIG_DEV_YAML);
218
+ const pending = apiNames.filter((apiName)=>!config?.hasDataSource(apiName));
219
+ if (pending.length === 0) return;
220
+ if (config?.hasDataSources()) {
221
+ for (const apiName of pending){
222
+ config.appendDataSource(renderBaseDataSource(apiName));
223
+ devConfig?.appendDataSource(renderDevDataSource(apiName));
224
+ }
225
+ return;
226
+ }
227
+ config?.addSection(renderDatabaseSection(pending, renderBaseDataSource));
228
+ devConfig?.addSection(renderDatabaseSection(pending, renderDevDataSource));
229
+ }
230
+ function writeApiDatabaseEnv(workspace, ident, apiName) {
231
+ const prefix = apiEnvPrefix(apiName);
232
+ const sqlApi = toSqlIdentFragment(apiName);
233
+ workspace.getModel(WELL_KNOWN_FILES.ENV_FILE)?.addEntry(`${prefix}_DB_HOST`, "postgres").addEntry(`${prefix}_DB_PORT`, "5432").addEntry(`${prefix}_DB_NAME`, `${ident}_${sqlApi}_dev`).addEntry(`${prefix}_DB_USER`, `${ident}_${sqlApi}_app`).addEntry(`${prefix}_DB_PASSWORD`, passwordOrExisting(workspace, `${prefix}_DB_PASSWORD`)).addEntry(`${prefix}_DB_MIGRATE_USER`, `${ident}_${sqlApi}_migrate`).addEntry(`${prefix}_DB_MIGRATE_PASSWORD`, passwordOrExisting(workspace, `${prefix}_DB_MIGRATE_PASSWORD`));
234
+ }
235
+ function wireApiDatabase(project) {
236
+ const apiName = apiNameFromProjectDir(project.dir);
237
+ project.getModel(WELL_KNOWN_FILES.MAIN_TS)?.setDataSourceName(apiName).addSideEffectImport("@decohere/codex-typeorm").addEntity({
202
238
  className: "SampleEntity",
203
239
  importPath: "./entities/sample.entity.js"
204
240
  }).addRepository({
205
241
  className: "SampleEntityRepository",
206
242
  importPath: "./repositories/sample.repository.js"
207
243
  });
208
- workspace.getModel(WELL_KNOWN_FILES.PACKAGE_JSON)?.addDependency("@decohere/codex", CREATE_VERSION).addDependency("typeorm", "^0.3.28").addDependency("@decohere/codex-typeorm", CREATE_VERSION).addScript("db:up", "docker compose -f .devcontainer/docker-compose.yml up -d postgres").addScript("db:down", "docker compose -f .devcontainer/docker-compose.yml down").addScript("db:reset", "docker compose -f .devcontainer/docker-compose.yml down -v && docker compose -f .devcontainer/docker-compose.yml up -d postgres");
209
- // Add codex deps to api package.json
210
- workspace.getModel(WELL_KNOWN_FILES.API_PACKAGE_JSON)?.addDependency("@decohere/codex", CREATE_VERSION).addDependency("@decohere/codex-typeorm", CREATE_VERSION);
211
- // Append database config sections
212
- workspace.getModel(WELL_KNOWN_FILES.CONFIG_YAML)?.addSection(DATABASE_BASE_CONFIG_YAML);
213
- workspace.getModel(WELL_KNOWN_FILES.CONFIG_DEV_YAML)?.addSection(DATABASE_DEV_CONFIG_YAML);
214
- // Register entity and repository source files in the api project
215
- workspace.getProject(WEBAPI_PROJECT_DIR)?.addFile({
244
+ project.getModel(WELL_KNOWN_FILES.API_PACKAGE_JSON)?.addDependency("@decohere/codex", CREATE_VERSION).addDependency("@decohere/codex-typeorm", CREATE_VERSION);
245
+ project.addFile({
216
246
  files: ()=>[
217
247
  {
218
248
  filePath: "src/entities/sample.entity.ts",
@@ -224,13 +254,10 @@ function scaffold(workspace, options) {
224
254
  }
225
255
  ]
226
256
  });
227
- // .env at workspace root — postgres reads it via env_file above; devcontainer gets it here
228
- compose?.addEnvFile("devcontainer", "../.env");
229
- workspace.getModel(WELL_KNOWN_FILES.ENV_FILE)?.addEntry("POSTGRES_DB", db).addEntry("POSTGRES_USER", postgresSuperuser).addEntry("POSTGRES_PASSWORD", postgresPassword).addEntry("DB_HOST", "postgres").addEntry("DB_PORT", "5432").addEntry("DB_NAME", db).addEntry("DB_USER", appUser).addEntry("DB_PASSWORD", appPassword).addEntry("DB_ADMIN_USER", bootstrapUser).addEntry("DB_ADMIN_PASSWORD", bootstrapPassword).addEntry("DB_MIGRATE_USER", migrateUser).addEntry("DB_MIGRATE_PASSWORD", migratePassword);
230
257
  }
231
258
  export const DatabaseFeature = {
232
259
  getOptions,
233
260
  scaffold
234
261
  };
235
262
 
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2RhdGFiYXNlLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGljayB9IGZyb20gXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERvY2tlckNvbXBvc2UgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbXBvc2UubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnWWFtbCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uZmlnLXlhbWwubW9kZWwuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERldkNvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGV2LWNvbnRhaW5lci5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX1ZFUlNJT04gfSBmcm9tIFwiLi4vLi4vdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHsgV0VCQVBJX1BST0pFQ1RfRElSIH0gZnJvbSBcIi4uL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEFwaVBhY2thZ2VKc29uIH0gZnJvbSBcIi4uL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1haW5Tb3VyY2VGaWxlIH0gZnJvbSBcIi4uL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLmpzXCI7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlT3B0aW9ucyA9IHtcblx0ZGF0YWJhc2VQcm92aWRlcj86IFwibm9uZVwiIHwgXCJwb3N0Z3Jlcy90eXBlb3JtXCI7XG59O1xuXG4vKiogUmVhZCBhIHNpbmdsZSBLRVk9IGZyb20gYW4gZXhpc3RpbmcgdGFyZ2V0IGAuZW52YCAoaWYgYW55KS4gKi9cbmZ1bmN0aW9uIHJlYWRFeGlzdGluZ0VudlZhbHVlKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0dHJ5IHtcblx0XHRjb25zdCByYXcgPSByZWFkRmlsZVN5bmMoam9pbih3b3Jrc3BhY2UudGFyZ2V0RGlyLCBcIi5lbnZcIiksIFwidXRmOFwiKTtcblx0XHRjb25zdCBsaW5lID0gcmF3LnNwbGl0KFwiXFxuXCIpLmZpbmQoKGwpID0+IGwuc3RhcnRzV2l0aChgJHtrZXl9PWApKTtcblx0XHRjb25zdCB2YWx1ZSA9IGxpbmU/LnNsaWNlKGtleS5sZW5ndGggKyAxKS50cmltKCk7XG5cdFx0cmV0dXJuIHZhbHVlIHx8IHVuZGVmaW5lZDtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG5mdW5jdGlvbiByYW5kb21QYXNzd29yZCgpOiBzdHJpbmcge1xuXHRyZXR1cm4gcmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiaGV4XCIpO1xufVxuXG4vKiogU2FmZSBQb3N0Z3JlcyBpZGVudGlmaWVyIGZyYWdtZW50IGZyb20gdGhlIHByb2plY3QgbmFtZS4gKi9cbmZ1bmN0aW9uIHRvU3FsSWRlbnRGcmFnbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBjbGVhbmVkID0gbmFtZS5yZXBsYWNlKC9bXkEtWmEtejAtOV9dL2csIFwiX1wiKS5yZXBsYWNlKC9eKFteQS1aYS16X10pLywgXCJwXyQxXCIpO1xuXHRyZXR1cm4gY2xlYW5lZC5sZW5ndGggPiAwID8gY2xlYW5lZC5zbGljZSgwLCA0MCkgOiBcImFwcFwiO1xufVxuXG5mdW5jdGlvbiBwYXNzd29yZE9yRXhpc3RpbmcoXG5cdHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGtleTogc3RyaW5nLFxuXHRmYWxsYmFja0V4aXN0aW5nS2V5czogc3RyaW5nW10gPSBbXSxcbik6IHN0cmluZyB7XG5cdGNvbnN0IGV4aXN0aW5nID0gcmVhZEV4aXN0aW5nRW52VmFsdWUod29ya3NwYWNlLCBrZXkpO1xuXHRpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcblx0Zm9yIChjb25zdCBhbHQgb2YgZmFsbGJhY2tFeGlzdGluZ0tleXMpIHtcblx0XHRjb25zdCB2ID0gcmVhZEV4aXN0aW5nRW52VmFsdWUod29ya3NwYWNlLCBhbHQpO1xuXHRcdGlmICh2KSByZXR1cm4gdjtcblx0fVxuXHRyZXR1cm4gcmFuZG9tUGFzc3dvcmQoKTtcbn1cblxuLy8gUHJvZHVjdGlvbiBiYXNlOiBydW50aW1lIGFwcCByb2xlIG9ubHkg4oCUIG5vIGJvb3RzdHJhcCwgbm8gYWRtaW4vbWlncmF0ZSBzZWNyZXRzIHJlcXVpcmVkLlxuY29uc3QgREFUQUJBU0VfQkFTRV9DT05GSUdfWUFNTCA9IGBkYXRhYmFzZTpcbiAgZGF0YVNvdXJjZXM6XG4gICAgLSBuYW1lOiBkZWZhdWx0XG4gICAgICBwcm92aWRlcjogcG9zdGdyZXNcbiAgICAgIGhvc3Q6IFxcJHtEQl9IT1NUfVxuICAgICAgcG9ydDogXFwke0RCX1BPUlR9XG4gICAgICBkYXRhYmFzZTogXFwke0RCX05BTUV9XG4gICAgICB1c2VybmFtZTogXFwke0RCX1VTRVJ9XG4gICAgICBwYXNzd29yZDogXFwke0RCX1BBU1NXT1JEfVxuICAgICAgc3luY2hyb25pemU6IGZhbHNlXG4gICAgICBzZWVkOiBmYWxzZVxuICAgICAgYm9vdHN0cmFwOiBmYWxzZVxuYDtcblxuLy8gRGV2OiBlbmFibGUgYm9vdHN0cmFwICsgbWlncmF0ZSByb2xlOyBzeW5jaHJvbml6ZSB1c2VzIGFwcCBEREwgKGRldi1vbmx5IGV4Y2VwdGlvbikuXG5jb25zdCBEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwgPSBgZGF0YWJhc2U6XG4gIGRhdGFTb3VyY2VzOlxuICAgIC0gc3luY2hyb25pemU6IHRydWVcbiAgICAgIHNlZWQ6IHRydWVcbiAgICAgIGJvb3RzdHJhcDogdHJ1ZVxuICAgICAgYWRtaW5Vc2VyOiBcXCR7REJfQURNSU5fVVNFUn1cbiAgICAgIGFkbWluUGFzc3dvcmQ6IFxcJHtEQl9BRE1JTl9QQVNTV09SRH1cbiAgICAgIG1pZ3JhdGVVc2VybmFtZTogXFwke0RCX01JR1JBVEVfVVNFUn1cbiAgICAgIG1pZ3JhdGVQYXNzd29yZDogXFwke0RCX01JR1JBVEVfUEFTU1dPUkR9XG5gO1xuXG4vKiogUnVucyBvbmNlIG9uIGZpcnN0IFBvc3RncmVzIHZvbHVtZSBpbml0IOKAlCBjcmVhdGVzIHJlc3RyaWN0ZWQgYm9vdHN0cmFwIHJvbGUgKG5vdCBzdXBlcnVzZXIpLiAqL1xuY29uc3QgUE9TVEdSRVNfSU5JVF9CT09UU1RSQVBfU0ggPSBgIyEvYmluL2Jhc2hcbnNldCAtZXVvIHBpcGVmYWlsXG4jIENvbnRhaW5lciBzdXBlcnVzZXIgKFBPU1RHUkVTX1VTRVIpIGNyZWF0ZXMgYSByZXN0cmljdGVkIHByb3Zpc2lvbmVyIHJvbGUuXG4jIEFwcC9taWdyYXRlIHJvbGVzIGFyZSBjcmVhdGVkIGxhdGVyIGJ5IGNvZGV4LXR5cGVvcm0gcHJlcGFyZURhdGFiYXNlIChkZXYgYm9vdHN0cmFwKS5cbjogXCJcXCR7REJfQURNSU5fVVNFUjo/REJfQURNSU5fVVNFUiBpcyByZXF1aXJlZH1cIlxuOiBcIlxcJHtEQl9BRE1JTl9QQVNTV09SRDo/REJfQURNSU5fUEFTU1dPUkQgaXMgcmVxdWlyZWR9XCJcblxucHNxbCAtdiBPTl9FUlJPUl9TVE9QPTEgLS11c2VybmFtZSBcIiRQT1NUR1JFU19VU0VSXCIgLS1kYm5hbWUgXCIkUE9TVEdSRVNfREJcIiBcXFxcXG5cXHQtLXNldD1ib290c3RyYXBfdXNlcj1cIiREQl9BRE1JTl9VU0VSXCIgXFxcXFxuXFx0LS1zZXQ9Ym9vdHN0cmFwX3Bhc3N3b3JkPVwiJERCX0FETUlOX1BBU1NXT1JEXCIgPDwnRU9TUUwnXG5TRUxFQ1QgZm9ybWF0KFxuXFx0J0NSRUFURSBST0xFICVJIExPR0lOIFBBU1NXT1JEICVMIENSRUFURURCIENSRUFURVJPTEUgTk9TVVBFUlVTRVIgTk9CWVBBU1NSTFMnLFxuXFx0Oidib290c3RyYXBfdXNlcicsXG5cXHQ6J2Jvb3RzdHJhcF9wYXNzd29yZCdcbilcbldIRVJFIE5PVCBFWElTVFMgKFxuXFx0U0VMRUNUIDEgRlJPTSBwZ19jYXRhbG9nLnBnX3JvbGVzIFdIRVJFIHJvbG5hbWUgPSA6J2Jvb3RzdHJhcF91c2VyJ1xuKVxcXFxnZXhlY1xuXG5HUkFOVCBBTEwgT04gU0NIRU1BIHB1YmxpYyBUTyA6XCJib290c3RyYXBfdXNlclwiO1xuRU9TUUxcblxucHNxbCAtdiBPTl9FUlJPUl9TVE9QPTEgLS11c2VybmFtZSBcIiRQT1NUR1JFU19VU0VSXCIgLS1kYm5hbWUgXCIkUE9TVEdSRVNfREJcIiBcXFxcXG5cXHQtYyBcIkdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIERBVEFCQVNFIFxcXFxcIiRQT1NUR1JFU19EQlxcXFxcIiBUTyBcXFxcXCIkREJfQURNSU5fVVNFUlxcXFxcIlwiXG5gO1xuXG5jb25zdCBTQU1QTEVfRU5USVRZX1RTID0gYGltcG9ydCB7IENvbHVtbiwgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IGFzIElFbnRpdHkgfSBmcm9tIFwiQGRlY29oZXJlL2NvZGV4XCI7XG5cbkBFbnRpdHkoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eSBpbXBsZW1lbnRzIElFbnRpdHkge1xuXFx0QFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuXFx0cHVibGljIGlkITogbnVtYmVyO1xuXG5cXHRAQ29sdW1uKClcblxcdHB1YmxpYyBuYW1lITogc3RyaW5nO1xufVxuYDtcblxuY29uc3QgU0FNUExFX1JFUE9TSVRPUllfVFMgPSBgaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgaW5qZWN0VW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcbmltcG9ydCB7IFR5cGVPcm1SZXBvc2l0b3J5LCBUeXBlT3JtVW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiO1xuaW1wb3J0IHsgU2FtcGxlRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIjtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eVJlcG9zaXRvcnkgZXh0ZW5kcyBUeXBlT3JtUmVwb3NpdG9yeTxTYW1wbGVFbnRpdHk+IHtcblxcdHB1YmxpYyBjb25zdHJ1Y3RvcihAaW5qZWN0VW5pdE9mV29yaygpIHVuaXRPZldvcms6IFR5cGVPcm1Vbml0T2ZXb3JrKSB7XG5cXHRcXHRzdXBlcih1bml0T2ZXb3JrLCBTYW1wbGVFbnRpdHkpO1xuXFx0fVxufVxuYDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0X3dvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8RGF0YWJhc2VPcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxEYXRhYmFzZU9wdGlvbnM+PiB7XG5cdGlmIChjbGlPcHRpb25zLmRhdGFiYXNlUHJvdmlkZXIgIT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdGNvbnN0IGNob2ljZXMgPSBbeyBsYWJlbDogXCJub25lXCIgYXMgY29uc3QgfSwgeyBsYWJlbDogXCJwb3N0Z3Jlcy90eXBlb3JtXCIgYXMgY29uc3QgfV07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcIlxcbiAgRGF0YWJhc2U6IFwiLCBjaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cdHJldHVybiB7IGRhdGFiYXNlUHJvdmlkZXI6IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIiB9O1xufVxuXG5mdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBEYXRhYmFzZU9wdGlvbnMpOiB2b2lkIHtcblx0aWYgKG9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciAhPT0gXCJwb3N0Z3Jlcy90eXBlb3JtXCIpIHJldHVybjtcblxuXHRjb25zdCBuYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGlkZW50ID0gdG9TcWxJZGVudEZyYWdtZW50KG5hbWUpO1xuXHRjb25zdCBkYiA9IGAke2lkZW50fV9kZXZgO1xuXHQvLyBDb250YWluZXIgaW5pdCBzdXBlcnVzZXIg4oCUIG5ldmVyIHJldXNlZCBhcyB0aGUgQVBJIHJ1bnRpbWUgcm9sZS5cblx0Y29uc3QgcG9zdGdyZXNTdXBlcnVzZXIgPSBcInBvc3RncmVzXCI7XG5cdGNvbnN0IHBvc3RncmVzUGFzc3dvcmQgPSBwYXNzd29yZE9yRXhpc3Rpbmcod29ya3NwYWNlLCBcIlBPU1RHUkVTX1BBU1NXT1JEXCIpO1xuXHRjb25zdCBib290c3RyYXBVc2VyID0gXCJkZWNvaGVyZV9ib290c3RyYXBcIjtcblx0Y29uc3QgYm9vdHN0cmFwUGFzc3dvcmQgPSBwYXNzd29yZE9yRXhpc3Rpbmcod29ya3NwYWNlLCBcIkRCX0FETUlOX1BBU1NXT1JEXCIsIFtcblx0XHRcIlBPU1RHUkVTX1BBU1NXT1JEXCIsXG5cdF0pO1xuXHRjb25zdCBhcHBVc2VyID0gYCR7aWRlbnR9X2FwcGA7XG5cdGNvbnN0IGFwcFBhc3N3b3JkID0gcGFzc3dvcmRPckV4aXN0aW5nKHdvcmtzcGFjZSwgXCJEQl9QQVNTV09SRFwiKTtcblx0Y29uc3QgbWlncmF0ZVVzZXIgPSBgJHtpZGVudH1fbWlncmF0ZWA7XG5cdGNvbnN0IG1pZ3JhdGVQYXNzd29yZCA9IHBhc3N3b3JkT3JFeGlzdGluZyh3b3Jrc3BhY2UsIFwiREJfTUlHUkFURV9QQVNTV09SRFwiKTtcblxuXHRjb25zdCBkZXZDb250YWluZXIgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8RGV2Q29udGFpbmVyPihXRUxMX0tOT1dOX0ZJTEVTLkRFVkNPTlRBSU5FUl9KU09OKTtcblx0Y29uc3QgY29tcG9zZSA9IHdvcmtzcGFjZS5nZXRNb2RlbDxEb2NrZXJDb21wb3NlPihXRUxMX0tOT1dOX0ZJTEVTLkRPQ0tFUl9DT01QT1NFKTtcblxuXHRjb25zdCBuZXR3b3JrS2V5ID0gbmFtZTtcblx0Y29uc3Qgdm9sdW1lTmFtZSA9IGAke25hbWV9LXBvc3RncmVzLWRhdGFgO1xuXG5cdC8vIElzb2xhdGVkIGNvbXBvc2UgcHJvamVjdCBuZXR3b3JrICsgdm9sdW1lIChub3QgYXJrJ3Mgc2hhcmVkIFBvc3RncmVzKS5cblx0Ly8gQWxpYXMgYHBvc3RncmVzYCBzbyBvdGhlciBzdGFja3Mgb24gdGhlIHNhbWUgbmFtZWQgbmV0d29yayBjYW4gdXNlIERCX0hPU1Q9cG9zdGdyZXMuXG5cdGNvbXBvc2Vcblx0XHQ/LmFkZFNlcnZpY2UoXCJwb3N0Z3Jlc1wiLCB7XG5cdFx0XHRpbWFnZTogXCJwb3N0Z3JlczoxNlwiLFxuXHRcdFx0Y29udGFpbmVyX25hbWU6IGBzYW1wbGVzLSR7bmFtZX0tcG9zdGdyZXNgLFxuXHRcdFx0cmVzdGFydDogXCJ1bmxlc3Mtc3RvcHBlZFwiLFxuXHRcdFx0Ly8gTG9vcGJhY2stb25seTogYXZvaWQgZXhwb3NpbmcgUG9zdGdyZXMgb24gTEFOL3B1YmxpYyBpbnRlcmZhY2VzLlxuXHRcdFx0Ly8gSG9zdCA1NDMzIGF2b2lkcyBjbGFzaGluZyB3aXRoIGEgbG9jYWwvb3RoZXIgUG9zdGdyZXMgb24gNTQzMi5cblx0XHRcdHBvcnRzOiBbXCIxMjcuMC4wLjE6NTQzMzo1NDMyXCJdLFxuXHRcdFx0dm9sdW1lczogW1xuXHRcdFx0XHRgJHt2b2x1bWVOYW1lfTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGFgLFxuXHRcdFx0XHRcIi4uLy5kZXZjb250YWluZXIvcG9zdGdyZXMtaW5pdDovZG9ja2VyLWVudHJ5cG9pbnQtaW5pdGRiLmQ6cm9cIixcblx0XHRcdF0sXG5cdFx0XHRuZXR3b3JrczogW3sgW25ldHdvcmtLZXldOiB7IGFsaWFzZXM6IFtcInBvc3RncmVzXCJdIH0gfV0sXG5cdFx0XHRoZWFsdGhjaGVjazoge1xuXHRcdFx0XHR0ZXN0OiBbXCJDTUQtU0hFTExcIiwgYHBnX2lzcmVhZHkgLVUgJHtwb3N0Z3Jlc1N1cGVydXNlcn0gLWQgJHtkYn1gXSxcblx0XHRcdFx0aW50ZXJ2YWw6IFwiMnNcIixcblx0XHRcdFx0dGltZW91dDogXCI1c1wiLFxuXHRcdFx0XHRyZXRyaWVzOiAxNSxcblx0XHRcdH0sXG5cdFx0fSlcblx0XHQuYWRkRW52RmlsZShcInBvc3RncmVzXCIsIFwiLi4vLmVudlwiKVxuXHRcdC5hZGRWb2x1bWUodm9sdW1lTmFtZSk7XG5cblx0Ly8gT3B0aW9uYWwgREIgVUkg4oCUIGVuYWJsZSB3aXRoOiBkb2NrZXIgY29tcG9zZSAtLXByb2ZpbGUgdG9vbHMgdXAgLWRcblx0Y29tcG9zZT8uYWRkU2VydmljZShcImFkbWluZXJcIiwge1xuXHRcdGltYWdlOiBcImFkbWluZXJcIixcblx0XHRwcm9maWxlczogW1widG9vbHNcIl0sXG5cdFx0cG9ydHM6IFtcIjEyNy4wLjAuMTo4MDgxOjgwODBcIl0sXG5cdFx0bmV0d29ya3M6IFtuZXR3b3JrS2V5XSxcblx0fSk7XG5cblx0d29ya3NwYWNlLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kZXZjb250YWluZXIvcG9zdGdyZXMtaW5pdC8wMS1jcmVhdGUtYm9vdHN0cmFwLXJvbGUuc2hcIixcblx0XHRcdFx0Y29udGVudDogUE9TVEdSRVNfSU5JVF9CT09UU1RSQVBfU0gsXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0pO1xuXG5cdC8vIEFkZCBTUUxUb29scyBleHRlbnNpb24gZm9yIERCIGJyb3dzaW5nIGluIFZTIENvZGVcblx0ZGV2Q29udGFpbmVyPy5hZGRFeHRlbnNpb24oXCJtdHhyLnNxbHRvb2xzXCIpO1xuXG5cdC8vIFdpcmUgdXAgbWFpbi50c1xuXHR3b3Jrc3BhY2Vcblx0XHQuZ2V0TW9kZWw8TWFpblNvdXJjZUZpbGU+KFdFTExfS05PV05fRklMRVMuTUFJTl9UUylcblx0XHQ/LmFkZFNpZGVFZmZlY3RJbXBvcnQoXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiKVxuXHRcdC5hZGRFbnRpdHkoeyBjbGFzc05hbWU6IFwiU2FtcGxlRW50aXR5XCIsIGltcG9ydFBhdGg6IFwiLi9lbnRpdGllcy9zYW1wbGUuZW50aXR5LmpzXCIgfSlcblx0XHQuYWRkUmVwb3NpdG9yeSh7XG5cdFx0XHRjbGFzc05hbWU6IFwiU2FtcGxlRW50aXR5UmVwb3NpdG9yeVwiLFxuXHRcdFx0aW1wb3J0UGF0aDogXCIuL3JlcG9zaXRvcmllcy9zYW1wbGUucmVwb3NpdG9yeS5qc1wiLFxuXHRcdH0pO1xuXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5QQUNLQUdFX0pTT04pXG5cdFx0Py5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4XCIsIENSRUFURV9WRVJTSU9OKVxuXHRcdC5hZGREZXBlbmRlbmN5KFwidHlwZW9ybVwiLCBcIl4wLjMuMjhcIilcblx0XHQuYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIsIENSRUFURV9WRVJTSU9OKVxuXHRcdC5hZGRTY3JpcHQoXCJkYjp1cFwiLCBcImRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIHVwIC1kIHBvc3RncmVzXCIpXG5cdFx0LmFkZFNjcmlwdChcImRiOmRvd25cIiwgXCJkb2NrZXIgY29tcG9zZSAtZiAuZGV2Y29udGFpbmVyL2RvY2tlci1jb21wb3NlLnltbCBkb3duXCIpXG5cdFx0LmFkZFNjcmlwdChcblx0XHRcdFwiZGI6cmVzZXRcIixcblx0XHRcdFwiZG9ja2VyIGNvbXBvc2UgLWYgLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWwgZG93biAtdiAmJiBkb2NrZXIgY29tcG9zZSAtZiAuZGV2Y29udGFpbmVyL2RvY2tlci1jb21wb3NlLnltbCB1cCAtZCBwb3N0Z3Jlc1wiLFxuXHRcdCk7XG5cblx0Ly8gQWRkIGNvZGV4IGRlcHMgdG8gYXBpIHBhY2thZ2UuanNvblxuXHR3b3Jrc3BhY2Vcblx0XHQuZ2V0TW9kZWw8QXBpUGFja2FnZUpzb24+KFdFTExfS05PV05fRklMRVMuQVBJX1BBQ0tBR0VfSlNPTilcblx0XHQ/LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXhcIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiLCBDUkVBVEVfVkVSU0lPTik7XG5cblx0Ly8gQXBwZW5kIGRhdGFiYXNlIGNvbmZpZyBzZWN0aW9uc1xuXHR3b3Jrc3BhY2Vcblx0XHQuZ2V0TW9kZWw8Q29uZmlnWWFtbD4oV0VMTF9LTk9XTl9GSUxFUy5DT05GSUdfWUFNTClcblx0XHQ/LmFkZFNlY3Rpb24oREFUQUJBU0VfQkFTRV9DT05GSUdfWUFNTCk7XG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxDb25maWdZYW1sPihXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ERVZfWUFNTClcblx0XHQ/LmFkZFNlY3Rpb24oREFUQUJBU0VfREVWX0NPTkZJR19ZQU1MKTtcblxuXHQvLyBSZWdpc3RlciBlbnRpdHkgYW5kIHJlcG9zaXRvcnkgc291cmNlIGZpbGVzIGluIHRoZSBhcGkgcHJvamVjdFxuXHR3b3Jrc3BhY2UuZ2V0UHJvamVjdChXRUJBUElfUFJPSkVDVF9ESVIpPy5hZGRGaWxlKHtcblx0XHRmaWxlczogKCkgPT4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJzcmMvZW50aXRpZXMvc2FtcGxlLmVudGl0eS50c1wiLFxuXHRcdFx0XHRjb250ZW50OiBTQU1QTEVfRU5USVRZX1RTLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL3JlcG9zaXRvcmllcy9zYW1wbGUucmVwb3NpdG9yeS50c1wiLFxuXHRcdFx0XHRjb250ZW50OiBTQU1QTEVfUkVQT1NJVE9SWV9UUyxcblx0XHRcdH0sXG5cdFx0XSxcblx0fSk7XG5cblx0Ly8gLmVudiBhdCB3b3Jrc3BhY2Ugcm9vdCDigJQgcG9zdGdyZXMgcmVhZHMgaXQgdmlhIGVudl9maWxlIGFib3ZlOyBkZXZjb250YWluZXIgZ2V0cyBpdCBoZXJlXG5cdGNvbXBvc2U/LmFkZEVudkZpbGUoXCJkZXZjb250YWluZXJcIiwgXCIuLi8uZW52XCIpO1xuXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxFbnZGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLkVOVl9GSUxFKVxuXHRcdD8uYWRkRW50cnkoXCJQT1NUR1JFU19EQlwiLCBkYilcblx0XHQuYWRkRW50cnkoXCJQT1NUR1JFU19VU0VSXCIsIHBvc3RncmVzU3VwZXJ1c2VyKVxuXHRcdC5hZGRFbnRyeShcIlBPU1RHUkVTX1BBU1NXT1JEXCIsIHBvc3RncmVzUGFzc3dvcmQpXG5cdFx0LmFkZEVudHJ5KFwiREJfSE9TVFwiLCBcInBvc3RncmVzXCIpXG5cdFx0LmFkZEVudHJ5KFwiREJfUE9SVFwiLCBcIjU0MzJcIilcblx0XHQuYWRkRW50cnkoXCJEQl9OQU1FXCIsIGRiKVxuXHRcdC8vIFJ1bnRpbWUgYXBwIHJvbGUgKGxlYXN0IHByaXZpbGVnZSkg4oCUIHVzZWQgYnkgVHlwZU9STVxuXHRcdC5hZGRFbnRyeShcIkRCX1VTRVJcIiwgYXBwVXNlcilcblx0XHQuYWRkRW50cnkoXCJEQl9QQVNTV09SRFwiLCBhcHBQYXNzd29yZClcblx0XHQvLyBCb290c3RyYXAgcHJvdmlzaW9uZXIgKENSRUFURURCL0NSRUFURVJPTEUsIG5vdCBzdXBlcnVzZXIpIOKAlCBkZXYgcHJlcGFyZURhdGFiYXNlIG9ubHlcblx0XHQuYWRkRW50cnkoXCJEQl9BRE1JTl9VU0VSXCIsIGJvb3RzdHJhcFVzZXIpXG5cdFx0LmFkZEVudHJ5KFwiREJfQURNSU5fUEFTU1dPUkRcIiwgYm9vdHN0cmFwUGFzc3dvcmQpXG5cdFx0Ly8gTWlncmF0aW9uL0RETCByb2xlIOKAlCBDSS9kZXBsb3k7IG5vdCBtb3VudGVkIG9uIEFQSSBwb2RzIGluIHByb2R1Y3Rpb25cblx0XHQuYWRkRW50cnkoXCJEQl9NSUdSQVRFX1VTRVJcIiwgbWlncmF0ZVVzZXIpXG5cdFx0LmFkZEVudHJ5KFwiREJfTUlHUkFURV9QQVNTV09SRFwiLCBtaWdyYXRlUGFzc3dvcmQpO1xufVxuXG5leHBvcnQgY29uc3QgRGF0YWJhc2VGZWF0dXJlOiBGZWF0dXJlPERhdGFiYXNlT3B0aW9ucz4gPSB7IGdldE9wdGlvbnMsIHNjYWZmb2xkIH07XG4iXSwibmFtZXMiOlsicmFuZG9tQnl0ZXMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwicGljayIsIldFTExfS05PV05fRklMRVMiLCJDUkVBVEVfVkVSU0lPTiIsIldFQkFQSV9QUk9KRUNUX0RJUiIsInJlYWRFeGlzdGluZ0VudlZhbHVlIiwid29ya3NwYWNlIiwia2V5IiwicmF3IiwidGFyZ2V0RGlyIiwibGluZSIsInNwbGl0IiwiZmluZCIsImwiLCJzdGFydHNXaXRoIiwidmFsdWUiLCJzbGljZSIsImxlbmd0aCIsInRyaW0iLCJ1bmRlZmluZWQiLCJyYW5kb21QYXNzd29yZCIsInRvU3RyaW5nIiwidG9TcWxJZGVudEZyYWdtZW50IiwibmFtZSIsImNsZWFuZWQiLCJyZXBsYWNlIiwicGFzc3dvcmRPckV4aXN0aW5nIiwiZmFsbGJhY2tFeGlzdGluZ0tleXMiLCJleGlzdGluZyIsImFsdCIsInYiLCJEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MIiwiREFUQUJBU0VfREVWX0NPTkZJR19ZQU1MIiwiUE9TVEdSRVNfSU5JVF9CT09UU1RSQVBfU0giLCJTQU1QTEVfRU5USVRZX1RTIiwiU0FNUExFX1JFUE9TSVRPUllfVFMiLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJkYXRhYmFzZVByb3ZpZGVyIiwiY2hvaWNlcyIsImxhYmVsIiwic2VsZWN0ZWQiLCJjIiwic2NhZmZvbGQiLCJvcHRpb25zIiwiaWRlbnQiLCJkYiIsInBvc3RncmVzU3VwZXJ1c2VyIiwicG9zdGdyZXNQYXNzd29yZCIsImJvb3RzdHJhcFVzZXIiLCJib290c3RyYXBQYXNzd29yZCIsImFwcFVzZXIiLCJhcHBQYXNzd29yZCIsIm1pZ3JhdGVVc2VyIiwibWlncmF0ZVBhc3N3b3JkIiwiZGV2Q29udGFpbmVyIiwiZ2V0TW9kZWwiLCJERVZDT05UQUlORVJfSlNPTiIsImNvbXBvc2UiLCJET0NLRVJfQ09NUE9TRSIsIm5ldHdvcmtLZXkiLCJ2b2x1bWVOYW1lIiwiYWRkU2VydmljZSIsImltYWdlIiwiY29udGFpbmVyX25hbWUiLCJyZXN0YXJ0IiwicG9ydHMiLCJ2b2x1bWVzIiwibmV0d29ya3MiLCJhbGlhc2VzIiwiaGVhbHRoY2hlY2siLCJ0ZXN0IiwiaW50ZXJ2YWwiLCJ0aW1lb3V0IiwicmV0cmllcyIsImFkZEVudkZpbGUiLCJhZGRWb2x1bWUiLCJwcm9maWxlcyIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiY29udGVudCIsImFkZEV4dGVuc2lvbiIsIk1BSU5fVFMiLCJhZGRTaWRlRWZmZWN0SW1wb3J0IiwiYWRkRW50aXR5IiwiY2xhc3NOYW1lIiwiaW1wb3J0UGF0aCIsImFkZFJlcG9zaXRvcnkiLCJQQUNLQUdFX0pTT04iLCJhZGREZXBlbmRlbmN5IiwiYWRkU2NyaXB0IiwiQVBJX1BBQ0tBR0VfSlNPTiIsIkNPTkZJR19ZQU1MIiwiYWRkU2VjdGlvbiIsIkNPTkZJR19ERVZfWUFNTCIsImdldFByb2plY3QiLCJFTlZfRklMRSIsImFkZEVudHJ5IiwiRGF0YWJhc2VGZWF0dXJlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxXQUFXLFFBQVEsY0FBYztBQUMxQyxTQUFTQyxZQUFZLFFBQVEsVUFBVTtBQUN2QyxTQUFTQyxJQUFJLFFBQVEsWUFBWTtBQUNqQyxTQUFTQyxJQUFJLFFBQVEseUJBQXlCO0FBRzlDLFNBQVNDLGdCQUFnQixRQUFRLHdCQUF3QjtBQU16RCxTQUFTQyxjQUFjLFFBQVEsbUJBQW1CO0FBQ2xELFNBQVNDLGtCQUFrQixRQUFRLGNBQWM7QUFRakQsZ0VBQWdFLEdBQ2hFLFNBQVNDLHFCQUFxQkMsU0FBNEIsRUFBRUMsR0FBVztJQUN0RSxJQUFJO1FBQ0gsTUFBTUMsTUFBTVQsYUFBYUMsS0FBS00sVUFBVUcsU0FBUyxFQUFFLFNBQVM7UUFDNUQsTUFBTUMsT0FBT0YsSUFBSUcsS0FBSyxDQUFDLE1BQU1DLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxVQUFVLENBQUMsR0FBR1AsSUFBSSxDQUFDLENBQUM7UUFDL0QsTUFBTVEsUUFBUUwsTUFBTU0sTUFBTVQsSUFBSVUsTUFBTSxHQUFHLEdBQUdDO1FBQzFDLE9BQU9ILFNBQVNJO0lBQ2pCLEVBQUUsT0FBTTtRQUNQLE9BQU9BO0lBQ1I7QUFDRDtBQUVBLFNBQVNDO0lBQ1IsT0FBT3RCLFlBQVksSUFBSXVCLFFBQVEsQ0FBQztBQUNqQztBQUVBLDZEQUE2RCxHQUM3RCxTQUFTQyxtQkFBbUJDLElBQVk7SUFDdkMsTUFBTUMsVUFBVUQsS0FBS0UsT0FBTyxDQUFDLGtCQUFrQixLQUFLQSxPQUFPLENBQUMsaUJBQWlCO0lBQzdFLE9BQU9ELFFBQVFQLE1BQU0sR0FBRyxJQUFJTyxRQUFRUixLQUFLLENBQUMsR0FBRyxNQUFNO0FBQ3BEO0FB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
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2RhdGFiYXNlLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGljayB9IGZyb20gXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERvY2tlckNvbXBvc2UgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbXBvc2UubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnWWFtbCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uZmlnLXlhbWwubW9kZWwuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERldkNvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGV2LWNvbnRhaW5lci5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3RTY2FmZm9sZCwgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi8uLi92ZXJzaW9uLmpzXCI7XG5pbXBvcnQgeyBhcGlFbnZQcmVmaXgsIGFwaU5hbWVGcm9tUHJvamVjdERpciB9IGZyb20gXCIuLi9hcGktbmFtZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBcGlQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi9tb2RlbHMvYXBpLXBhY2thZ2UtanNvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBNYWluU291cmNlRmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvbWFpbi1zb3VyY2UtZmlsZS5tb2RlbC5qc1wiO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZU9wdGlvbnMgPSB7XG5cdGRhdGFiYXNlUHJvdmlkZXI/OiBcIm5vbmVcIiB8IFwicG9zdGdyZXMvdHlwZW9ybVwiO1xufTtcblxuLyoqIFJlYWQgYSBzaW5nbGUgS0VZPSBmcm9tIGFuIGV4aXN0aW5nIHRhcmdldCBgLmVudmAgKGlmIGFueSkuICovXG5mdW5jdGlvbiByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcmF3ID0gcmVhZEZpbGVTeW5jKGpvaW4od29ya3NwYWNlLnRhcmdldERpciwgXCIuZW52XCIpLCBcInV0ZjhcIik7XG5cdFx0Y29uc3QgbGluZSA9IHJhdy5zcGxpdChcIlxcblwiKS5maW5kKChsKSA9PiBsLnN0YXJ0c1dpdGgoYCR7a2V5fT1gKSk7XG5cdFx0Y29uc3QgdmFsdWUgPSBsaW5lPy5zbGljZShrZXkubGVuZ3RoICsgMSkudHJpbSgpO1xuXHRcdHJldHVybiB2YWx1ZSB8fCB1bmRlZmluZWQ7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmFuZG9tUGFzc3dvcmQoKTogc3RyaW5nIHtcblx0cmV0dXJuIHJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZyhcImhleFwiKTtcbn1cblxuLyoqIFNhZmUgUG9zdGdyZXMgaWRlbnRpZmllciBmcmFnbWVudCBmcm9tIHRoZSBwcm9qZWN0IG5hbWUuICovXG5mdW5jdGlvbiB0b1NxbElkZW50RnJhZ21lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgY2xlYW5lZCA9IG5hbWUucmVwbGFjZSgvW15BLVphLXowLTlfXS9nLCBcIl9cIikucmVwbGFjZSgvXihbXkEtWmEtel9dKS8sIFwicF8kMVwiKTtcblx0cmV0dXJuIGNsZWFuZWQubGVuZ3RoID4gMCA/IGNsZWFuZWQuc2xpY2UoMCwgNDApIDogXCJhcHBcIjtcbn1cblxuZnVuY3Rpb24gcGFzc3dvcmRPckV4aXN0aW5nKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRrZXk6IHN0cmluZyxcblx0ZmFsbGJhY2tFeGlzdGluZ0tleXM6IHN0cmluZ1tdID0gW10sXG4pOiBzdHJpbmcge1xuXHRjb25zdCBleGlzdGluZyA9IHJlYWRFeGlzdGluZ0VudlZhbHVlKHdvcmtzcGFjZSwga2V5KTtcblx0aWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG5cdGZvciAoY29uc3QgYWx0IG9mIGZhbGxiYWNrRXhpc3RpbmdLZXlzKSB7XG5cdFx0Y29uc3QgdiA9IHJlYWRFeGlzdGluZ0VudlZhbHVlKHdvcmtzcGFjZSwgYWx0KTtcblx0XHRpZiAodikgcmV0dXJuIHY7XG5cdH1cblx0cmV0dXJuIHJhbmRvbVBhc3N3b3JkKCk7XG59XG5cbi8vIFByb2R1Y3Rpb246IHJ1bnRpbWUgYXBwIHJvbGUgb25seSDigJQgbm8gYm9vdHN0cmFwLCBubyBhZG1pbi9taWdyYXRlIHNlY3JldHMgcmVxdWlyZWQuXG5mdW5jdGlvbiByZW5kZXJCYXNlRGF0YVNvdXJjZShhcGlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBwID0gYXBpRW52UHJlZml4KGFwaU5hbWUpO1xuXHRyZXR1cm4gW1xuXHRcdGAgICAgLSBuYW1lOiAke2FwaU5hbWV9YCxcblx0XHRgICAgICAgcHJvdmlkZXI6IHBvc3RncmVzYCxcblx0XHRgICAgICAgaG9zdDogXFwkeyR7cH1fREJfSE9TVH1gLFxuXHRcdGAgICAgICBwb3J0OiBcXCR7JHtwfV9EQl9QT1JUfWAsXG5cdFx0YCAgICAgIGRhdGFiYXNlOiBcXCR7JHtwfV9EQl9OQU1FfWAsXG5cdFx0YCAgICAgIHVzZXJuYW1lOiBcXCR7JHtwfV9EQl9VU0VSfWAsXG5cdFx0YCAgICAgIHBhc3N3b3JkOiBcXCR7JHtwfV9EQl9QQVNTV09SRH1gLFxuXHRcdGAgICAgICBzeW5jaHJvbml6ZTogZmFsc2VgLFxuXHRcdGAgICAgICBzZWVkOiBmYWxzZWAsXG5cdFx0YCAgICAgIGJvb3RzdHJhcDogZmFsc2VgLFxuXHRdLmpvaW4oXCJcXG5cIik7XG59XG5cbi8vIERldiBvdmVybGF5IChtZXJnZWQgYnkgbGlzdCBpbmRleCBvbnRvIGNvbmZpZy55YW1sKS4gRW5hYmxlIGJvb3RzdHJhcCArIG1pZ3JhdGUgcm9sZS5cbmZ1bmN0aW9uIHJlbmRlckRldkRhdGFTb3VyY2UoYXBpTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgcCA9IGFwaUVudlByZWZpeChhcGlOYW1lKTtcblx0cmV0dXJuIFtcblx0XHRgICAgIC0gbmFtZTogJHthcGlOYW1lfWAsXG5cdFx0YCAgICAgIHN5bmNocm9uaXplOiB0cnVlYCxcblx0XHRgICAgICAgc2VlZDogdHJ1ZWAsXG5cdFx0YCAgICAgIGJvb3RzdHJhcDogdHJ1ZWAsXG5cdFx0YCAgICAgIGFkbWluVXNlcjogXFwke0RCX0FETUlOX1VTRVJ9YCxcblx0XHRgICAgICAgYWRtaW5QYXNzd29yZDogXFwke0RCX0FETUlOX1BBU1NXT1JEfWAsXG5cdFx0YCAgICAgIG1pZ3JhdGVVc2VybmFtZTogXFwkeyR7cH1fREJfTUlHUkFURV9VU0VSfWAsXG5cdFx0YCAgICAgIG1pZ3JhdGVQYXNzd29yZDogXFwkeyR7cH1fREJfTUlHUkFURV9QQVNTV09SRH1gLFxuXHRdLmpvaW4oXCJcXG5cIik7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckRhdGFiYXNlU2VjdGlvbihcblx0YXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuXHRpdGVtczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nLFxuKTogc3RyaW5nIHtcblx0cmV0dXJuIGBkYXRhYmFzZTpcXG4gIGRhdGFTb3VyY2VzOlxcbiR7YXBpTmFtZXMubWFwKGl0ZW1zKS5qb2luKFwiXFxuXCIpfVxcbmA7XG59XG5cbi8qKiBSdW5zIG9uY2Ugb24gZmlyc3QgUG9zdGdyZXMgdm9sdW1lIGluaXQg4oCUIGNyZWF0ZXMgcmVzdHJpY3RlZCBib290c3RyYXAgcm9sZSAobm90IHN1cGVydXNlcikuICovXG5jb25zdCBQT1NUR1JFU19JTklUX0JPT1RTVFJBUF9TSCA9IGAjIS9iaW4vYmFzaFxuc2V0IC1ldW8gcGlwZWZhaWxcbiMgQ29udGFpbmVyIHN1cGVydXNlciAoUE9TVEdSRVNfVVNFUikgY3JlYXRlcyBhIHJlc3RyaWN0ZWQgcHJvdmlzaW9uZXIgcm9sZS5cbiMgQXBwL21pZ3JhdGUgcm9sZXMgYXJlIGNyZWF0ZWQgbGF0ZXIgYnkgY29kZXgtdHlwZW9ybSBwcmVwYXJlRGF0YWJhc2UgKGRldiBib290c3RyYXApLlxuOiBcIlxcJHtEQl9BRE1JTl9VU0VSOj9EQl9BRE1JTl9VU0VSIGlzIHJlcXVpcmVkfVwiXG46IFwiXFwke0RCX0FETUlOX1BBU1NXT1JEOj9EQl9BRE1JTl9QQVNTV09SRCBpcyByZXF1aXJlZH1cIlxuXG5wc3FsIC12IE9OX0VSUk9SX1NUT1A9MSAtLXVzZXJuYW1lIFwiJFBPU1RHUkVTX1VTRVJcIiAtLWRibmFtZSBcIiRQT1NUR1JFU19EQlwiIFxcXFxcblxcdC0tc2V0PWJvb3RzdHJhcF91c2VyPVwiJERCX0FETUlOX1VTRVJcIiBcXFxcXG5cXHQtLXNldD1ib290c3RyYXBfcGFzc3dvcmQ9XCIkREJfQURNSU5fUEFTU1dPUkRcIiA8PCdFT1NRTCdcblNFTEVDVCBmb3JtYXQoXG5cXHQnQ1JFQVRFIFJPTEUgJUkgTE9HSU4gUEFTU1dPUkQgJUwgQ1JFQVRFREIgQ1JFQVRFUk9MRSBOT1NVUEVSVVNFUiBOT0JZUEFTU1JMUycsXG5cXHQ6J2Jvb3RzdHJhcF91c2VyJyxcblxcdDonYm9vdHN0cmFwX3Bhc3N3b3JkJ1xuKVxuV0hFUkUgTk9UIEVYSVNUUyAoXG5cXHRTRUxFQ1QgMSBGUk9NIHBnX2NhdGFsb2cucGdfcm9sZXMgV0hFUkUgcm9sbmFtZSA9IDonYm9vdHN0cmFwX3VzZXInXG4pXFxcXGdleGVjXG5cbkdSQU5UIEFMTCBPTiBTQ0hFTUEgcHVibGljIFRPIDpcImJvb3RzdHJhcF91c2VyXCI7XG5FT1NRTFxuXG5wc3FsIC12IE9OX0VSUk9SX1NUT1A9MSAtLXVzZXJuYW1lIFwiJFBPU1RHUkVTX1VTRVJcIiAtLWRibmFtZSBcIiRQT1NUR1JFU19EQlwiIFxcXFxcblxcdC1jIFwiR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gREFUQUJBU0UgXFxcXFwiJFBPU1RHUkVTX0RCXFxcXFwiIFRPIFxcXFxcIiREQl9BRE1JTl9VU0VSXFxcXFwiXCJcbmA7XG5cbmNvbnN0IFNBTVBMRV9FTlRJVFlfVFMgPSBgaW1wb3J0IHsgQ29sdW1uLCBFbnRpdHksIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgYXMgSUVudGl0eSB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcblxuQEVudGl0eSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5IGltcGxlbWVudHMgSUVudGl0eSB7XG5cXHRAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG5cXHRwdWJsaWMgaWQhOiBudW1iZXI7XG5cblxcdEBDb2x1bW4oKVxuXFx0cHVibGljIG5hbWUhOiBzdHJpbmc7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfUkVQT1NJVE9SWV9UUyA9IGBpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBpbmplY3RVbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleFwiO1xuaW1wb3J0IHsgVHlwZU9ybVJlcG9zaXRvcnksIFR5cGVPcm1Vbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCI7XG5pbXBvcnQgeyBTYW1wbGVFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXRpZXMvc2FtcGxlLmVudGl0eS5qc1wiO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5UmVwb3NpdG9yeSBleHRlbmRzIFR5cGVPcm1SZXBvc2l0b3J5PFNhbXBsZUVudGl0eT4ge1xuXFx0cHVibGljIGNvbnN0cnVjdG9yKEBpbmplY3RVbml0T2ZXb3JrKCkgdW5pdE9mV29yazogVHlwZU9ybVVuaXRPZldvcmspIHtcblxcdFxcdHN1cGVyKHVuaXRPZldvcmssIFNhbXBsZUVudGl0eSk7XG5cXHR9XG59XG5gO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zKFxuXHRfd29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0Y2xpT3B0aW9uczogUGFydGlhbDxEYXRhYmFzZU9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPERhdGFiYXNlT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciAhPSBudWxsKSByZXR1cm4ge307XG5cblx0Y29uc3QgY2hvaWNlcyA9IFt7IGxhYmVsOiBcIm5vbmVcIiBhcyBjb25zdCB9LCB7IGxhYmVsOiBcInBvc3RncmVzL3R5cGVvcm1cIiBhcyBjb25zdCB9XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBEYXRhYmFzZTogXCIsIGNob2ljZXMsIChjKSA9PiBjLmxhYmVsKTtcblx0cmV0dXJuIHsgZGF0YWJhc2VQcm92aWRlcjogc2VsZWN0ZWQ/LmxhYmVsID8/IFwibm9uZVwiIH07XG59XG5cbmZ1bmN0aW9uIHNjYWZmb2xkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IERhdGFiYXNlT3B0aW9ucyk6IHZvaWQge1xuXHRpZiAob3B0aW9ucy5kYXRhYmFzZVByb3ZpZGVyICE9PSBcInBvc3RncmVzL3R5cGVvcm1cIikgcmV0dXJuO1xuXG5cdGNvbnN0IG5hbWUgPSB3b3Jrc3BhY2UubmFtZTtcblx0Y29uc3QgaWRlbnQgPSB0b1NxbElkZW50RnJhZ21lbnQobmFtZSk7XG5cdGNvbnN0IGFwaVByb2plY3RzID0gd29ya3NwYWNlLmdldFByb2plY3RzKCk7XG5cdGNvbnN0IGFwaU5hbWVzID0gYXBpUHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiBhcGlOYW1lRnJvbVByb2plY3REaXIocHJvamVjdC5kaXIpKTtcblx0Ly8gQ29udGFpbmVyIGluaXQgc3VwZXJ1c2VyIOKAlCBuZXZlciByZXVzZWQgYXMgYW4gQVBJIHJ1bnRpbWUgcm9sZS5cblx0Y29uc3QgcG9zdGdyZXNTdXBlcnVzZXIgPSBcInBvc3RncmVzXCI7XG5cdGNvbnN0IHBvc3RncmVzUGFzc3dvcmQgPSBwYXNzd29yZE9yRXhpc3Rpbmcod29ya3NwYWNlLCBcIlBPU1RHUkVTX1BBU1NXT1JEXCIpO1xuXHRjb25zdCBib290c3RyYXBVc2VyID0gXCJkZWNvaGVyZV9ib290c3RyYXBcIjtcblx0Y29uc3QgYm9vdHN0cmFwUGFzc3dvcmQgPSBwYXNzd29yZE9yRXhpc3Rpbmcod29ya3NwYWNlLCBcIkRCX0FETUlOX1BBU1NXT1JEXCIsIFtcblx0XHRcIlBPU1RHUkVTX1BBU1NXT1JEXCIsXG5cdF0pO1xuXG5cdGNvbnN0IGRldkNvbnRhaW5lciA9IHdvcmtzcGFjZS5nZXRNb2RlbDxEZXZDb250YWluZXI+KFdFTExfS05PV05fRklMRVMuREVWQ09OVEFJTkVSX0pTT04pO1xuXHRjb25zdCBjb21wb3NlID0gd29ya3NwYWNlLmdldE1vZGVsPERvY2tlckNvbXBvc2U+KFdFTExfS05PV05fRklMRVMuRE9DS0VSX0NPTVBPU0UpO1xuXG5cdGNvbnN0IG5ldHdvcmtLZXkgPSBuYW1lO1xuXHRjb25zdCB2b2x1bWVOYW1lID0gYCR7bmFtZX0tcG9zdGdyZXMtZGF0YWA7XG5cblx0aWYgKGNvbXBvc2UpIHtcblx0XHQvLyBPbmUgc2hhcmVkIGluc3RhbmNlLiBFYWNoIEFQSSBvd25zIGEgZGF0YWJhc2Ugb24gaXQgKGNyZWF0ZWQgYXQgYm9vdHN0cmFwKS5cblx0XHQvLyBQb2ludCBge1BSRUZJWH1fREJfSE9TVGAgLyBge1BSRUZJWH1fREJfUE9SVGAgYXQgYW5vdGhlciBzZXJ2ZXIgdG8gc3BsaXQgbGF0ZXIuXG5cdFx0Y29tcG9zZVxuXHRcdFx0LmFkZFNlcnZpY2UoXCJwb3N0Z3Jlc1wiLCB7XG5cdFx0XHRcdGltYWdlOiBcInBvc3RncmVzOjE2XCIsXG5cdFx0XHRcdGNvbnRhaW5lcl9uYW1lOiBgc2FtcGxlcy0ke25hbWV9LXBvc3RncmVzYCxcblx0XHRcdFx0cmVzdGFydDogXCJ1bmxlc3Mtc3RvcHBlZFwiLFxuXHRcdFx0XHRwb3J0czogW1wiMTI3LjAuMC4xOjU0MzM6NTQzMlwiXSxcblx0XHRcdFx0dm9sdW1lczogW1xuXHRcdFx0XHRcdGAke3ZvbHVtZU5hbWV9Oi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YWAsXG5cdFx0XHRcdFx0XCIuLi8uZGV2Y29udGFpbmVyL3Bvc3RncmVzLWluaXQ6L2RvY2tlci1lbnRyeXBvaW50LWluaXRkYi5kOnJvXCIsXG5cdFx0XHRcdF0sXG5cdFx0XHRcdG5ldHdvcmtzOiBbeyBbbmV0d29ya0tleV06IHsgYWxpYXNlczogW1wicG9zdGdyZXNcIl0gfSB9XSxcblx0XHRcdFx0aGVhbHRoY2hlY2s6IHtcblx0XHRcdFx0XHR0ZXN0OiBbXCJDTUQtU0hFTExcIiwgYHBnX2lzcmVhZHkgLVUgJHtwb3N0Z3Jlc1N1cGVydXNlcn1gXSxcblx0XHRcdFx0XHRpbnRlcnZhbDogXCIyc1wiLFxuXHRcdFx0XHRcdHRpbWVvdXQ6IFwiNXNcIixcblx0XHRcdFx0XHRyZXRyaWVzOiAxNSxcblx0XHRcdFx0fSxcblx0XHRcdH0pXG5cdFx0XHQuYWRkRW52RmlsZShcInBvc3RncmVzXCIsIFwiLi4vLmVudlwiKVxuXHRcdFx0LmFkZFZvbHVtZSh2b2x1bWVOYW1lKTtcblxuXHRcdGNvbXBvc2UuYWRkU2VydmljZShcImFkbWluZXJcIiwge1xuXHRcdFx0aW1hZ2U6IFwiYWRtaW5lclwiLFxuXHRcdFx0cHJvZmlsZXM6IFtcInRvb2xzXCJdLFxuXHRcdFx0cG9ydHM6IFtcIjEyNy4wLjAuMTo4MDgxOjgwODBcIl0sXG5cdFx0XHRuZXR3b3JrczogW25ldHdvcmtLZXldLFxuXHRcdH0pO1xuXG5cdFx0d29ya3NwYWNlLmFkZEZpbGUoe1xuXHRcdFx0ZmlsZXM6ICgpID0+IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpbGVQYXRoOiBcIi5kZXZjb250YWluZXIvcG9zdGdyZXMtaW5pdC8wMS1jcmVhdGUtYm9vdHN0cmFwLXJvbGUuc2hcIixcblx0XHRcdFx0XHRjb250ZW50OiBQT1NUR1JFU19JTklUX0JPT1RTVFJBUF9TSCxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cblx0XHRjb21wb3NlLmFkZEVudkZpbGUoXCJkZXZjb250YWluZXJcIiwgXCIuLi8uZW52XCIpO1xuXHR9XG5cblx0ZGV2Q29udGFpbmVyPy5hZGRFeHRlbnNpb24oXCJtdHhyLnNxbHRvb2xzXCIpO1xuXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5QQUNLQUdFX0pTT04pXG5cdFx0Py5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4XCIsIENSRUFURV9WRVJTSU9OKVxuXHRcdC5hZGREZXBlbmRlbmN5KFwidHlwZW9ybVwiLCBcIl4wLjMuMjhcIilcblx0XHQuYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIsIENSRUFURV9WRVJTSU9OKVxuXHRcdC5hZGRTY3JpcHQoXCJkYjp1cFwiLCBcImRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIHVwIC1kIHBvc3RncmVzXCIpXG5cdFx0LmFkZFNjcmlwdChcImRiOmRvd25cIiwgXCJkb2NrZXIgY29tcG9zZSAtZiAuZGV2Y29udGFpbmVyL2RvY2tlci1jb21wb3NlLnltbCBkb3duXCIpXG5cdFx0LmFkZFNjcmlwdChcblx0XHRcdFwiZGI6cmVzZXRcIixcblx0XHRcdFwiZG9ja2VyIGNvbXBvc2UgLWYgLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWwgZG93biAtdiAmJiBkb2NrZXIgY29tcG9zZSAtZiAuZGV2Y29udGFpbmVyL2RvY2tlci1jb21wb3NlLnltbCB1cCAtZCBwb3N0Z3Jlc1wiLFxuXHRcdCk7XG5cblx0d3JpdGVEYXRhYmFzZUNvbmZpZyh3b3Jrc3BhY2UsIGFwaU5hbWVzKTtcblxuXHRmb3IgKGNvbnN0IHByb2plY3Qgb2YgYXBpUHJvamVjdHMpIHtcblx0XHR3aXJlQXBpRGF0YWJhc2UocHJvamVjdCk7XG5cdH1cblxuXHRjb25zdCBlbnYgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8RW52RmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5FTlZfRklMRSk7XG5cdGVudlxuXHRcdD8uYWRkRW50cnkoXCJQT1NUR1JFU19EQlwiLCBpZGVudClcblx0XHQuYWRkRW50cnkoXCJQT1NUR1JFU19VU0VSXCIsIHBvc3RncmVzU3VwZXJ1c2VyKVxuXHRcdC5hZGRFbnRyeShcIlBPU1RHUkVTX1BBU1NXT1JEXCIsIHBvc3RncmVzUGFzc3dvcmQpXG5cdFx0LmFkZEVudHJ5KFwiREJfQURNSU5fVVNFUlwiLCBib290c3RyYXBVc2VyKVxuXHRcdC5hZGRFbnRyeShcIkRCX0FETUlOX1BBU1NXT1JEXCIsIGJvb3RzdHJhcFBhc3N3b3JkKTtcblxuXHRmb3IgKGNvbnN0IGFwaU5hbWUgb2YgYXBpTmFtZXMpIHtcblx0XHR3cml0ZUFwaURhdGFiYXNlRW52KHdvcmtzcGFjZSwgaWRlbnQsIGFwaU5hbWUpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHdyaXRlRGF0YWJhc2VDb25maWcod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwgYXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG5cdGNvbnN0IGNvbmZpZyA9IHdvcmtzcGFjZS5nZXRNb2RlbDxDb25maWdZYW1sPihXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ZQU1MKTtcblx0Y29uc3QgZGV2Q29uZmlnID0gd29ya3NwYWNlLmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX0RFVl9ZQU1MKTtcblx0Y29uc3QgcGVuZGluZyA9IGFwaU5hbWVzLmZpbHRlcigoYXBpTmFtZSkgPT4gIWNvbmZpZz8uaGFzRGF0YVNvdXJjZShhcGlOYW1lKSk7XG5cdGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG5cdGlmIChjb25maWc/Lmhhc0RhdGFTb3VyY2VzKCkpIHtcblx0XHRmb3IgKGNvbnN0IGFwaU5hbWUgb2YgcGVuZGluZykge1xuXHRcdFx0Y29uZmlnLmFwcGVuZERhdGFTb3VyY2UocmVuZGVyQmFzZURhdGFTb3VyY2UoYXBpTmFtZSkpO1xuXHRcdFx0ZGV2Q29uZmlnPy5hcHBlbmREYXRhU291cmNlKHJlbmRlckRldkRhdGFTb3VyY2UoYXBpTmFtZSkpO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25maWc/LmFkZFNlY3Rpb24ocmVuZGVyRGF0YWJhc2VTZWN0aW9uKHBlbmRpbmcsIHJlbmRlckJhc2VEYXRhU291cmNlKSk7XG5cdGRldkNvbmZpZz8uYWRkU2VjdGlvbihyZW5kZXJEYXRhYmFzZVNlY3Rpb24ocGVuZGluZywgcmVuZGVyRGV2RGF0YVNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUFwaURhdGFiYXNlRW52KFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRpZGVudDogc3RyaW5nLFxuXHRhcGlOYW1lOiBzdHJpbmcsXG4pOiB2b2lkIHtcblx0Y29uc3QgcHJlZml4ID0gYXBpRW52UHJlZml4KGFwaU5hbWUpO1xuXHRjb25zdCBzcWxBcGkgPSB0b1NxbElkZW50RnJhZ21lbnQoYXBpTmFtZSk7XG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxFbnZGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLkVOVl9GSUxFKVxuXHRcdD8uYWRkRW50cnkoYCR7cHJlZml4fV9EQl9IT1NUYCwgXCJwb3N0Z3Jlc1wiKVxuXHRcdC5hZGRFbnRyeShgJHtwcmVmaXh9X0RCX1BPUlRgLCBcIjU0MzJcIilcblx0XHQuYWRkRW50cnkoYCR7cHJlZml4fV9EQl9OQU1FYCwgYCR7aWRlbnR9XyR7c3FsQXBpfV9kZXZgKVxuXHRcdC5hZGRFbnRyeShgJHtwcmVmaXh9X0RCX1VTRVJgLCBgJHtpZGVudH1fJHtzcWxBcGl9X2FwcGApXG5cdFx0LmFkZEVudHJ5KGAke3ByZWZpeH1fREJfUEFTU1dPUkRgLCBwYXNzd29yZE9yRXhpc3Rpbmcod29ya3NwYWNlLCBgJHtwcmVmaXh9X0RCX1BBU1NXT1JEYCkpXG5cdFx0LmFkZEVudHJ5KGAke3ByZWZpeH1fREJfTUlHUkFURV9VU0VSYCwgYCR7aWRlbnR9XyR7c3FsQXBpfV9taWdyYXRlYClcblx0XHQuYWRkRW50cnkoXG5cdFx0XHRgJHtwcmVmaXh9X0RCX01JR1JBVEVfUEFTU1dPUkRgLFxuXHRcdFx0cGFzc3dvcmRPckV4aXN0aW5nKHdvcmtzcGFjZSwgYCR7cHJlZml4fV9EQl9NSUdSQVRFX1BBU1NXT1JEYCksXG5cdFx0KTtcbn1cblxuZnVuY3Rpb24gd2lyZUFwaURhdGFiYXNlKHByb2plY3Q6IFByb2plY3RTY2FmZm9sZCk6IHZvaWQge1xuXHRjb25zdCBhcGlOYW1lID0gYXBpTmFtZUZyb21Qcm9qZWN0RGlyKHByb2plY3QuZGlyKTtcblx0cHJvamVjdFxuXHRcdC5nZXRNb2RlbDxNYWluU291cmNlRmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTKVxuXHRcdD8uc2V0RGF0YVNvdXJjZU5hbWUoYXBpTmFtZSlcblx0XHQuYWRkU2lkZUVmZmVjdEltcG9ydChcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIpXG5cdFx0LmFkZEVudGl0eSh7IGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlcIiwgaW1wb3J0UGF0aDogXCIuL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIiB9KVxuXHRcdC5hZGRSZXBvc2l0b3J5KHtcblx0XHRcdGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlSZXBvc2l0b3J5XCIsXG5cdFx0XHRpbXBvcnRQYXRoOiBcIi4vcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LmpzXCIsXG5cdFx0fSk7XG5cdHByb2plY3Rcblx0XHQuZ2V0TW9kZWw8QXBpUGFja2FnZUpzb24+KFdFTExfS05PV05fRklMRVMuQVBJX1BBQ0tBR0VfSlNPTilcblx0XHQ/LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXhcIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiLCBDUkVBVEVfVkVSU0lPTik7XG5cdHByb2plY3QuYWRkRmlsZSh7XG5cdFx0ZmlsZXM6ICgpID0+IFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkudHNcIixcblx0XHRcdFx0Y29udGVudDogU0FNUExFX0VOVElUWV9UUyxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9yZXBvc2l0b3JpZXMvc2FtcGxlLnJlcG9zaXRvcnkudHNcIixcblx0XHRcdFx0Y29udGVudDogU0FNUExFX1JFUE9TSVRPUllfVFMsXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0pO1xufVxuXG5leHBvcnQgY29uc3QgRGF0YWJhc2VGZWF0dXJlOiBGZWF0dXJlPERhdGFiYXNlT3B0aW9ucz4gPSB7IGdldE9wdGlvbnMsIHNjYWZmb2xkIH07XG4iXSwibmFtZXMiOlsicmFuZG9tQnl0ZXMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwicGljayIsIldFTExfS05PV05fRklMRVMiLCJDUkVBVEVfVkVSU0lPTiIsImFwaUVudlByZWZpeCIsImFwaU5hbWVGcm9tUHJvamVjdERpciIsInJlYWRFeGlzdGluZ0VudlZhbHVlIiwid29ya3NwYWNlIiwia2V5IiwicmF3IiwidGFyZ2V0RGlyIiwibGluZSIsInNwbGl0IiwiZmluZCIsImwiLCJzdGFydHNXaXRoIiwidmFsdWUiLCJzbGljZSIsImxlbmd0aCIsInRyaW0iLCJ1bmRlZmluZWQiLCJyYW5kb21QYXNzd29yZCIsInRvU3RyaW5nIiwidG9TcWxJZGVudEZyYWdtZW50IiwibmFtZSIsImNsZWFuZWQiLCJyZXBsYWNlIiwicGFzc3dvcmRPckV4aXN0aW5nIiwiZmFsbGJhY2tFeGlzdGluZ0tleXMiLCJleGlzdGluZyIsImFsdCIsInYiLCJyZW5kZXJCYXNlRGF0YVNvdXJjZSIsImFwaU5hbWUiLCJwIiwicmVuZGVyRGV2RGF0YVNvdXJjZSIsInJlbmRlckRhdGFiYXNlU2VjdGlvbiIsImFwaU5hbWVzIiwiaXRlbXMiLCJtYXAiLCJQT1NUR1JFU19JTklUX0JPT1RTVFJBUF9TSCIsIlNBTVBMRV9FTlRJVFlfVFMiLCJTQU1QTEVfUkVQT1NJVE9SWV9UUyIsImdldE9wdGlvbnMiLCJfd29ya3NwYWNlIiwiY2xpT3B0aW9ucyIsImRhdGFiYXNlUHJvdmlkZXIiLCJjaG9pY2VzIiwibGFiZWwiLCJzZWxlY3RlZCIsImMiLCJzY2FmZm9sZCIsIm9wdGlvbnMiLCJpZGVudCIsImFwaVByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJwcm9qZWN0IiwiZGlyIiwicG9zdGdyZXNTdXBlcnVzZXIiLCJwb3N0Z3Jlc1Bhc3N3b3JkIiwiYm9vdHN0cmFwVXNlciIsImJvb3RzdHJhcFBhc3N3b3JkIiwiZGV2Q29udGFpbmVyIiwiZ2V0TW9kZWwiLCJERVZDT05UQUlORVJfSlNPTiIsImNvbXBvc2UiLCJET0NLRVJfQ09NUE9TRSIsIm5ldHdvcmtLZXkiLCJ2b2x1bWVOYW1lIiwiYWRkU2VydmljZSIsImltYWdlIiwiY29udGFpbmVyX25hbWUiLCJyZXN0YXJ0IiwicG9ydHMiLCJ2b2x1bWVzIiwibmV0d29ya3MiLCJhbGlhc2VzIiwiaGVhbHRoY2hlY2siLCJ0ZXN0IiwiaW50ZXJ2YWwiLCJ0aW1lb3V0IiwicmV0cmllcyIsImFkZEVudkZpbGUiLCJhZGRWb2x1bWUiLCJwcm9maWxlcyIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiY29udGVudCIsImFkZEV4dGVuc2lvbiIsIlBBQ0tBR0VfSlNPTiIsImFkZERlcGVuZGVuY3kiLCJhZGRTY3JpcHQiLCJ3cml0ZURhdGFiYXNlQ29uZmlnIiwid2lyZUFwaURhdGFiYXNlIiwiZW52IiwiRU5WX0ZJTEUiLCJhZGRFbnRyeSIsIndyaXRlQXBpRGF0YWJhc2VFbnYiLCJjb25maWciLCJDT05GSUdfWUFNTCIsImRldkNvbmZpZyIsIkNPTkZJR19ERVZfWUFNTCIsInBlbmRpbmciLCJmaWx0ZXIiLCJoYXNEYXRhU291cmNlIiwiaGFzRGF0YVNvdXJjZXMiLCJhcHBlbmREYXRhU291cmNlIiwiYWRkU2VjdGlvbiIsInByZWZpeCIsInNxbEFwaSIsIk1BSU5fVFMiLCJzZXREYXRhU291cmNlTmFtZSIsImFkZFNpZGVFZmZlY3RJbXBvcnQiLCJhZGRFbnRpdHkiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiYWRkUmVwb3NpdG9yeSIsIkFQSV9QQUNLQUdFX0pTT04iLCJEYXRhYmFzZUZlYXR1cmUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFdBQVcsUUFBUSxjQUFjO0FBQzFDLFNBQVNDLFlBQVksUUFBUSxVQUFVO0FBQ3ZDLFNBQVNDLElBQUksUUFBUSxZQUFZO0FBQ2pDLFNBQVNDLElBQUksUUFBUSx5QkFBeUI7QUFHOUMsU0FBU0MsZ0JBQWdCLFFBQVEsd0JBQXdCO0FBTXpELFNBQVNDLGNBQWMsUUFBUSxtQkFBbUI7QUFDbEQsU0FBU0MsWUFBWSxFQUFFQyxxQkFBcUIsUUFBUSxpQkFBaUI7QUFRckUsZ0VBQWdFLEdBQ2hFLFNBQVNDLHFCQUFxQkMsU0FBNEIsRUFBRUMsR0FBVztJQUN0RSxJQUFJO1FBQ0gsTUFBTUMsTUFBTVYsYUFBYUMs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
@@ -39,9 +39,13 @@ async function scaffold(workspace, options) {
39
39
  const answer = await ask("\nInstall dependencies now? [yes/no] (yes): ", "yes");
40
40
  _shouldInstall = answer.toLowerCase() !== "no";
41
41
  }
42
- async function finalize(workspace, _options) {
43
- // Last scaffold write step: normalize generated sources before install / handoff.
44
- formatScaffoldedFiles(workspace.targetDir);
42
+ async function finalize(workspace, options) {
43
+ const formatPaths = options.add ? workspace.getProjects().map((project)=>project.dir) : [
44
+ "."
45
+ ];
46
+ formatScaffoldedFiles(workspace.targetDir, formatPaths.length > 0 ? formatPaths : [
47
+ "."
48
+ ]);
45
49
  if (_shouldInstall) {
46
50
  const pm = _pm;
47
51
  console.log(`\nScaffolded ${workspace.name}. Installing dependencies...\n`);
@@ -49,14 +53,22 @@ async function finalize(workspace, _options) {
49
53
  cwd: workspace.targetDir
50
54
  });
51
55
  }
56
+ const apiNames = workspace.getProjects().map((project)=>project.dir.replace(/^projects\//, ""));
52
57
  console.log(`\nDone! ${_shouldInstall ? "Next" : "To get started:"} steps:\n`);
53
- console.log(` cd ${workspace.name}`);
58
+ if (!options.add) {
59
+ console.log(` cd ${workspace.name}`);
60
+ }
54
61
  if (!_shouldInstall) {
55
62
  const pmName = _pm?.name ?? "pnpm";
56
63
  console.log(` ${pmName} install`);
57
64
  }
58
- console.log(" code . # open in VS Code");
59
- console.log(" # then: Reopen in Container\n");
65
+ if (options.add && apiNames[0] != null) {
66
+ console.log(` pnpm run start:${apiNames[0]}`);
67
+ console.log(` docker build -f Dockerfile.${apiNames[0]} .`);
68
+ } else {
69
+ console.log(" code . # open in VS Code");
70
+ console.log(" # then: Reopen in Container\n");
71
+ }
60
72
  // Drop readline's stdin hold so the CLI / container can exit.
61
73
  closePrompt();
62
74
  }
@@ -66,4 +78,4 @@ export const FinalizeFeature = {
66
78
  finalize
67
79
  };
68
80
 
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2ZpbmFsaXplLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pbnRlcm9wXCI7XG5pbXBvcnQgeyBkZXRlY3RQYWNrYWdlTWFuYWdlciwgcHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2ludGVyb3BcIjtcbmltcG9ydCB7IGFzaywgY2xvc2VQcm9tcHQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgRW52RmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZW52LWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRTY2FmZm9sZGVkRmlsZXMgfSBmcm9tIFwiLi9iaW9tZS1mb3JtYXQuanNcIjtcblxuZnVuY3Rpb24gcmVhZEV4aXN0aW5nRW52VmFsdWUod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhqb2luKHdvcmtzcGFjZS50YXJnZXREaXIsIFwiLmVudlwiKSwgXCJ1dGY4XCIpO1xuXHRcdGNvbnN0IGxpbmUgPSByYXcuc3BsaXQoXCJcXG5cIikuZmluZCgobCkgPT4gbC5zdGFydHNXaXRoKGAke2tleX09YCkpO1xuXHRcdGNvbnN0IHZhbHVlID0gbGluZT8uc2xpY2Uoa2V5Lmxlbmd0aCArIDEpLnRyaW0oKTtcblx0XHRyZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8vIFN0YXRlIHJlc29sdmVkIGR1cmluZyBzY2FmZm9sZCgpLCBjb25zdW1lZCBieSBmaW5hbGl6ZSgpLlxubGV0IF9wbTogUGFja2FnZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbmxldCBfc2hvdWxkSW5zdGFsbCA9IHRydWU7XG5cbnR5cGUgRmluYWxpemVPcHRpb25zID0ge1xuXHRpbnN0YWxsRGVwZW5kZW5jaWVzPzogXCJ5ZXNcIiB8IFwibm9cIjtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnMoXG5cdF93b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPEZpbmFsaXplT3B0aW9ucz4sXG4pOiBQcm9taXNlPG9iamVjdD4ge1xuXHRpZiAoY2xpT3B0aW9ucy5pbnN0YWxsRGVwZW5kZW5jaWVzICE9IG51bGwpIHtcblx0XHRfc2hvdWxkSW5zdGFsbCA9IGNsaU9wdGlvbnMuaW5zdGFsbERlcGVuZGVuY2llcyA9PT0gXCJ5ZXNcIjtcblx0fVxuXHRyZXR1cm4ge307XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRvcHRpb25zOiBGaW5hbGl6ZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gTG9jYWwgc2NhZmZvbGQgZGVmYXVsdCDigJQgcHJvZHVjdGlvbiBkZXBsb3lzIG11c3Qgc2V0IE5PREVfRU5WIGV4cGxpY2l0bHkuXG5cdGNvbnN0IG5vZGVFbnYgPSByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2UsIFwiTk9ERV9FTlZcIikgPz8gXCJkZXZcIjtcblx0d29ya3NwYWNlLmdldE1vZGVsPEVudkZpbGU+KFdFTExfS05PV05fRklMRVMuRU5WX0ZJTEUpPy5hZGRFbnRyeShcIk5PREVfRU5WXCIsIG5vZGVFbnYpO1xuXG5cdGlmIChwcm9jZXNzLmVudi5ERUNPSEVSRV9CVUlMREVSID09PSBcIjFcIikge1xuXHRcdF9zaG91bGRJbnN0YWxsID0gZmFsc2U7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdF9wbSA9IGRldGVjdFBhY2thZ2VNYW5hZ2VyKHdvcmtzcGFjZS50YXJnZXREaXIpID8/IChhd2FpdCBwcm9tcHRGb3JQYWNrYWdlTWFuYWdlcigpKTtcblx0aWYgKG9wdGlvbnMuaW5zdGFsbERlcGVuZGVuY2llcyAhPSBudWxsKSB7XG5cdFx0X3Nob3VsZEluc3RhbGwgPSBvcHRpb25zLmluc3RhbGxEZXBlbmRlbmNpZXMgPT09IFwieWVzXCI7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYW5zd2VyID0gYXdhaXQgYXNrKFwiXFxuSW5zdGFsbCBkZXBlbmRlbmNpZXMgbm93PyBbeWVzL25vXSAoeWVzKTogXCIsIFwieWVzXCIpO1xuXHRfc2hvdWxkSW5zdGFsbCA9IGFuc3dlci50b0xvd2VyQ2FzZSgpICE9PSBcIm5vXCI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmFsaXplKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIF9vcHRpb25zOiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gTGFzdCBzY2FmZm9sZCB3cml0ZSBzdGVwOiBub3JtYWxpemUgZ2VuZXJhdGVkIHNvdXJjZXMgYmVmb3JlIGluc3RhbGwgLyBoYW5kb2ZmLlxuXHRmb3JtYXRTY2FmZm9sZGVkRmlsZXMod29ya3NwYWNlLnRhcmdldERpcik7XG5cblx0aWYgKF9zaG91bGRJbnN0YWxsKSB7XG5cdFx0Y29uc3QgcG0gPSBfcG0hO1xuXHRcdGNvbnNvbGUubG9nKGBcXG5TY2FmZm9sZGVkICR7d29ya3NwYWNlLm5hbWV9LiBJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLlxcbmApO1xuXHRcdGF3YWl0IHBtLmluc3RhbGwoeyBjd2Q6IHdvcmtzcGFjZS50YXJnZXREaXIgfSk7XG5cdH1cblxuXHRjb25zb2xlLmxvZyhgXFxuRG9uZSEgJHtfc2hvdWxkSW5zdGFsbCA/IFwiTmV4dFwiIDogXCJUbyBnZXQgc3RhcnRlZDpcIn0gc3RlcHM6XFxuYCk7XG5cdGNvbnNvbGUubG9nKGAgIGNkICR7d29ya3NwYWNlLm5hbWV9YCk7XG5cdGlmICghX3Nob3VsZEluc3RhbGwpIHtcblx0XHRjb25zdCBwbU5hbWUgPSBfcG0/Lm5hbWUgPz8gXCJwbnBtXCI7XG5cdFx0Y29uc29sZS5sb2coYCAgJHtwbU5hbWV9IGluc3RhbGxgKTtcblx0fVxuXHRjb25zb2xlLmxvZyhcIiAgY29kZSAuICAgICAgICAgIyBvcGVuIGluIFZTIENvZGVcIik7XG5cdGNvbnNvbGUubG9nKFwiICAgICAgICAgICAgICAgICAjIHRoZW46IFJlb3BlbiBpbiBDb250YWluZXJcXG5cIik7XG5cblx0Ly8gRHJvcCByZWFkbGluZSdzIHN0ZGluIGhvbGQgc28gdGhlIENMSSAvIGNvbnRhaW5lciBjYW4gZXhpdC5cblx0Y2xvc2VQcm9tcHQoKTtcbn1cblxuZXhwb3J0IGNvbnN0IEZpbmFsaXplRmVhdHVyZTogRmVhdHVyZSA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQsIGZpbmFsaXplIH07XG4iXSwibmFtZXMiOlsicmVhZEZpbGVTeW5jIiwiam9pbiIsImRldGVjdFBhY2thZ2VNYW5hZ2VyIiwicHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIiLCJhc2siLCJjbG9zZVByb21wdCIsIldFTExfS05PV05fRklMRVMiLCJmb3JtYXRTY2FmZm9sZGVkRmlsZXMiLCJyZWFkRXhpc3RpbmdFbnZWYWx1ZSIsIndvcmtzcGFjZSIsImtleSIsInJhdyIsInRhcmdldERpciIsImxpbmUiLCJzcGxpdCIsImZpbmQiLCJsIiwic3RhcnRzV2l0aCIsInZhbHVlIiwic2xpY2UiLCJsZW5ndGgiLCJ0cmltIiwidW5kZWZpbmVkIiwiX3BtIiwiX3Nob3VsZEluc3RhbGwiLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJpbnN0YWxsRGVwZW5kZW5jaWVzIiwic2NhZmZvbGQiLCJvcHRpb25zIiwibm9kZUVudiIsImdldE1vZGVsIiwiRU5WX0ZJTEUiLCJhZGRFbnRyeSIsInByb2Nlc3MiLCJlbnYiLCJERUNPSEVSRV9CVUlMREVSIiwiYW5zd2VyIiwidG9Mb3dlckNhc2UiLCJmaW5hbGl6ZSIsIl9vcHRpb25zIiwicG0iLCJjb25zb2xlIiwibG9nIiwibmFtZSIsImluc3RhbGwiLCJjd2QiLCJwbU5hbWUiLCJGaW5hbGl6ZUZlYXR1cmUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxVQUFVO0FBQ3ZDLFNBQVNDLElBQUksUUFBUSxZQUFZO0FBRWpDLFNBQVNDLG9CQUFvQixFQUFFQyx1QkFBdUIsUUFBUSwwQkFBMEI7QUFDeEYsU0FBU0MsR0FBRyxFQUFFQyxXQUFXLFFBQVEseUJBQXlCO0FBQzFELFNBQVNDLGdCQUFnQixRQUFRLHdCQUF3QjtBQUl6RCxTQUFTQyxxQkFBcUIsUUFBUSxvQkFBb0I7QUFFMUQsU0FBU0MscUJBQXFCQyxTQUE0QixFQUFFQyxHQUFXO0lBQ3RFLElBQUk7UUFDSCxNQUFNQyxNQUFNWCxhQUFhQyxLQUFLUSxVQUFVRyxTQUFTLEVBQUUsU0FBUztRQUM1RCxNQUFNQyxPQUFPRixJQUFJRyxLQUFLLENBQUMsTUFBTUMsSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUVDLFVBQVUsQ0FBQyxHQUFHUCxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNUSxRQUFRTCxNQUFNTSxNQUFNVCxJQUFJVSxNQUFNLEdBQUcsR0FBR0M7UUFDMUMsT0FBT0gsU0FBU0k7SUFDakIsRUFBRSxPQUFNO1FBQ1AsT0FBT0E7SUFDUjtBQUNEO0FBRUEsNERBQTREO0FBQzVELElBQUlDLE1BQTZCO0FBQ2pDLElBQUlDLGlCQUFpQjtBQU1yQixlQUFlQyxXQUNkQyxVQUE2QixFQUM3QkMsVUFBb0M7SUFFcEMsSUFBSUEsV0FBV0MsbUJBQW1CLElBQUksTUFBTTtRQUMzQ0osaUJBQWlCRyxXQUFXQyxtQkFBbUIsS0FBSztJQUNyRDtJQUNBLE9BQU8sQ0FBQztBQUNUO0FBRUEsZUFBZUMsU0FDZHBCLFNBQTRCLEVBQzVCcUIsT0FBd0I7SUFFeEIsNEVBQTRFO0lBQzVFLE1BQU1DLFVBQVV2QixxQkFBcUJDLFdBQVcsZUFBZTtJQUMvREEsVUFBVXVCLFFBQVEsQ0FBVTFCLGlCQUFpQjJCLFFBQVEsR0FBR0MsU0FBUyxZQUFZSDtJQUU3RSxJQUFJSSxRQUFRQyxHQUFHLENBQUNDLGdCQUFnQixLQUFLLEtBQUs7UUFDekNiLGlCQUFpQjtRQUNqQjtJQUNEO0lBQ0FELE1BQU1yQixxQkFBcUJPLFVBQVVHLFNBQVMsS0FBTSxNQUFNVDtJQUMxRCxJQUFJMkIsUUFBUUYsbUJBQW1CLElBQUksTUFBTTtRQUN4Q0osaUJBQWlCTSxRQUFRRixtQkFBbUIsS0FBSztRQUNqRDtJQUNEO0lBRUEsTUFBTVUsU0FBUyxNQUFNbEMsSUFBSSxnREFBZ0Q7SUFDekVvQixpQkFBaUJjLE9BQU9DLFdBQVcsT0FBTztBQUMzQztBQUVBLGVBQWVDLFNBQVMvQixTQUE0QixFQUFFZ0MsUUFBZ0I7SUFDckUsa0ZBQWtGO0lBQ2xGbEMsc0JBQXNCRSxVQUFVRyxTQUFTO0lBRXpDLElBQUlZLGdCQUFnQjtRQUNuQixNQUFNa0IsS0FBS25CO1FBQ1hvQixRQUFRQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUVuQyxVQUFVb0MsSUFBSSxDQUFDLDhCQUE4QixDQUFDO1FBQzFFLE1BQU1ILEdBQUdJLE9BQU8sQ0FBQztZQUFFQyxLQUFLdEMsVUFBVUcsU0FBUztRQUFDO0lBQzdDO0lBRUErQixRQUFRQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUVwQixpQkFBaUIsU0FBUyxrQkFBa0IsU0FBUyxDQUFDO0lBQzdFbUIsUUFBUUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFbkMsVUFBVW9DLElBQUksRUFBRTtJQUNwQyxJQUFJLENBQUNyQixnQkFBZ0I7UUFDcEIsTUFBTXdCLFNBQVN6QixLQUFLc0IsUUFBUTtRQUM1QkYsUUFBUUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFSSxPQUFPLFFBQVEsQ0FBQztJQUNsQztJQUNBTCxRQUFRQyxHQUFHLENBQUM7SUFDWkQsUUFBUUMsR0FBRyxDQUFDO0lBRVosOERBQThEO0lBQzlEdkM7QUFDRDtBQUVBLE9BQU8sTUFBTTRDLGtCQUEyQjtJQUFFeEI7SUFBWUk7SUFBVVc7QUFBUyxFQUFFIn0=
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2ZpbmFsaXplLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pbnRlcm9wXCI7XG5pbXBvcnQgeyBkZXRlY3RQYWNrYWdlTWFuYWdlciwgcHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2ludGVyb3BcIjtcbmltcG9ydCB7IGFzaywgY2xvc2VQcm9tcHQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgRW52RmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZW52LWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRTY2FmZm9sZGVkRmlsZXMgfSBmcm9tIFwiLi9iaW9tZS1mb3JtYXQuanNcIjtcblxuZnVuY3Rpb24gcmVhZEV4aXN0aW5nRW52VmFsdWUod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhqb2luKHdvcmtzcGFjZS50YXJnZXREaXIsIFwiLmVudlwiKSwgXCJ1dGY4XCIpO1xuXHRcdGNvbnN0IGxpbmUgPSByYXcuc3BsaXQoXCJcXG5cIikuZmluZCgobCkgPT4gbC5zdGFydHNXaXRoKGAke2tleX09YCkpO1xuXHRcdGNvbnN0IHZhbHVlID0gbGluZT8uc2xpY2Uoa2V5Lmxlbmd0aCArIDEpLnRyaW0oKTtcblx0XHRyZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8vIFN0YXRlIHJlc29sdmVkIGR1cmluZyBzY2FmZm9sZCgpLCBjb25zdW1lZCBieSBmaW5hbGl6ZSgpLlxubGV0IF9wbTogUGFja2FnZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbmxldCBfc2hvdWxkSW5zdGFsbCA9IHRydWU7XG5cbnR5cGUgRmluYWxpemVPcHRpb25zID0ge1xuXHRpbnN0YWxsRGVwZW5kZW5jaWVzPzogXCJ5ZXNcIiB8IFwibm9cIjtcblx0YWRkPzogYm9vbGVhbjtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnMoXG5cdF93b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPEZpbmFsaXplT3B0aW9ucz4sXG4pOiBQcm9taXNlPG9iamVjdD4ge1xuXHRpZiAoY2xpT3B0aW9ucy5pbnN0YWxsRGVwZW5kZW5jaWVzICE9IG51bGwpIHtcblx0XHRfc2hvdWxkSW5zdGFsbCA9IGNsaU9wdGlvbnMuaW5zdGFsbERlcGVuZGVuY2llcyA9PT0gXCJ5ZXNcIjtcblx0fVxuXHRyZXR1cm4ge307XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRvcHRpb25zOiBGaW5hbGl6ZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gTG9jYWwgc2NhZmZvbGQgZGVmYXVsdCDigJQgcHJvZHVjdGlvbiBkZXBsb3lzIG11c3Qgc2V0IE5PREVfRU5WIGV4cGxpY2l0bHkuXG5cdGNvbnN0IG5vZGVFbnYgPSByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2UsIFwiTk9ERV9FTlZcIikgPz8gXCJkZXZcIjtcblx0d29ya3NwYWNlLmdldE1vZGVsPEVudkZpbGU+KFdFTExfS05PV05fRklMRVMuRU5WX0ZJTEUpPy5hZGRFbnRyeShcIk5PREVfRU5WXCIsIG5vZGVFbnYpO1xuXG5cdGlmIChwcm9jZXNzLmVudi5ERUNPSEVSRV9CVUlMREVSID09PSBcIjFcIikge1xuXHRcdF9zaG91bGRJbnN0YWxsID0gZmFsc2U7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdF9wbSA9IGRldGVjdFBhY2thZ2VNYW5hZ2VyKHdvcmtzcGFjZS50YXJnZXREaXIpID8/IChhd2FpdCBwcm9tcHRGb3JQYWNrYWdlTWFuYWdlcigpKTtcblx0aWYgKG9wdGlvbnMuaW5zdGFsbERlcGVuZGVuY2llcyAhPSBudWxsKSB7XG5cdFx0X3Nob3VsZEluc3RhbGwgPSBvcHRpb25zLmluc3RhbGxEZXBlbmRlbmNpZXMgPT09IFwieWVzXCI7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYW5zd2VyID0gYXdhaXQgYXNrKFwiXFxuSW5zdGFsbCBkZXBlbmRlbmNpZXMgbm93PyBbeWVzL25vXSAoeWVzKTogXCIsIFwieWVzXCIpO1xuXHRfc2hvdWxkSW5zdGFsbCA9IGFuc3dlci50b0xvd2VyQ2FzZSgpICE9PSBcIm5vXCI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmFsaXplKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRvcHRpb25zOiBGaW5hbGl6ZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3QgZm9ybWF0UGF0aHMgPSBvcHRpb25zLmFkZFxuXHRcdD8gd29ya3NwYWNlLmdldFByb2plY3RzKCkubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpcilcblx0XHQ6IFtcIi5cIl07XG5cdGZvcm1hdFNjYWZmb2xkZWRGaWxlcyh3b3Jrc3BhY2UudGFyZ2V0RGlyLCBmb3JtYXRQYXRocy5sZW5ndGggPiAwID8gZm9ybWF0UGF0aHMgOiBbXCIuXCJdKTtcblxuXHRpZiAoX3Nob3VsZEluc3RhbGwpIHtcblx0XHRjb25zdCBwbSA9IF9wbSE7XG5cdFx0Y29uc29sZS5sb2coYFxcblNjYWZmb2xkZWQgJHt3b3Jrc3BhY2UubmFtZX0uIEluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLi4uXFxuYCk7XG5cdFx0YXdhaXQgcG0uaW5zdGFsbCh7IGN3ZDogd29ya3NwYWNlLnRhcmdldERpciB9KTtcblx0fVxuXG5cdGNvbnN0IGFwaU5hbWVzID0gd29ya3NwYWNlXG5cdFx0LmdldFByb2plY3RzKClcblx0XHQubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpci5yZXBsYWNlKC9ecHJvamVjdHNcXC8vLCBcIlwiKSk7XG5cdGNvbnNvbGUubG9nKGBcXG5Eb25lISAke19zaG91bGRJbnN0YWxsID8gXCJOZXh0XCIgOiBcIlRvIGdldCBzdGFydGVkOlwifSBzdGVwczpcXG5gKTtcblx0aWYgKCFvcHRpb25zLmFkZCkge1xuXHRcdGNvbnNvbGUubG9nKGAgIGNkICR7d29ya3NwYWNlLm5hbWV9YCk7XG5cdH1cblx0aWYgKCFfc2hvdWxkSW5zdGFsbCkge1xuXHRcdGNvbnN0IHBtTmFtZSA9IF9wbT8ubmFtZSA/PyBcInBucG1cIjtcblx0XHRjb25zb2xlLmxvZyhgICAke3BtTmFtZX0gaW5zdGFsbGApO1xuXHR9XG5cdGlmIChvcHRpb25zLmFkZCAmJiBhcGlOYW1lc1swXSAhPSBudWxsKSB7XG5cdFx0Y29uc29sZS5sb2coYCAgcG5wbSBydW4gc3RhcnQ6JHthcGlOYW1lc1swXX1gKTtcblx0XHRjb25zb2xlLmxvZyhgICBkb2NrZXIgYnVpbGQgLWYgRG9ja2VyZmlsZS4ke2FwaU5hbWVzWzBdfSAuYCk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc29sZS5sb2coXCIgIGNvZGUgLiAgICAgICAgICMgb3BlbiBpbiBWUyBDb2RlXCIpO1xuXHRcdGNvbnNvbGUubG9nKFwiICAgICAgICAgICAgICAgICAjIHRoZW46IFJlb3BlbiBpbiBDb250YWluZXJcXG5cIik7XG5cdH1cblxuXHQvLyBEcm9wIHJlYWRsaW5lJ3Mgc3RkaW4gaG9sZCBzbyB0aGUgQ0xJIC8gY29udGFpbmVyIGNhbiBleGl0LlxuXHRjbG9zZVByb21wdCgpO1xufVxuXG5leHBvcnQgY29uc3QgRmluYWxpemVGZWF0dXJlOiBGZWF0dXJlID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCwgZmluYWxpemUgfTtcbiJdLCJuYW1lcyI6WyJyZWFkRmlsZVN5bmMiLCJqb2luIiwiZGV0ZWN0UGFja2FnZU1hbmFnZXIiLCJwcm9tcHRGb3JQYWNrYWdlTWFuYWdlciIsImFzayIsImNsb3NlUHJvbXB0IiwiV0VMTF9LTk9XTl9GSUxFUyIsImZvcm1hdFNjYWZmb2xkZWRGaWxlcyIsInJlYWRFeGlzdGluZ0VudlZhbHVlIiwid29ya3NwYWNlIiwia2V5IiwicmF3IiwidGFyZ2V0RGlyIiwibGluZSIsInNwbGl0IiwiZmluZCIsImwiLCJzdGFydHNXaXRoIiwidmFsdWUiLCJzbGljZSIsImxlbmd0aCIsInRyaW0iLCJ1bmRlZmluZWQiLCJfcG0iLCJfc2hvdWxkSW5zdGFsbCIsImdldE9wdGlvbnMiLCJfd29ya3NwYWNlIiwiY2xpT3B0aW9ucyIsImluc3RhbGxEZXBlbmRlbmNpZXMiLCJzY2FmZm9sZCIsIm9wdGlvbnMiLCJub2RlRW52IiwiZ2V0TW9kZWwiLCJFTlZfRklMRSIsImFkZEVudHJ5IiwicHJvY2VzcyIsImVudiIsIkRFQ09IRVJFX0JVSUxERVIiLCJhbnN3ZXIiLCJ0b0xvd2VyQ2FzZSIsImZpbmFsaXplIiwiZm9ybWF0UGF0aHMiLCJhZGQiLCJnZXRQcm9qZWN0cyIsIm1hcCIsInByb2plY3QiLCJkaXIiLCJwbSIsImNvbnNvbGUiLCJsb2ciLCJuYW1lIiwiaW5zdGFsbCIsImN3ZCIsImFwaU5hbWVzIiwicmVwbGFjZSIsInBtTmFtZSIsIkZpbmFsaXpl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
@@ -1,17 +1,19 @@
1
1
  import { WELL_KNOWN_FILES } from "../../models/const.js";
2
2
  import { CREATE_VERSION } from "../../version.js";
3
3
  /**
4
- * Builder for `projects/api/package.json`.
4
+ * Builder for `projects/<api>/package.json`.
5
5
  *
6
6
  * Starts with the core cortex + crucible deps. Features can call
7
7
  * `addDependency` / `addDevDependency` to extend.
8
8
  */ export class ApiPackageJson {
9
- projectName;
9
+ workspaceName;
10
+ apiName;
10
11
  key = WELL_KNOWN_FILES.API_PACKAGE_JSON;
11
12
  _dependencies;
12
13
  _devDependencies = {};
13
- constructor(projectName){
14
- this.projectName = projectName;
14
+ constructor(workspaceName, apiName = "api"){
15
+ this.workspaceName = workspaceName;
16
+ this.apiName = apiName;
15
17
  this._dependencies = {
16
18
  "@decohere/cortex": CREATE_VERSION,
17
19
  "@decohere/crucible": CREATE_VERSION
@@ -27,7 +29,7 @@ import { CREATE_VERSION } from "../../version.js";
27
29
  }
28
30
  files() {
29
31
  const pkg = {
30
- name: `@${this.projectName}/api`,
32
+ name: `@${this.workspaceName}/${this.apiName}`,
31
33
  version: "0.0.1",
32
34
  private: true,
33
35
  type: "module",
@@ -53,4 +55,4 @@ import { CREATE_VERSION } from "../../version.js";
53
55
  }
54
56
  }
55
57
 
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5pbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi8uLi92ZXJzaW9uLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYHByb2plY3RzL2FwaS9wYWNrYWdlLmpzb25gLlxuICpcbiAqIFN0YXJ0cyB3aXRoIHRoZSBjb3JlIGNvcnRleCArIGNydWNpYmxlIGRlcHMuIEZlYXR1cmVzIGNhbiBjYWxsXG4gKiBgYWRkRGVwZW5kZW5jeWAgLyBgYWRkRGV2RGVwZW5kZW5jeWAgdG8gZXh0ZW5kLlxuICovXG5leHBvcnQgY2xhc3MgQXBpUGFja2FnZUpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuQVBJX1BBQ0tBR0VfSlNPTjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9kZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2RldkRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2plY3ROYW1lOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9jcnVjaWJsZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGFkZERlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZERldkRlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgcGtnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcblx0XHRcdG5hbWU6IGBAJHt0aGlzLnByb2plY3ROYW1lfS9hcGlgLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0cHJpdmF0ZTogdHJ1ZSxcblx0XHRcdHR5cGU6IFwibW9kdWxlXCIsXG5cdFx0XHRtYWluOiBcInNyYy9tYWluLnRzXCIsXG5cdFx0XHRzY3JpcHRzOiB7XG5cdFx0XHRcdGxpbnQ6IFwiYmlvbWUgY2hlY2sgLS13cml0ZSAuXCIsXG5cdFx0XHR9LFxuXHRcdFx0ZGVwZW5kZW5jaWVzOiB7IC4uLnRoaXMuX2RlcGVuZGVuY2llcyB9LFxuXHRcdH07XG5cdFx0aWYgKE9iamVjdC5rZXlzKHRoaXMuX2RldkRlcGVuZGVuY2llcykubGVuZ3RoID4gMCkge1xuXHRcdFx0cGtnLmRldkRlcGVuZGVuY2llcyA9IHsgLi4udGhpcy5fZGV2RGVwZW5kZW5jaWVzIH07XG5cdFx0fVxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInBhY2thZ2UuanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiV0VMTF9LTk9XTl9GSUxFUyIsIkNSRUFURV9WRVJTSU9OIiwiQXBpUGFja2FnZUpzb24iLCJrZXkiLCJBUElfUEFDS0FHRV9KU09OIiwiX2RlcGVuZGVuY2llcyIsIl9kZXZEZXBlbmRlbmNpZXMiLCJwcm9qZWN0TmFtZSIsImFkZERlcGVuZGVuY3kiLCJuYW1lIiwidmVyc2lvbiIsImFkZERldkRlcGVuZGVuY3kiLCJmaWxlcyIsInBrZyIsInByaXZhdGUiLCJ0eXBlIiwibWFpbiIsInNjcmlwdHMiLCJsaW50IiwiZGVwZW5kZW5jaWVzIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImRldkRlcGVuZGVuY2llcyIsImZpbGVQYXRoIiwiY29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGdCQUFnQixRQUFRLHdCQUF3QjtBQUV6RCxTQUFTQyxjQUFjLFFBQVEsbUJBQW1CO0FBRWxEOzs7OztDQUtDLEdBQ0QsT0FBTyxNQUFNQzs7SUFDSUMsTUFBTUgsaUJBQWlCSSxnQkFBZ0IsQ0FBQztJQUV2Q0MsY0FBc0M7SUFDdENDLG1CQUEyQyxDQUFDLEVBQUU7SUFFL0QsWUFBbUIsQUFBaUJDLFdBQW1CLENBQUU7YUFBckJBLGNBQUFBO1FBQ25DLElBQUksQ0FBQ0YsYUFBYSxHQUFHO1lBQ3BCLG9CQUFvQko7WUFDcEIsc0JBQXNCQTtRQUN2QjtJQUNEO0lBRU9PLGNBQWNDLElBQVksRUFBRUMsT0FBZSxFQUFRO1FBQ3pELElBQUksQ0FBQ0wsYUFBYSxDQUFDSSxLQUFLLEdBQUdDO1FBQzNCLE9BQU8sSUFBSTtJQUNaO0lBRU9DLGlCQUFpQkYsSUFBWSxFQUFFQyxPQUFlLEVBQVE7UUFDNUQsSUFBSSxDQUFDSixnQkFBZ0IsQ0FBQ0csS0FBSyxHQUFHQztRQUM5QixPQUFPLElBQUk7SUFDWjtJQUVPRSxRQUFzQjtRQUM1QixNQUFNQyxNQUErQjtZQUNwQ0osTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUNGLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDaENHLFNBQVM7WUFDVEksU0FBUztZQUNUQyxNQUFNO1lBQ05DLE1BQU07WUFDTkMsU0FBUztnQkFDUkMsTUFBTTtZQUNQO1lBQ0FDLGNBQWM7Z0JBQUUsR0FBRyxJQUFJLENBQUNkLGFBQWE7WUFBQztRQUN2QztRQUNBLElBQUllLE9BQU9DLElBQUksQ0FBQyxJQUFJLENBQUNmLGdCQUFnQixFQUFFZ0IsTUFBTSxHQUFHLEdBQUc7WUFDbERULElBQUlVLGVBQWUsR0FBRztnQkFBRSxHQUFHLElBQUksQ0FBQ2pCLGdCQUFnQjtZQUFDO1FBQ2xEO1FBQ0EsT0FBTztZQUNOO2dCQUNDa0IsVUFBVTtnQkFDVkMsU0FBU0MsS0FBS0MsU0FBUyxDQUFDZCxLQUFLLE1BQU07WUFDcEM7U0FDQTtJQUNGO0FBQ0QifQ==
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5pbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi8uLi92ZXJzaW9uLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYHByb2plY3RzLzxhcGk+L3BhY2thZ2UuanNvbmAuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIGNvcmUgY29ydGV4ICsgY3J1Y2libGUgZGVwcy4gRmVhdHVyZXMgY2FuIGNhbGxcbiAqIGBhZGREZXBlbmRlbmN5YCAvIGBhZGREZXZEZXBlbmRlbmN5YCB0byBleHRlbmQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlQYWNrYWdlSnNvbiBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5BUElfUEFDS0FHRV9KU09OO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX2RlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0cHJpdmF0ZSByZWFkb25seSBfZGV2RGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlTmFtZTogc3RyaW5nLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgYXBpTmFtZSA9IFwiYXBpXCIsXG5cdCkge1xuXHRcdHRoaXMuX2RlcGVuZGVuY2llcyA9IHtcblx0XHRcdFwiQGRlY29oZXJlL2NvcnRleFwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwiQGRlY29oZXJlL2NydWNpYmxlXCI6IENSRUFURV9WRVJTSU9OLFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgYWRkRGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkRGV2RGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RldkRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBwa2c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuXHRcdFx0bmFtZTogYEAke3RoaXMud29ya3NwYWNlTmFtZX0vJHt0aGlzLmFwaU5hbWV9YCxcblx0XHRcdHZlcnNpb246IFwiMC4wLjFcIixcblx0XHRcdHByaXZhdGU6IHRydWUsXG5cdFx0XHR0eXBlOiBcIm1vZHVsZVwiLFxuXHRcdFx0bWFpbjogXCJzcmMvbWFpbi50c1wiLFxuXHRcdFx0c2NyaXB0czoge1xuXHRcdFx0XHRsaW50OiBcImJpb21lIGNoZWNrIC0td3JpdGUgLlwiLFxuXHRcdFx0fSxcblx0XHRcdGRlcGVuZGVuY2llczogeyAuLi50aGlzLl9kZXBlbmRlbmNpZXMgfSxcblx0XHR9O1xuXHRcdGlmIChPYmplY3Qua2V5cyh0aGlzLl9kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdHBrZy5kZXZEZXBlbmRlbmNpZXMgPSB7IC4uLnRoaXMuX2RldkRlcGVuZGVuY2llcyB9O1xuXHRcdH1cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJwYWNrYWdlLmpzb25cIixcblx0XHRcdFx0Y29udGVudDogSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIldFTExfS05PV05fRklMRVMiLCJDUkVBVEVfVkVSU0lPTiIsIkFwaVBhY2thZ2VKc29uIiwia2V5IiwiQVBJX1BBQ0tBR0VfSlNPTiIsIl9kZXBlbmRlbmNpZXMiLCJfZGV2RGVwZW5kZW5jaWVzIiwid29ya3NwYWNlTmFtZSIsImFwaU5hbWUiLCJhZGREZXBlbmRlbmN5IiwibmFtZSIsInZlcnNpb24iLCJhZGREZXZEZXBlbmRlbmN5IiwiZmlsZXMiLCJwa2ciLCJwcml2YXRlIiwidHlwZSIsIm1haW4iLCJzY3JpcHRzIiwibGludCIsImRlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJkZXZEZXBlbmRlbmNpZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFFekQsU0FBU0MsY0FBYyxRQUFRLG1CQUFtQjtBQUVsRDs7Ozs7Q0FLQyxHQUNELE9BQU8sTUFBTUM7OztJQUNJQyxNQUFNSCxpQkFBaUJJLGdCQUFnQixDQUFDO0lBRXZDQyxjQUFzQztJQUN0Q0MsbUJBQTJDLENBQUMsRUFBRTtJQUUvRCxZQUNDLEFBQWlCQyxhQUFxQixFQUN0QyxBQUFpQkMsVUFBVSxLQUFLLENBQy9CO2FBRmdCRCxnQkFBQUE7YUFDQUMsVUFBQUE7UUFFakIsSUFBSSxDQUFDSCxhQUFhLEdBQUc7WUFDcEIsb0JBQW9CSjtZQUNwQixzQkFBc0JBO1FBQ3ZCO0lBQ0Q7SUFFT1EsY0FBY0MsSUFBWSxFQUFFQyxPQUFlLEVBQVE7UUFDekQsSUFBSSxDQUFDTixhQUFhLENBQUNLLEtBQUssR0FBR0M7UUFDM0IsT0FBTyxJQUFJO0lBQ1o7SUFFT0MsaUJBQWlCRixJQUFZLEVBQUVDLE9BQWUsRUFBUTtRQUM1RCxJQUFJLENBQUNMLGdCQUFnQixDQUFDSSxLQUFLLEdBQUdDO1FBQzlCLE9BQU8sSUFBSTtJQUNaO0lBRU9FLFFBQXNCO1FBQzVCLE1BQU1DLE1BQStCO1lBQ3BDSixNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ0gsYUFBYSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUNDLE9BQU8sRUFBRTtZQUM5Q0csU0FBUztZQUNUSSxTQUFTO1lBQ1RDLE1BQU07WUFDTkMsTUFBTTtZQUNOQyxTQUFTO2dCQUNSQyxNQUFNO1lBQ1A7WUFDQUMsY0FBYztnQkFBRSxHQUFHLElBQUksQ0FBQ2YsYUFBYTtZQUFDO1FBQ3ZDO1FBQ0EsSUFBSWdCLE9BQU9DLElBQUksQ0FBQyxJQUFJLENBQUNoQixnQkFBZ0IsRUFBRWlCLE1BQU0sR0FBRyxHQUFHO1lBQ2xEVCxJQUFJVSxlQUFlLEdBQUc7Z0JBQUUsR0FBRyxJQUFJLENBQUNsQixnQkFBZ0I7WUFBQztRQUNsRDtRQUNBLE9BQU87WUFDTjtnQkFDQ21CLFVBQVU7Z0JBQ1ZDLFNBQVNDLEtBQUtDLFNBQVMsQ0FBQ2QsS0FBSyxNQUFNO1lBQ3BDO1NBQ0E7SUFDRjtBQUNEIn0=