sonamu 0.9.19 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +200 -387
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +21 -32
- package/dist/auth/audit-log/builders.js +2 -3
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.js +19 -41
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +151 -258
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +156 -310
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +8 -7
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +146 -314
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +9 -20
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.js +1 -2
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +99 -195
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +7 -7
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +14 -4
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/entity-basic.md +31 -0
- package/src/skills/sonamu/puri.md +22 -0
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/skills/sonamu/upsert.md +53 -6
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
3
3
|
import { BUILT_IN_TYPE_IDS, SonamuFileArraySchema, SonamuFileSchema, init_types, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanSingleProp, isDateArrayProp, isDateSingleProp, isEnumArrayProp, isEnumSingleProp, isIntegerArrayProp, isIntegerSingleProp, isJsonProp, isNumberArrayProp, isNumberSingleProp, isNumericArrayProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isSearchTextProp, isStringArrayProp, isStringSingleProp, isTsVectorProp, isUuidArrayProp, isUuidSingleProp, isVectorArrayProp, isVectorSingleProp, isVirtualProp } from "../types/types.js";
|
|
4
4
|
import { createImportUrl, init_esm_utils } from "../utils/esm-utils.js";
|
|
@@ -7,7 +7,6 @@ import { EntityManager, init_entity_manager } from "../entity/entity-manager.js"
|
|
|
7
7
|
import inflection from "inflection";
|
|
8
8
|
import { z as z$1 } from "zod";
|
|
9
9
|
import path from "path";
|
|
10
|
-
|
|
11
10
|
//#region src/template/zod-converter.ts
|
|
12
11
|
/**
|
|
13
12
|
* zod-converter 구성
|
|
@@ -29,8 +28,7 @@ import path from "path";
|
|
|
29
28
|
* - resolveRenderType
|
|
30
29
|
*/
|
|
31
30
|
function getBuiltInSchemaName(zodType) {
|
|
32
|
-
|
|
33
|
-
return matched?.[1].schemaName;
|
|
31
|
+
return Object.entries(BUILT_IN_TYPES).find(([typeId]) => zodType.description === typeId)?.[1].schemaName;
|
|
34
32
|
}
|
|
35
33
|
/**
|
|
36
34
|
* zodFormat을 Zod 4 코드 문자열로 변환합니다.
|
|
@@ -50,12 +48,8 @@ function zodFormatToCode(format) {
|
|
|
50
48
|
hashSha384: "z.hash(\"sha384\")",
|
|
51
49
|
hashSha512: "z.hash(\"sha512\")"
|
|
52
50
|
};
|
|
53
|
-
if (format in isoFormats)
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
if (format in hashFormats) {
|
|
57
|
-
return hashFormats[format];
|
|
58
|
-
}
|
|
51
|
+
if (format in isoFormats) return isoFormats[format];
|
|
52
|
+
if (format in hashFormats) return hashFormats[format];
|
|
59
53
|
return `z.${format}()`;
|
|
60
54
|
}
|
|
61
55
|
/**
|
|
@@ -84,18 +78,12 @@ function zodFormatToType(format) {
|
|
|
84
78
|
async function getZodTypeById(zodTypeId) {
|
|
85
79
|
if (BUILT_IN_TYPE_IDS.includes(zodTypeId)) {
|
|
86
80
|
const builtInType = BUILT_IN_TYPES[zodTypeId];
|
|
87
|
-
if (!builtInType) {
|
|
88
|
-
throw new Error(`내장 타입 ${zodTypeId}의 스키마가 정의되지 않았습니다`);
|
|
89
|
-
}
|
|
81
|
+
if (!builtInType) throw new Error(`내장 타입 ${zodTypeId}의 스키마가 정의되지 않았습니다`);
|
|
90
82
|
return builtInType.schema.describe(zodTypeId);
|
|
91
83
|
}
|
|
92
84
|
const modulePath = EntityManager.getModulePath(zodTypeId);
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
const imported = await import(importUrl);
|
|
96
|
-
if (!imported[zodTypeId]) {
|
|
97
|
-
throw new Error(`존재하지 않는 zodTypeId ${zodTypeId}`);
|
|
98
|
-
}
|
|
85
|
+
const imported = await import(createImportUrl(path.join(Sonamu.apiRootPath, runtimePath(`dist/application/${modulePath}.js`))));
|
|
86
|
+
if (!imported[zodTypeId]) throw new Error(`존재하지 않는 zodTypeId ${zodTypeId}`);
|
|
99
87
|
return imported[zodTypeId].describe(zodTypeId);
|
|
100
88
|
}
|
|
101
89
|
/**
|
|
@@ -104,91 +92,49 @@ async function getZodTypeById(zodTypeId) {
|
|
|
104
92
|
*/
|
|
105
93
|
async function propToZodType(prop) {
|
|
106
94
|
let zodType = z$1.unknown();
|
|
107
|
-
if (isIntegerSingleProp(prop))
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
zodType =
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
} else if (isStringSingleProp(prop)) {
|
|
120
|
-
if (prop.zodFormat) {
|
|
121
|
-
zodType = zodFormatToType(prop.zodFormat);
|
|
122
|
-
if (prop.length && "max" in zodType) {
|
|
123
|
-
zodType = zodType.max(prop.length);
|
|
124
|
-
}
|
|
125
|
-
} else if (prop.length) {
|
|
126
|
-
zodType = z$1.string().max(prop.length);
|
|
127
|
-
} else {
|
|
128
|
-
zodType = z$1.string();
|
|
129
|
-
}
|
|
130
|
-
} else if (isStringArrayProp(prop)) {
|
|
95
|
+
if (isIntegerSingleProp(prop)) zodType = z$1.number().int();
|
|
96
|
+
else if (isIntegerArrayProp(prop)) zodType = z$1.number().int().array();
|
|
97
|
+
else if (isBigIntegerSingleProp(prop)) zodType = z$1.bigint();
|
|
98
|
+
else if (isBigIntegerArrayProp(prop)) zodType = z$1.bigint().array();
|
|
99
|
+
else if (isEnumSingleProp(prop)) zodType = await getZodTypeById(prop.id);
|
|
100
|
+
else if (isEnumArrayProp(prop)) zodType = (await getZodTypeById(prop.id)).array();
|
|
101
|
+
else if (isStringSingleProp(prop)) if (prop.zodFormat) {
|
|
102
|
+
zodType = zodFormatToType(prop.zodFormat);
|
|
103
|
+
if (prop.length && "max" in zodType) zodType = zodType.max(prop.length);
|
|
104
|
+
} else if (prop.length) zodType = z$1.string().max(prop.length);
|
|
105
|
+
else zodType = z$1.string();
|
|
106
|
+
else if (isStringArrayProp(prop)) {
|
|
131
107
|
let elementType;
|
|
132
108
|
if (prop.zodFormat) {
|
|
133
109
|
elementType = zodFormatToType(prop.zodFormat);
|
|
134
|
-
if (prop.length && "max" in elementType)
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
} else if (prop.length) {
|
|
138
|
-
elementType = z$1.string().max(prop.length);
|
|
139
|
-
} else {
|
|
140
|
-
elementType = z$1.string();
|
|
141
|
-
}
|
|
110
|
+
if (prop.length && "max" in elementType) elementType = elementType.max(prop.length);
|
|
111
|
+
} else if (prop.length) elementType = z$1.string().max(prop.length);
|
|
112
|
+
else elementType = z$1.string();
|
|
142
113
|
zodType = elementType.array();
|
|
143
|
-
} else if (isNumberSingleProp(prop))
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
} else if (isUuidSingleProp(prop)) {
|
|
160
|
-
zodType = z$1.uuid();
|
|
161
|
-
} else if (isUuidArrayProp(prop)) {
|
|
162
|
-
zodType = z$1.uuid().array();
|
|
163
|
-
} else if (isJsonProp(prop)) {
|
|
164
|
-
zodType = await getZodTypeById(prop.id);
|
|
165
|
-
} else if (isSearchTextProp(prop)) {
|
|
166
|
-
zodType = z$1.string();
|
|
167
|
-
} else if (isVectorSingleProp(prop)) {
|
|
168
|
-
zodType = z$1.array(z$1.number());
|
|
169
|
-
} else if (isVectorArrayProp(prop)) {
|
|
170
|
-
zodType = z$1.array(z$1.array(z$1.number()));
|
|
171
|
-
} else if (isVirtualProp(prop)) {
|
|
172
|
-
zodType = await getZodTypeById(prop.id);
|
|
173
|
-
} else if (isRelationProp(prop)) {
|
|
114
|
+
} else if (isNumberSingleProp(prop)) zodType = z$1.number();
|
|
115
|
+
else if (isNumberArrayProp(prop)) zodType = z$1.number().array();
|
|
116
|
+
else if (isNumericSingleProp(prop)) zodType = z$1.string();
|
|
117
|
+
else if (isNumericArrayProp(prop)) zodType = z$1.string().array();
|
|
118
|
+
else if (isBooleanSingleProp(prop)) zodType = z$1.boolean();
|
|
119
|
+
else if (isBooleanArrayProp(prop)) zodType = z$1.boolean().array();
|
|
120
|
+
else if (isDateSingleProp(prop)) zodType = z$1.date();
|
|
121
|
+
else if (isDateArrayProp(prop)) zodType = z$1.date().array();
|
|
122
|
+
else if (isUuidSingleProp(prop)) zodType = z$1.uuid();
|
|
123
|
+
else if (isUuidArrayProp(prop)) zodType = z$1.uuid().array();
|
|
124
|
+
else if (isJsonProp(prop)) zodType = await getZodTypeById(prop.id);
|
|
125
|
+
else if (isSearchTextProp(prop)) zodType = z$1.string();
|
|
126
|
+
else if (isVectorSingleProp(prop)) zodType = z$1.array(z$1.number());
|
|
127
|
+
else if (isVectorArrayProp(prop)) zodType = z$1.array(z$1.array(z$1.number()));
|
|
128
|
+
else if (isVirtualProp(prop)) zodType = await getZodTypeById(prop.id);
|
|
129
|
+
else if (isRelationProp(prop)) {
|
|
174
130
|
if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
zodType = z$1.string();
|
|
179
|
-
} else {
|
|
180
|
-
zodType = z$1.number().int();
|
|
181
|
-
}
|
|
131
|
+
const pkType = EntityManager.get(prop.with).getPkType();
|
|
132
|
+
if (pkType === "string" || pkType === "uuid") zodType = z$1.string();
|
|
133
|
+
else zodType = z$1.number().int();
|
|
182
134
|
}
|
|
183
|
-
} else {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
if (prop.unsigned) {
|
|
187
|
-
zodType = zodType.nonnegative();
|
|
188
|
-
}
|
|
189
|
-
if (prop.nullable) {
|
|
190
|
-
zodType = zodType.nullable();
|
|
191
|
-
}
|
|
135
|
+
} else throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
|
|
136
|
+
if (prop.unsigned) zodType = zodType.nonnegative();
|
|
137
|
+
if (prop.nullable) zodType = zodType.nullable();
|
|
192
138
|
return zodType;
|
|
193
139
|
}
|
|
194
140
|
/**
|
|
@@ -196,110 +142,62 @@ async function propToZodType(prop) {
|
|
|
196
142
|
*/
|
|
197
143
|
function propToZodTypeDef(prop, injectImportKeys) {
|
|
198
144
|
let stmt;
|
|
199
|
-
if (isIntegerSingleProp(prop)) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
stmt = `${prop.name}: z.bigint()`;
|
|
205
|
-
} else if (isBigIntegerArrayProp(prop)) {
|
|
206
|
-
stmt = `${prop.name}: z.bigint().array()`;
|
|
207
|
-
} else if (isEnumSingleProp(prop)) {
|
|
145
|
+
if (isIntegerSingleProp(prop)) stmt = `${prop.name}: z.int()`;
|
|
146
|
+
else if (isIntegerArrayProp(prop)) stmt = `${prop.name}: z.int().array()`;
|
|
147
|
+
else if (isBigIntegerSingleProp(prop)) stmt = `${prop.name}: z.bigint()`;
|
|
148
|
+
else if (isBigIntegerArrayProp(prop)) stmt = `${prop.name}: z.bigint().array()`;
|
|
149
|
+
else if (isEnumSingleProp(prop)) {
|
|
208
150
|
stmt = `${prop.name}: ${prop.id}`;
|
|
209
151
|
injectImportKeys.push(prop.id);
|
|
210
152
|
} else if (isEnumArrayProp(prop)) {
|
|
211
153
|
stmt = `${prop.name}: ${prop.id}.array()`;
|
|
212
154
|
injectImportKeys.push(prop.id);
|
|
213
|
-
} else if (isStringSingleProp(prop)) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
} else
|
|
240
|
-
stmt = `${prop.name}: z.number()`;
|
|
241
|
-
} else if (isNumberArrayProp(prop)) {
|
|
242
|
-
stmt = `${prop.name}: z.number().array()`;
|
|
243
|
-
} else if (isNumericSingleProp(prop)) {
|
|
244
|
-
stmt = `${prop.name}: z.string()`;
|
|
245
|
-
} else if (isNumericArrayProp(prop)) {
|
|
246
|
-
stmt = `${prop.name}: z.string().array()`;
|
|
247
|
-
} else if (isDateSingleProp(prop)) {
|
|
248
|
-
stmt = `${prop.name}: z.date()`;
|
|
249
|
-
} else if (isDateArrayProp(prop)) {
|
|
250
|
-
stmt = `${prop.name}: z.date().array()`;
|
|
251
|
-
} else if (isBooleanSingleProp(prop)) {
|
|
252
|
-
stmt = `${prop.name}: z.boolean()`;
|
|
253
|
-
} else if (isBooleanArrayProp(prop)) {
|
|
254
|
-
stmt = `${prop.name}: z.boolean().array()`;
|
|
255
|
-
} else if (isUuidSingleProp(prop)) {
|
|
256
|
-
stmt = `${prop.name}: z.uuid()`;
|
|
257
|
-
} else if (isUuidArrayProp(prop)) {
|
|
258
|
-
stmt = `${prop.name}: z.uuid().array()`;
|
|
259
|
-
} else if (isJsonProp(prop)) {
|
|
260
|
-
if (BUILT_IN_TYPE_IDS.includes(prop.id)) {
|
|
261
|
-
const schemaName = prop.id === "SonamuFile" ? "SonamuFileSchema" : "SonamuFileArraySchema";
|
|
262
|
-
stmt = `${prop.name}: ${schemaName}`;
|
|
263
|
-
injectImportKeys.push(schemaName);
|
|
264
|
-
} else {
|
|
265
|
-
stmt = `${prop.name}: ${prop.id}`;
|
|
266
|
-
injectImportKeys.push(prop.id);
|
|
267
|
-
}
|
|
268
|
-
} else if (isSearchTextProp(prop)) {
|
|
269
|
-
stmt = `${prop.name}: z.string()`;
|
|
270
|
-
} else if (isVectorSingleProp(prop)) {
|
|
271
|
-
stmt = `${prop.name}: z.array(z.number())`;
|
|
272
|
-
} else if (isVectorArrayProp(prop)) {
|
|
273
|
-
stmt = `${prop.name}: z.array(z.array(z.number()))`;
|
|
274
|
-
} else if (isTsVectorProp(prop)) {
|
|
275
|
-
stmt = `${prop.name}: z.string()`;
|
|
276
|
-
} else if (isVirtualProp(prop)) {
|
|
155
|
+
} else if (isStringSingleProp(prop)) if (prop.zodFormat) {
|
|
156
|
+
const base = zodFormatToCode(prop.zodFormat);
|
|
157
|
+
if (prop.length) stmt = `${prop.name}: ${base}.max(${prop.length})`;
|
|
158
|
+
else stmt = `${prop.name}: ${base}`;
|
|
159
|
+
} else if (prop.length) stmt = `${prop.name}: z.string().max(${prop.length})`;
|
|
160
|
+
else stmt = `${prop.name}: z.string()`;
|
|
161
|
+
else if (isStringArrayProp(prop)) if (prop.zodFormat) {
|
|
162
|
+
const base = zodFormatToCode(prop.zodFormat);
|
|
163
|
+
if (prop.length) stmt = `${prop.name}: ${base}.max(${prop.length}).array()`;
|
|
164
|
+
else stmt = `${prop.name}: ${base}.array()`;
|
|
165
|
+
} else if (prop.length) stmt = `${prop.name}: z.string().max(${prop.length}).array()`;
|
|
166
|
+
else stmt = `${prop.name}: z.string().array()`;
|
|
167
|
+
else if (isNumberSingleProp(prop)) stmt = `${prop.name}: z.number()`;
|
|
168
|
+
else if (isNumberArrayProp(prop)) stmt = `${prop.name}: z.number().array()`;
|
|
169
|
+
else if (isNumericSingleProp(prop)) stmt = `${prop.name}: z.string()`;
|
|
170
|
+
else if (isNumericArrayProp(prop)) stmt = `${prop.name}: z.string().array()`;
|
|
171
|
+
else if (isDateSingleProp(prop)) stmt = `${prop.name}: z.date()`;
|
|
172
|
+
else if (isDateArrayProp(prop)) stmt = `${prop.name}: z.date().array()`;
|
|
173
|
+
else if (isBooleanSingleProp(prop)) stmt = `${prop.name}: z.boolean()`;
|
|
174
|
+
else if (isBooleanArrayProp(prop)) stmt = `${prop.name}: z.boolean().array()`;
|
|
175
|
+
else if (isUuidSingleProp(prop)) stmt = `${prop.name}: z.uuid()`;
|
|
176
|
+
else if (isUuidArrayProp(prop)) stmt = `${prop.name}: z.uuid().array()`;
|
|
177
|
+
else if (isJsonProp(prop)) if (BUILT_IN_TYPE_IDS.includes(prop.id)) {
|
|
178
|
+
const schemaName = prop.id === "SonamuFile" ? "SonamuFileSchema" : "SonamuFileArraySchema";
|
|
179
|
+
stmt = `${prop.name}: ${schemaName}`;
|
|
180
|
+
injectImportKeys.push(schemaName);
|
|
181
|
+
} else {
|
|
277
182
|
stmt = `${prop.name}: ${prop.id}`;
|
|
278
183
|
injectImportKeys.push(prop.id);
|
|
279
|
-
} else if (isRelationProp(prop)) {
|
|
280
|
-
if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
|
|
281
|
-
const relEntity = EntityManager.get(prop.with);
|
|
282
|
-
const pkType = relEntity.getPkType();
|
|
283
|
-
if (pkType === "string" || pkType === "uuid") {
|
|
284
|
-
stmt = `${prop.name}_id: z.string()`;
|
|
285
|
-
} else {
|
|
286
|
-
stmt = `${prop.name}_id: z.int()`;
|
|
287
|
-
}
|
|
288
|
-
} else {
|
|
289
|
-
return `// ${prop.name}: ${prop.relationType} ${prop.with}`;
|
|
290
|
-
}
|
|
291
|
-
} else {
|
|
292
|
-
return "// unable to resolve";
|
|
293
|
-
}
|
|
294
|
-
if (prop.unsigned) {
|
|
295
|
-
stmt += ".nonnegative()";
|
|
296
|
-
}
|
|
297
|
-
if (prop.nullable) {
|
|
298
|
-
stmt += ".nullable()";
|
|
299
|
-
}
|
|
300
|
-
if (isNumericSingleProp(prop) || isNumericArrayProp(prop)) {
|
|
301
|
-
stmt += ".meta({ SonamuPropType: \"numeric\" })";
|
|
302
184
|
}
|
|
185
|
+
else if (isSearchTextProp(prop)) stmt = `${prop.name}: z.string()`;
|
|
186
|
+
else if (isVectorSingleProp(prop)) stmt = `${prop.name}: z.array(z.number())`;
|
|
187
|
+
else if (isVectorArrayProp(prop)) stmt = `${prop.name}: z.array(z.array(z.number()))`;
|
|
188
|
+
else if (isTsVectorProp(prop)) stmt = `${prop.name}: z.string()`;
|
|
189
|
+
else if (isVirtualProp(prop)) {
|
|
190
|
+
stmt = `${prop.name}: ${prop.id}`;
|
|
191
|
+
injectImportKeys.push(prop.id);
|
|
192
|
+
} else if (isRelationProp(prop)) if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
|
|
193
|
+
const pkType = EntityManager.get(prop.with).getPkType();
|
|
194
|
+
if (pkType === "string" || pkType === "uuid") stmt = `${prop.name}_id: z.string()`;
|
|
195
|
+
else stmt = `${prop.name}_id: z.int()`;
|
|
196
|
+
} else return `// ${prop.name}: ${prop.relationType} ${prop.with}`;
|
|
197
|
+
else return "// unable to resolve";
|
|
198
|
+
if (prop.unsigned) stmt += ".nonnegative()";
|
|
199
|
+
if (prop.nullable) stmt += ".nullable()";
|
|
200
|
+
if (isNumericSingleProp(prop) || isNumericArrayProp(prop)) stmt += ".meta({ SonamuPropType: \"numeric\" })";
|
|
303
201
|
return `${stmt},`;
|
|
304
202
|
}
|
|
305
203
|
/**
|
|
@@ -307,27 +205,22 @@ function propToZodTypeDef(prop, injectImportKeys) {
|
|
|
307
205
|
* plain, array, object 노드 타입을 재귀적으로 처리하여 중첩 구조를 지원합니다.
|
|
308
206
|
*/
|
|
309
207
|
function propNodeToZodTypeDef(propNode, injectImportKeys) {
|
|
310
|
-
if (propNode.nodeType === "plain")
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
`})${propNode.prop?.nullable ? ".nullable()" : ""},`
|
|
327
|
-
].join("\n");
|
|
328
|
-
} else {
|
|
329
|
-
throw Error;
|
|
330
|
-
}
|
|
208
|
+
if (propNode.nodeType === "plain") return propToZodTypeDef(propNode.prop, injectImportKeys);
|
|
209
|
+
else if (propNode.nodeType === "array") return [
|
|
210
|
+
propNode.prop ? `${propNode.prop.name}: ` : "",
|
|
211
|
+
"z.array(z.object({",
|
|
212
|
+
propNode.children.map((childPropNode) => propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
|
|
213
|
+
"",
|
|
214
|
+
"})),"
|
|
215
|
+
].join("\n");
|
|
216
|
+
else if (propNode.nodeType === "object") return [
|
|
217
|
+
propNode.prop ? `${propNode.prop.name}: ` : "",
|
|
218
|
+
"z.object({",
|
|
219
|
+
propNode.children.map((childPropNode) => propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
|
|
220
|
+
"",
|
|
221
|
+
`})${propNode.prop?.nullable ? ".nullable()" : ""},`
|
|
222
|
+
].join("\n");
|
|
223
|
+
else throw Error;
|
|
331
224
|
}
|
|
332
225
|
function zodTypeToTsTypeDef(zt) {
|
|
333
226
|
switch (zt.def.type) {
|
|
@@ -348,15 +241,9 @@ function zodTypeToTsTypeDef(zt) {
|
|
|
348
241
|
return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
|
|
349
242
|
}
|
|
350
243
|
case "literal": return Array.from(zt.values).map((value) => {
|
|
351
|
-
if (typeof value === "string") {
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
if (value === null) {
|
|
355
|
-
return `null`;
|
|
356
|
-
}
|
|
357
|
-
if (value === undefined) {
|
|
358
|
-
return `undefined`;
|
|
359
|
-
}
|
|
244
|
+
if (typeof value === "string") return `"${value}"`;
|
|
245
|
+
if (value === null) return `null`;
|
|
246
|
+
if (value === void 0) return `undefined`;
|
|
360
247
|
return `${value}`;
|
|
361
248
|
}).join(" | ");
|
|
362
249
|
case "union": return `${zt.options.map((option) => zodTypeToTsTypeDef(option)).join(" | ")}`;
|
|
@@ -367,11 +254,8 @@ function zodTypeToTsTypeDef(zt) {
|
|
|
367
254
|
return [
|
|
368
255
|
"{",
|
|
369
256
|
...Object.keys(shape).map((key) => {
|
|
370
|
-
if (shape[key].def.type === "optional") {
|
|
371
|
-
|
|
372
|
-
} else {
|
|
373
|
-
return `${key}: ${zodTypeToTsTypeDef(shape[key])},`;
|
|
374
|
-
}
|
|
257
|
+
if (shape[key].def.type === "optional") return `${key}?: ${zodTypeToTsTypeDef(shape[key].def.innerType)},`;
|
|
258
|
+
else return `${key}: ${zodTypeToTsTypeDef(shape[key])},`;
|
|
375
259
|
}),
|
|
376
260
|
"}"
|
|
377
261
|
].join("\n");
|
|
@@ -379,20 +263,12 @@ function zodTypeToTsTypeDef(zt) {
|
|
|
379
263
|
case "optional": return `${zodTypeToTsTypeDef(zt.def.innerType)} | undefined`;
|
|
380
264
|
case "template_literal": {
|
|
381
265
|
const def = zt.def;
|
|
382
|
-
if (!def.parts || def.parts.length === 0)
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
if (typeof part === "string") {
|
|
387
|
-
return `${part}`;
|
|
388
|
-
}
|
|
389
|
-
if (part && typeof part === "object" && part._zod) {
|
|
390
|
-
const innerType = zodTypeToTsTypeDef(part);
|
|
391
|
-
return `$\{${innerType}}`;
|
|
392
|
-
}
|
|
266
|
+
if (!def.parts || def.parts.length === 0) return "string";
|
|
267
|
+
return `\`${def.parts.map((part) => {
|
|
268
|
+
if (typeof part === "string") return `${part}`;
|
|
269
|
+
if (part && typeof part === "object" && part._zod) return `$\{${zodTypeToTsTypeDef(part)}}`;
|
|
393
270
|
return `\${string}`;
|
|
394
|
-
})
|
|
395
|
-
return `\`${parts.join("")}\``;
|
|
271
|
+
}).join("")}\``;
|
|
396
272
|
}
|
|
397
273
|
case "file": return "File";
|
|
398
274
|
default: throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
@@ -429,20 +305,12 @@ function zodTypeToZodCode(zt, injectImportKeys = []) {
|
|
|
429
305
|
}
|
|
430
306
|
case "literal": {
|
|
431
307
|
const items = Array.from(zt.values).map((value) => {
|
|
432
|
-
if (typeof value === "string") {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
if (value === null) {
|
|
436
|
-
return `null`;
|
|
437
|
-
}
|
|
438
|
-
if (value === undefined) {
|
|
439
|
-
return `undefined`;
|
|
440
|
-
}
|
|
308
|
+
if (typeof value === "string") return `"${value}"`;
|
|
309
|
+
if (value === null) return `null`;
|
|
310
|
+
if (value === void 0) return `undefined`;
|
|
441
311
|
return `${value}`;
|
|
442
312
|
});
|
|
443
|
-
if (items.length === 1) {
|
|
444
|
-
return `z.literal(${items[0]})`;
|
|
445
|
-
}
|
|
313
|
+
if (items.length === 1) return `z.literal(${items[0]})`;
|
|
446
314
|
return `z.literal([${items.join(", ")}])`;
|
|
447
315
|
}
|
|
448
316
|
case "union": return `z.union([${zt.def.options.map((option) => zodTypeToZodCode(option, injectImportKeys)).join(",")}])`;
|
|
@@ -460,19 +328,12 @@ function zodTypeToZodCode(zt, injectImportKeys = []) {
|
|
|
460
328
|
case "file": return `z.file()`;
|
|
461
329
|
case "template_literal": {
|
|
462
330
|
const def = zt.def;
|
|
463
|
-
if (!def.parts || def.parts.length === 0)
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
if (typeof part === "string") {
|
|
468
|
-
return `"${part}"`;
|
|
469
|
-
}
|
|
470
|
-
if (part && typeof part === "object" && part._zod) {
|
|
471
|
-
return zodTypeToZodCode(part, injectImportKeys);
|
|
472
|
-
}
|
|
331
|
+
if (!def.parts || def.parts.length === 0) return "z.templateLiteral([])";
|
|
332
|
+
return `z.templateLiteral([${def.parts.map((part) => {
|
|
333
|
+
if (typeof part === "string") return `"${part}"`;
|
|
334
|
+
if (part && typeof part === "object" && part._zod) return zodTypeToZodCode(part, injectImportKeys);
|
|
473
335
|
return "z.string()";
|
|
474
|
-
})
|
|
475
|
-
return `z.templateLiteral([${parts.join(", ")}])`;
|
|
336
|
+
}).join(", ")}])`;
|
|
476
337
|
}
|
|
477
338
|
case "intersection": {
|
|
478
339
|
const zIntersectionDef = zt.def;
|
|
@@ -505,21 +366,16 @@ function zodTypeToRenderingNode(zodType, baseKey = "root") {
|
|
|
505
366
|
* - z.ZodUnion, z.ZodOptional, z.ZodNullable : 유틸리티 타입
|
|
506
367
|
* - 기타 : resolveRenderType()으로 처리
|
|
507
368
|
*/
|
|
508
|
-
if (zodType.description === "SonamuFile[]") {
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
...def,
|
|
517
|
-
renderType: "json-sonamufile"
|
|
518
|
-
};
|
|
519
|
-
}
|
|
369
|
+
if (zodType.description === "SonamuFile[]") return {
|
|
370
|
+
...def,
|
|
371
|
+
renderType: "json-sonamufile-array"
|
|
372
|
+
};
|
|
373
|
+
if (zodType.description === "SonamuFile") return {
|
|
374
|
+
...def,
|
|
375
|
+
renderType: "json-sonamufile"
|
|
376
|
+
};
|
|
520
377
|
if (zodType instanceof z$1.ZodObject) {
|
|
521
|
-
const
|
|
522
|
-
const children = columnKeys.map((key) => {
|
|
378
|
+
const children = Object.keys(zodType.shape).map((key) => {
|
|
523
379
|
const innerType = zodType.shape[key];
|
|
524
380
|
return zodTypeToRenderingNode(innerType, key);
|
|
525
381
|
});
|
|
@@ -530,82 +386,51 @@ function zodTypeToRenderingNode(zodType, baseKey = "root") {
|
|
|
530
386
|
};
|
|
531
387
|
} else if (zodType instanceof z$1.ZodArray) {
|
|
532
388
|
const innerType = zodType.def.element;
|
|
533
|
-
if (innerType instanceof z$1.ZodNumber && (baseKey.includes("embedding") || baseKey.includes("vector"))) {
|
|
534
|
-
return {
|
|
535
|
-
...def,
|
|
536
|
-
renderType: "vector"
|
|
537
|
-
};
|
|
538
|
-
}
|
|
539
|
-
return {
|
|
389
|
+
if (innerType instanceof z$1.ZodNumber && (baseKey.includes("embedding") || baseKey.includes("vector"))) return {
|
|
540
390
|
...def,
|
|
541
|
-
renderType: "
|
|
542
|
-
element: zodTypeToRenderingNode(innerType, baseKey)
|
|
543
|
-
};
|
|
544
|
-
} else if (zodType instanceof z$1.ZodUnion) {
|
|
545
|
-
const optionNodes = zodType.def.options.map((opt) => zodTypeToRenderingNode(opt, baseKey));
|
|
546
|
-
return optionNodes[0];
|
|
547
|
-
} else if (zodType instanceof z$1.ZodOptional) {
|
|
548
|
-
return {
|
|
549
|
-
...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
|
|
550
|
-
optional: true
|
|
391
|
+
renderType: "vector"
|
|
551
392
|
};
|
|
552
|
-
} else if (zodType instanceof z$1.ZodNullable) {
|
|
553
|
-
return {
|
|
554
|
-
...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
|
|
555
|
-
nullable: true
|
|
556
|
-
};
|
|
557
|
-
} else {
|
|
558
393
|
return {
|
|
559
394
|
...def,
|
|
560
|
-
renderType:
|
|
395
|
+
renderType: "array",
|
|
396
|
+
element: zodTypeToRenderingNode(innerType, baseKey)
|
|
561
397
|
};
|
|
562
|
-
}
|
|
398
|
+
} else if (zodType instanceof z$1.ZodUnion) return zodType.def.options.map((opt) => zodTypeToRenderingNode(opt, baseKey))[0];
|
|
399
|
+
else if (zodType instanceof z$1.ZodOptional) return {
|
|
400
|
+
...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
|
|
401
|
+
optional: true
|
|
402
|
+
};
|
|
403
|
+
else if (zodType instanceof z$1.ZodNullable) return {
|
|
404
|
+
...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
|
|
405
|
+
nullable: true
|
|
406
|
+
};
|
|
407
|
+
else return {
|
|
408
|
+
...def,
|
|
409
|
+
renderType: resolveRenderType(baseKey, zodType)
|
|
410
|
+
};
|
|
563
411
|
}
|
|
564
412
|
/**
|
|
565
413
|
* Zod 타입과 키 이름으로부터 적절한 RenderType을 결정합니다.
|
|
566
414
|
*/
|
|
567
415
|
function resolveRenderType(key, zodType) {
|
|
568
|
-
if (zodType instanceof z$1.ZodDate)
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
return "number-fk_id";
|
|
587
|
-
} else {
|
|
588
|
-
return "number-plain";
|
|
589
|
-
}
|
|
590
|
-
} else if (zodType instanceof z$1.ZodBoolean) {
|
|
591
|
-
return "boolean";
|
|
592
|
-
} else if (zodType instanceof z$1.ZodEnum) {
|
|
593
|
-
return "enums";
|
|
594
|
-
} else if (zodType instanceof z$1.ZodRecord) {
|
|
595
|
-
return "record";
|
|
596
|
-
} else if (zodType instanceof z$1.ZodAny || zodType instanceof z$1.ZodUnknown) {
|
|
597
|
-
return "string-plain";
|
|
598
|
-
} else if (zodType instanceof z$1.ZodUnion) {
|
|
599
|
-
return "string-plain";
|
|
600
|
-
} else if (zodType instanceof z$1.ZodLiteral) {
|
|
601
|
-
return "string-plain";
|
|
602
|
-
} else if (zodType instanceof z$1.ZodTemplateLiteral) {
|
|
603
|
-
return "string-plain";
|
|
604
|
-
} else if (zodType.def.type === "custom") {
|
|
605
|
-
return "object";
|
|
606
|
-
} else {
|
|
607
|
-
throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
|
|
608
|
-
}
|
|
416
|
+
if (zodType instanceof z$1.ZodDate) return "datetime";
|
|
417
|
+
else if (zodType instanceof z$1.core.$ZodString) if (zodType.description === "SQLDateTimeString") return "string-datetime";
|
|
418
|
+
else if (key.endsWith("date")) return "string-date";
|
|
419
|
+
else if (key === "id") return "string-id";
|
|
420
|
+
else if (key.endsWith("_id")) return "string-fk_id";
|
|
421
|
+
else return "string-plain";
|
|
422
|
+
else if (zodType instanceof z$1.ZodNumber) if (key === "id") return "number-id";
|
|
423
|
+
else if (key.endsWith("_id")) return "number-fk_id";
|
|
424
|
+
else return "number-plain";
|
|
425
|
+
else if (zodType instanceof z$1.ZodBoolean) return "boolean";
|
|
426
|
+
else if (zodType instanceof z$1.ZodEnum) return "enums";
|
|
427
|
+
else if (zodType instanceof z$1.ZodRecord) return "record";
|
|
428
|
+
else if (zodType instanceof z$1.ZodAny || zodType instanceof z$1.ZodUnknown) return "string-plain";
|
|
429
|
+
else if (zodType instanceof z$1.ZodUnion) return "string-plain";
|
|
430
|
+
else if (zodType instanceof z$1.ZodLiteral) return "string-plain";
|
|
431
|
+
else if (zodType instanceof z$1.ZodTemplateLiteral) return "string-plain";
|
|
432
|
+
else if (zodType.def.type === "custom") return "object";
|
|
433
|
+
else throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
|
|
609
434
|
}
|
|
610
435
|
var BUILT_IN_TYPES;
|
|
611
436
|
var init_zod_converter = __esmMin((() => {
|
|
@@ -627,8 +452,8 @@ var init_zod_converter = __esmMin((() => {
|
|
|
627
452
|
}
|
|
628
453
|
};
|
|
629
454
|
}));
|
|
630
|
-
|
|
631
455
|
//#endregion
|
|
632
456
|
init_zod_converter();
|
|
633
457
|
export { BUILT_IN_TYPES, getZodTypeById, init_zod_converter, propNodeToZodTypeDef, propToZodType, propToZodTypeDef, zodTypeToRenderingNode, zodTypeToTsTypeDef, zodTypeToZodCode };
|
|
634
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbImlzb0Zvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJoYXNoRm9ybWF0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsInoiLCJ6b2RUeXBlOiB6LlpvZFR5cGVBbnkiLCJlbGVtZW50VHlwZTogei5ab2RUeXBlIiwic3RtdDogc3RyaW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3pvZC1jb252ZXJ0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxuLy8gPGFueT7rpbwg7J6Q7KCc7ZWY6rOgLCBab2Tsl5DshJwg7KCc7JW97ZWY64qUIOq4sOuzuOyggeyduCBHZW5lcmljIFR5cGUgUGFyYW1ldGVy66W8IOyCrOyaqe2VqC5cbnR5cGUgQW55Wm9kUmVjb3JkID0gei5ab2RSZWNvcmQ8ei5ab2RTdHJpbmcgfCB6LlpvZE51bWJlciB8IHouWm9kU3ltYm9sLCB6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RPYmplY3QgPSB6LlpvZE9iamVjdDtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RUZW1wbGF0ZUxpdGVyYWwgPSB6LlpvZFRlbXBsYXRlTGl0ZXJhbDtcblxuLyoqXG4gKiDrgrTsnqUg7YOA7J6FIOygleydmCAoWm9kIOyKpO2CpOuniCArIFVJIOugjOuNlOungSDtg4DsnoUpXG4gKi9cbmV4cG9ydCBjb25zdCBCVUlMVF9JTl9UWVBFUyA9IHtcbiAgU29uYW11RmlsZToge1xuICAgIHNjaGVtYTogU29uYW11RmlsZVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZVNjaGVtYVwiLFxuICB9LFxuICBcIlNvbmFtdUZpbGVbXVwiOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gICAgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIixcbiAgICBzY2hlbWFOYW1lOiBcIlNvbmFtdUZpbGVBcnJheVNjaGVtYVwiLFxuICB9LFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZ2V0QnVpbHRJblNjaGVtYU5hbWUoem9kVHlwZTogei5ab2RUeXBlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2hlZCA9IE9iamVjdC5lbnRyaWVzKEJVSUxUX0lOX1RZUEVTKS5maW5kKChbdHlwZUlkXSkgPT4gem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gdHlwZUlkKTtcbiAgcmV0dXJuIG1hdGNoZWQ/LlsxXS5zY2hlbWFOYW1lO1xufVxuXG4vKipcbiAqIHpvZEZvcm1hdOydhCBab2QgNCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9Db2RlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogc3RyaW5nIHtcbiAgLy8gSVNPIO2PrOunt+ydgCB6Lmlzby54eHgoKSDtmJXtg5xcbiAgY29uc3QgaXNvRm9ybWF0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBpc29EYXRlOiBcInouaXNvLmRhdGUoKVwiLFxuICAgIGlzb1RpbWU6IFwiei5pc28udGltZSgpXCIsXG4gICAgaXNvRGF0ZXRpbWU6IFwiei5pc28uZGF0ZXRpbWUoKVwiLFxuICAgIGlzb0R1cmF0aW9uOiBcInouaXNvLmR1cmF0aW9uKClcIixcbiAgfTtcblxuICAvLyBoYXNoIO2PrOunt+ydgCB6Lmhhc2goXCJhbGdvcml0aG1cIikg7ZiV7YOcXG4gIGNvbnN0IGhhc2hGb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGhhc2hNZDU6ICd6Lmhhc2goXCJtZDVcIiknLFxuICAgIGhhc2hTaGExOiAnei5oYXNoKFwic2hhMVwiKScsXG4gICAgaGFzaFNoYTI1NjogJ3ouaGFzaChcInNoYTI1NlwiKScsXG4gICAgaGFzaFNoYTM4NDogJ3ouaGFzaChcInNoYTM4NFwiKScsXG4gICAgaGFzaFNoYTUxMjogJ3ouaGFzaChcInNoYTUxMlwiKScsXG4gIH07XG5cbiAgaWYgKGZvcm1hdCBpbiBpc29Gb3JtYXRzKSB7XG4gICAgcmV0dXJuIGlzb0Zvcm1hdHNbZm9ybWF0XTtcbiAgfVxuXG4gIGlmIChmb3JtYXQgaW4gaGFzaEZvcm1hdHMpIHtcbiAgICByZXR1cm4gaGFzaEZvcm1hdHNbZm9ybWF0XTtcbiAgfVxuXG4gIC8vIOq4sOuzuCDtj6zrp7fsnYAgei54eHgoKSDtmJXtg5wgKFpvZCA0KVxuICByZXR1cm4gYHouJHtmb3JtYXR9KClgO1xufVxuXG4vKipcbiAqIHpvZEZvcm1hdOydhCBab2QgNCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb1R5cGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiB6LlpvZFR5cGUge1xuICAvLyBJU08g7Y+s66e37J2AIHouaXNvLnh4eCgpIO2Yle2DnFxuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJpc29EYXRlXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZSgpO1xuICAgIGNhc2UgXCJpc29UaW1lXCI6XG4gICAgICByZXR1cm4gei5pc28udGltZSgpO1xuICAgIGNhc2UgXCJpc29EYXRldGltZVwiOlxuICAgICAgcmV0dXJuIHouaXNvLmRhdGV0aW1lKCk7XG4gICAgY2FzZSBcImlzb0R1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gei5pc28uZHVyYXRpb24oKTtcbiAgICAvLyBoYXNoIO2PrOunt+ydgCB6Lmhhc2goXCJhbGdvcml0aG1cIikg7ZiV7YOcXG4gICAgY2FzZSBcImhhc2hNZDVcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJtZDVcIik7XG4gICAgY2FzZSBcImhhc2hTaGExXCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMVwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTI1NlwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTI1NlwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTM4NFwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTM4NFwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTUxMlwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTUxMlwiKTtcbiAgICAvLyDquLDrs7gg7Y+s66e37J2AIHoueHh4KCkg7ZiV7YOcIChab2QgNClcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICh6IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgKCkgPT4gei5ab2RUeXBlPilbZm9ybWF0XSgpO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyehSBJROuhnOu2gO2EsCDrj5nsoIHsnLzroZwgWm9kIOyKpO2CpOuniOulvCDroZzrk5ztlanri4jri6QuXG4gKiDrgrTsnqUg7YOA7J6FKEJVSUxUX0lOX1RZUEVfSURTKeydgCDrsJTroZwg67CY7ZmY7ZWY6rOgLFxuICog6re4IOyZuOuKlCBkaXN0IOuUlOugie2GoOumrOyXkOyEnCBFU03snLzroZwgaW1wb3J07ZWY7JesIOqwgOyguOyYteuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFpvZFR5cGVCeUlkKHpvZFR5cGVJZDogc3RyaW5nKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgLy8g64K07J6lIO2DgOyehSDsspjrpqxcbiAgaWYgKChCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoem9kVHlwZUlkKSkge1xuICAgIGNvbnN0IGJ1aWx0SW5UeXBlID0gQlVJTFRfSU5fVFlQRVNbem9kVHlwZUlkIGFzIGtleW9mIHR5cGVvZiBCVUlMVF9JTl9UWVBFU107XG4gICAgaWYgKCFidWlsdEluVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDrgrTsnqUg7YOA7J6FICR7em9kVHlwZUlkfeydmCDsiqTtgqTrp4jqsIAg7KCV7J2Y65CY7KeAIOyViuyVmOyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbHRJblR5cGUuc2NoZW1hLmRlc2NyaWJlKHpvZFR5cGVJZCk7XG4gIH1cblxuICAvLyDtlITroZzsoJ3tirjsl5DshJwg7KCV7J2Y7ZWcIO2DgOyehSDrj5nsoIEg66Gc65OcXG4gIGNvbnN0IG1vZHVsZVBhdGggPSBFbnRpdHlNYW5hZ2VyLmdldE1vZHVsZVBhdGgoem9kVHlwZUlkKTtcbiAgY29uc3QgbW9kdWxlQWJzUGF0aCA9IHBhdGguam9pbihcbiAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHttb2R1bGVQYXRofS5qc2ApLFxuICApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3DsnYQgWm9kIO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDqsIEgcHJvcOydmCDtg4DsnoXsl5Ag65Sw6528IOyggeygiO2VnCBab2QgdmFsaWRhdG9y66W8IOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3BUb1pvZFR5cGUocHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIGxldCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkgPSB6LnVua25vd24oKTtcbiAgaWYgKGlzSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKTtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IChhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKSkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIHpvZFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gem9kVHlwZSkge1xuICAgICAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RTdHJpbmcpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgbGV0IGVsZW1lbnRUeXBlOiB6LlpvZFR5cGU7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBlbGVtZW50VHlwZSA9IHpvZEZvcm1hdFRvVHlwZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGggJiYgXCJtYXhcIiBpbiBlbGVtZW50VHlwZSkge1xuICAgICAgICBlbGVtZW50VHlwZSA9IChlbGVtZW50VHlwZSBhcyB6LlpvZFN0cmluZykubWF4KHByb3AubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBlbGVtZW50VHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgICB6b2RUeXBlID0gZWxlbWVudFR5cGUuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKTtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5udW1iZXIoKSk7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIC8vIEZLIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcHJvcOydhCB6b2RUeXBl7Jy866GcIOuzgO2ZmO2VmOuKlOuNsCDsi6TtjKggJHtwcm9wfX1gKTtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZE51bWJlcikubm9ubmVnYXRpdmUoKTtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHpvZFR5cGUgPSB6b2RUeXBlLm51bGxhYmxlKCk7XG4gIH1cblxuICByZXR1cm4gem9kVHlwZTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZURlZihwcm9wOiBFbnRpdHlQcm9wLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGxldCBzdG10OiBzdHJpbmc7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouaW50KClgO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5iaWdpbnQoKWA7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH0uYXJyYXkoKWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgY29uc3QgYmFzZSA9IHpvZEZvcm1hdFRvQ29kZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0ubWF4KCR7cHJvcC5sZW5ndGh9KWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdBcnJheVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSkuYXJyYXkoKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5hcnJheSgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgLy8g64K07J6lIO2DgOyeheyduCDqsr3smrAg7Iqk7YKk66eIIOydtOumhOycvOuhnCDrs4DtmZhcbiAgICBpZiAoKEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhwcm9wLmlkKSkge1xuICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IHByb3AuaWQgPT09IFwiU29uYW11RmlsZVwiID8gXCJTb25hbXVGaWxlU2NoZW1hXCIgOiBcIlNvbmFtdUZpbGVBcnJheVNjaGVtYVwiO1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7c2NoZW1hTmFtZX1gO1xuICAgICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHNjaGVtYU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU2VhcmNoVGV4dFByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYXJyYXkoei5udW1iZXIoKSlgO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSlgO1xuICB9IGVsc2UgaWYgKGlzVHNWZWN0b3JQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIC8vIEZLIFpvZCDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfV9pZDogei5zdHJpbmcoKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfV9pZDogei5pbnQoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOq3uOyZuCByZWxhdGlvbiDsvIDsnbTsiqQg7KCc7Jm4XG4gICAgICByZXR1cm4gYC8vICR7cHJvcC5uYW1lfTogJHtwcm9wLnJlbGF0aW9uVHlwZX0gJHtwcm9wLndpdGh9YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiLy8gdW5hYmxlIHRvIHJlc29sdmVcIjtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHN0bXQgKz0gXCIubm9ubmVnYXRpdmUoKVwiO1xuICB9XG4gIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgc3RtdCArPSBcIi5udWxsYWJsZSgpXCI7XG4gIH1cblxuICAvLyBudW1lcmljIO2DgOyeheydmCDqsr3smrAgbnVsbGFibGUg7J207ZuE7JeQIG1ldGEg7LaU6rCAICjrqZTtg4DrjbDsnbTthLDqsIAg7LWc7IOB7JyEIOugiOuyqOyXkCDsnojslrTslbwg7ZWoKVxuICBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSB8fCBpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ICs9ICcubWV0YSh7IFNvbmFtdVByb3BUeXBlOiBcIm51bWVyaWNcIiB9KSc7XG4gIH1cblxuICByZXR1cm4gYCR7c3RtdH0sYDtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9wTm9kZeulvCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHBsYWluLCBhcnJheSwgb2JqZWN0IOuFuOuTnCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIOyymOumrO2VmOyXrCDspJHssqkg6rWs7KGw66W8IOyngOybkO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwicGxhaW5cIikge1xuICAgIHJldHVybiBwcm9wVG9ab2RUeXBlRGVmKHByb3BOb2RlLnByb3AsIGluamVjdEltcG9ydEtleXMpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6LmFycmF5KHoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBcIn0pKSxcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgYH0pJHtwcm9wTm9kZS5wcm9wPy5udWxsYWJsZSA/IFwiLm51bGxhYmxlKClcIiA6IFwiXCJ9LGAsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9Uc1R5cGVEZWYoenQ6IHouWm9kVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgIGNhc2UgXCJhbnlcIjpcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIHp0LmRlZi50eXBlO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJEYXRlXCI7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZi5pbm5lclR5cGUpO1xuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgcmVjb3JkVHlwZSA9IHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsKS52YWx1ZXMpXG4gICAgICAgIC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgQW55Wm9kVW5pb24pLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kQXJyYXkpLmVsZW1lbnQpfVtdYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIntcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHNoYXBlW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldLmRlZi5pbm5lclR5cGUpfSxgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XSl9LGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kT3B0aW9uYWwpLmRlZi5pbm5lclR5cGUpfSB8IHVuZGVmaW5lZGA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGVUb1RzVHlwZURlZihwYXJ0IGFzIHouWm9kVHlwZSk7XG4gICAgICAgICAgcmV0dXJuIGAkXFx7JHtpbm5lclR5cGV9fWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIGBcXCR7c3RyaW5nfWA7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGBcXGAke3BhcnRzLmpvaW4oXCJcIil9XFxgYDtcbiAgICB9XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBcIkZpbGVcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9ab2RDb2RlKHp0OiB6LlpvZFR5cGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCBidWlsdEluU2NoZW1hTmFtZSA9IGdldEJ1aWx0SW5TY2hlbWFOYW1lKHp0KTtcbiAgaWYgKGJ1aWx0SW5TY2hlbWFOYW1lKSB7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKGJ1aWx0SW5TY2hlbWFOYW1lKTtcbiAgICByZXR1cm4gYnVpbHRJblNjaGVtYU5hbWU7XG4gIH1cblxuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcInoubnVtYmVyKClcIjtcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gXCJ6LmJpZ2ludCgpXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcInouYm9vbGVhbigpXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInouZGF0ZSgpXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcInoubnVsbCgpXCI7XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgcmV0dXJuIFwiei51bmRlZmluZWQoKVwiO1xuICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgIHJldHVybiBcInouYW55KClcIjtcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgICAgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiBcInoubmV2ZXIoKVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPSAoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID0gKHp0IGFzIEFueVpvZFJlY29yZCkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+KS52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFskeyh6dCBhcyBBbnlab2RVbmlvbikuZGVmLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCIsXCIpfV0pYDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgLy8gTk9URTogei5lbnVtKFtcIkFcIiwgXCJCXCJdKeuPhCB6LmVudW0oeyBBOiBcIkFcIiwgQjogXCJCXCIgfSnroZwg7LKY66as65CoLlxuICAgICAgcmV0dXJuIGB6LmVudW0oeyR7T2JqZWN0LmVudHJpZXMoKHp0IGFzIHouWm9kRW51bSkuZGVmLmVudHJpZXMpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbF0pID0+ICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX19KWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYHouYXJyYXkoJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcChcbiAgICAgICAgICAoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUoc2hhcGVba2V5XSwgaW5qZWN0SW1wb3J0S2V5cyl9LGAsXG4gICAgICAgICksXG4gICAgICAgIFwifSlcIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ub3B0aW9uYWwoKWA7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9ICh6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWwpLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWxcbiAgICAgIGlmICghZGVmLnBhcnRzIHx8IGRlZi5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwiei50ZW1wbGF0ZUxpdGVyYWwoW10pXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIOqwgSBwYXJ066W8IFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0OiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIOusuOyekOyXtCDrpqzthLDrn7RcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7cGFydH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgKHBhcnQgYXMgei5ab2RUeXBlKS5fem9kKSB7XG4gICAgICAgICAgcmV0dXJuIHpvZFR5cGVUb1pvZENvZGUocGFydCBhcyB6LlpvZFR5cGUsIGluamVjdEltcG9ydEtleXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYHoudGVtcGxhdGVMaXRlcmFsKFske3BhcnRzLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjoge1xuICAgICAgY29uc3QgekludGVyc2VjdGlvbkRlZiA9ICh6dCBhcyB6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGUsIHouWm9kVHlwZT4pLmRlZjtcbiAgICAgIHJldHVybiBgei5pbnRlcnNlY3Rpb24oJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6SW50ZXJzZWN0aW9uRGVmLmxlZnQsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlQW55LFxuICBiYXNlS2V5OiBzdHJpbmcgPSBcInJvb3RcIixcbik6IFJlbmRlcmluZ05vZGUge1xuICBjb25zdCBkZWYgPSB7XG4gICAgbmFtZTogYmFzZUtleSxcbiAgICBsYWJlbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShiYXNlS2V5LCBmYWxzZSksXG4gICAgem9kVHlwZSxcbiAgfTtcblxuICAvKipcbiAgICog7LyA7J207IqkIOyymOumrCDsiJzshJxcbiAgICpcbiAgICogMS4g7Yq57IiYIOy8gOydtOyKpCAoZGVzY3JpcHRpb24g6riw67CYKVxuICAgKiAgICAtIFNvbmFtdUZpbGUvU29uYW11RmlsZVtdIDogei5vYmplY3Qvei5hcnJheeydtOyngOunjCDtjIzsnbwg7JeF66Gc65Oc7JqpIOuCtOyepSDtg4DsnoVcbiAgICpcbiAgICogMi4g7J2867CYIOy8gOydtOyKpCAoaW5zdGFuY2VvZiDquLDrsJgpXG4gICAqICAgIC0gei5ab2RPYmplY3QgOiDsnbzrsJgg6rCd7LK0XG4gICAqICAgIC0gei5ab2RBcnJheSA6IOydvOuwmCDrsLDsl7RcbiAgICogICAgICAtIHZlY3RvciA6IHouYXJyYXkoei5udW1iZXIp7J207KeA66eMIOuEpOydtOuwjSDquLDrsJjsnLzroZwg67Kh7YSwIOyehOuyoOuUqVxuICAgKiAgICAgIC0g7J2867CYIOuwsOyXtCA6IOq3uCDsmbhcbiAgICogICAgLSB6LlpvZFVuaW9uLCB6LlpvZE9wdGlvbmFsLCB6LlpvZE51bGxhYmxlIDog7Jyg7Yu466as7YuwIO2DgOyehVxuICAgKiAgICAtIOq4sO2DgCA6IHJlc29sdmVSZW5kZXJUeXBlKCnsnLzroZwg7LKY66asXG4gICAqL1xuXG4gIC8vIO2KueyImCDsvIDsnbTsiqQ6IFNvbmFtdUZpbGVbXSDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgcmV0dXJuIHsgLi4uZGVmLCByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiIH07XG4gIH1cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlIOuLqOydvCDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVcIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGVcIiB9O1xuICB9XG5cbiAgLy8g7J2867CYIOy8gOydtOyKpDogWm9kT2JqZWN0IOyytO2BrFxuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgY29uc3QgY29sdW1uS2V5cyA9IE9iamVjdC5rZXlzKHpvZFR5cGUuc2hhcGUpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY29sdW1uS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZS5zaGFwZVtrZXldO1xuICAgICAgcmV0dXJuIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBrZXkpO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcIm9iamVjdFwiLFxuICAgICAgY2hpbGRyZW4sXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBcnJheSkge1xuICAgIGNvbnN0IGlubmVyVHlwZSA9ICh6b2RUeXBlIGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlQW55PikuZGVmLmVsZW1lbnQ7XG4gICAgLy8gdmVjdG9yIO2DgOyehSDtjJDrs4Q6IG51bWJlciDrsLDsl7TsnbTrqbTshJwgZW1iZWRkaW5nLCB2ZWN0b3Ig65Ox7J2YIOydtOumhOydhCDqsIDsp4Qg6rK97JqwXG4gICAgaWYgKFxuICAgICAgaW5uZXJUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIgJiZcbiAgICAgIChiYXNlS2V5LmluY2x1ZGVzKFwiZW1iZWRkaW5nXCIpIHx8IGJhc2VLZXkuaW5jbHVkZXMoXCJ2ZWN0b3JcIikpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwidmVjdG9yXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoKG9wdCkgPT5cbiAgICAgIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUob3B0LCBiYXNlS2V5KSxcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKGtleTogc3RyaW5nLCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkpOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5jb3JlLiRab2RTdHJpbmcpIHtcbiAgICAvLyBOT1RFOiB6LlpvZFN0cmluZ+ycvOuhnCDruYTqtZDtlZjrqbQgei51cmwoKSwgei5lbWFpbCgpIOuTseydmCDtg4DsnoXsl5DshJwg66y47KCc6rCAIOyDneq4sOuvgOuhnCB6LmNvcmUuJFpvZFN0cmluZ+ycvOuhnCDruYTqtZDtlahcbiAgICAvLyBGSVhNRTogZW1haWzsnbTrgpggdXJsIO2DgOyehSDrk7Hsl5Ag64yA7ZWcIOyymOumrOqwgCDtlYTsmpTtlahcbiAgICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTUUxEYXRlVGltZVN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZXRpbWVcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcImRhdGVcIikpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRlXCI7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWlkXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJfaWRcIikpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1ma19pZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVGVtcGxhdGVMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZS5kZWYudHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIHJldHVybiBcIm9iamVjdFwiO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YOA7J6FIO2MjOyLsSDrtojqsIAgJHtrZXl9ICR7em9kVHlwZS5kZWYudHlwZX1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4RkEsU0FBUyxxQkFBcUIsU0FBd0M7Q0FDcEUsTUFBTSxVQUFVLE9BQU8sUUFBUSxlQUFlLENBQUMsTUFBTSxDQUFDLFlBQVksUUFBUSxnQkFBZ0IsT0FBTztBQUNqRyxRQUFPLFVBQVUsR0FBRzs7Ozs7O0FBT3RCLFNBQVMsZ0JBQWdCLFFBQWlDO0NBRXhELE1BQU1BLGFBQXFDO0VBQ3pDLFNBQVM7RUFDVCxTQUFTO0VBQ1QsYUFBYTtFQUNiLGFBQWE7RUFDZDtDQUdELE1BQU1DLGNBQXND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
|
|
458
|
+
|
|
459
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbInoiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvem9kLWNvbnZlcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHpvZC1jb252ZXJ0ZXIg6rWs7ISxXG4gKiAxLiDsnKDti7jrpqzti7BcbiAqICAtIGdldFpvZFR5cGVCeUlkXG4gKlxuICogMi4gWm9kIO2DgOyehSDrs4DtmZggKEVudGl0eVByb3AgLT4gWm9kVHlwZSlcbiAqICAtIHByb3BUb1pvZFR5cGVcbiAqXG4gKiAzLiBFbnRpdHlQcm9wL05vZGUgLT4gWm9kIOy9lOuTnCDrrLjsnpDsl7RcbiAqICAtIHByb3BUb1pvZFR5cGVEZWZcbiAqICAtIHByb3BOb2RlVG9ab2RUeXBlRGVmXG4gKlxuICogNC4gWm9kIO2DgOyehSDsnbjsiqTthLTsiqTrpbwg7ZW064u57ZWY64qUIFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBab2RDb2RlKVxuICogIC0gem9kVHlwZVRvWm9kQ29kZVxuICpcbiAqIDUuIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmYIChab2RUeXBlIC0+IFJlbmRlcmluZ05vZGUpXG4gKiAgLSB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlXG4gKiAgLSByZXNvbHZlUmVuZGVyVHlwZVxuICovXG5cbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEJVSUxUX0lOX1RZUEVfSURTLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNCaWdJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0JpZ0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0Jvb2xlYW5BcnJheVByb3AsXG4gIGlzQm9vbGVhblNpbmdsZVByb3AsXG4gIGlzRGF0ZUFycmF5UHJvcCxcbiAgaXNEYXRlU2luZ2xlUHJvcCxcbiAgaXNFbnVtQXJyYXlQcm9wLFxuICBpc0VudW1TaW5nbGVQcm9wLFxuICBpc0ludGVnZXJBcnJheVByb3AsXG4gIGlzSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzSnNvblByb3AsXG4gIGlzTnVtYmVyQXJyYXlQcm9wLFxuICBpc051bWJlclNpbmdsZVByb3AsXG4gIGlzTnVtZXJpY0FycmF5UHJvcCxcbiAgaXNOdW1lcmljU2luZ2xlUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzU2VhcmNoVGV4dFByb3AsXG4gIGlzU3RyaW5nQXJyYXlQcm9wLFxuICBpc1N0cmluZ1NpbmdsZVByb3AsXG4gIGlzVHNWZWN0b3JQcm9wLFxuICBpc1V1aWRBcnJheVByb3AsXG4gIGlzVXVpZFNpbmdsZVByb3AsXG4gIGlzVmVjdG9yQXJyYXlQcm9wLFxuICBpc1ZlY3RvclNpbmdsZVByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgU29uYW11RmlsZVNjaGVtYSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIHR5cGUgUmVuZGVyaW5nTm9kZSxcbiAgdHlwZSBab2RTdHJpbmdGb3JtYXQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgcnVudGltZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsO1xuXG4vKipcbiAqIOuCtOyepSDtg4DsnoUg7KCV7J2YIChab2Qg7Iqk7YKk66eIICsgVUkg66CM642U66eBIO2DgOyehSlcbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVTID0ge1xuICBTb25hbXVGaWxlOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlU2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlU2NoZW1hXCIsXG4gIH0sXG4gIFwiU29uYW11RmlsZVtdXCI6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCIsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluU2NoZW1hTmFtZSh6b2RUeXBlOiB6LlpvZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmVudHJpZXMoQlVJTFRfSU5fVFlQRVMpLmZpbmQoKFt0eXBlSWRdKSA9PiB6b2RUeXBlLmRlc2NyaXB0aW9uID09PSB0eXBlSWQpO1xuICByZXR1cm4gbWF0Y2hlZD8uWzFdLnNjaGVtYU5hbWU7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICAvLyBJU08g7Y+s66e37J2AIHouaXNvLnh4eCgpIO2Yle2DnFxuICBjb25zdCBpc29Gb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGlzb0RhdGU6IFwiei5pc28uZGF0ZSgpXCIsXG4gICAgaXNvVGltZTogXCJ6Lmlzby50aW1lKClcIixcbiAgICBpc29EYXRldGltZTogXCJ6Lmlzby5kYXRldGltZSgpXCIsXG4gICAgaXNvRHVyYXRpb246IFwiei5pc28uZHVyYXRpb24oKVwiLFxuICB9O1xuXG4gIC8vIGhhc2gg7Y+s66e37J2AIHouaGFzaChcImFsZ29yaXRobVwiKSDtmJXtg5xcbiAgY29uc3QgaGFzaEZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaGFzaE1kNTogJ3ouaGFzaChcIm1kNVwiKScsXG4gICAgaGFzaFNoYTE6ICd6Lmhhc2goXCJzaGExXCIpJyxcbiAgICBoYXNoU2hhMjU2OiAnei5oYXNoKFwic2hhMjU2XCIpJyxcbiAgICBoYXNoU2hhMzg0OiAnei5oYXNoKFwic2hhMzg0XCIpJyxcbiAgICBoYXNoU2hhNTEyOiAnei5oYXNoKFwic2hhNTEyXCIpJyxcbiAgfTtcblxuICBpZiAoZm9ybWF0IGluIGlzb0Zvcm1hdHMpIHtcbiAgICByZXR1cm4gaXNvRm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgaWYgKGZvcm1hdCBpbiBoYXNoRm9ybWF0cykge1xuICAgIHJldHVybiBoYXNoRm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgLy8g6riw67O4IO2PrOunt+ydgCB6Lnh4eCgpIO2Yle2DnCAoWm9kIDQpXG4gIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBab2QgNOyXkOyEnOuKlCB6LmVtYWlsKCksIHoudXVpZCgpIOuTsSDrj4Xrpr3soIHsnbgg7ZWo7IiYIO2Yle2DnOulvCDsgqzsmqntlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHpvZEZvcm1hdFRvVHlwZShmb3JtYXQ6IFpvZFN0cmluZ0Zvcm1hdCk6IHouWm9kVHlwZSB7XG4gIC8vIElTTyDtj6zrp7fsnYAgei5pc28ueHh4KCkg7ZiV7YOcXG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIC8vIGhhc2gg7Y+s66e37J2AIHouaGFzaChcImFsZ29yaXRobVwiKSDtmJXtg5xcbiAgICBjYXNlIFwiaGFzaE1kNVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcIm1kNVwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGExXCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMjU2XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMjU2XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMzg0XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMzg0XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhNTEyXCIpO1xuICAgIC8vIOq4sOuzuCDtj6zrp7fsnYAgei54eHgoKSDtmJXtg5wgKFpvZCA0KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHogYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCAoKSA9PiB6LlpvZFR5cGU+KVtmb3JtYXRdKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoKEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh6b2RUeXBlSWQpKSB7XG4gICAgY29uc3QgYnVpbHRJblR5cGUgPSBCVUlMVF9JTl9UWVBFU1t6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXTtcbiAgICBpZiAoIWJ1aWx0SW5UeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOuCtOyepSDtg4DsnoUgJHt6b2RUeXBlSWR97J2YIOyKpO2CpOuniOqwgCDsoJXsnZjrkJjsp4Ag7JWK7JWY7Iq164uI64ukYCk7XG4gICAgfVxuICAgIHJldHVybiBidWlsdEluVHlwZS5zY2hlbWEuZGVzY3JpYmUoem9kVHlwZUlkKTtcbiAgfVxuXG4gIC8vIO2UhOuhnOygne2KuOyXkOyEnCDsoJXsnZjtlZwg7YOA7J6FIOuPmeyggSDroZzrk5xcbiAgY29uc3QgbW9kdWxlUGF0aCA9IEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aCh6b2RUeXBlSWQpO1xuICBjb25zdCBtb2R1bGVBYnNQYXRoID0gcGF0aC5qb2luKFxuICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke21vZHVsZVBhdGh9LmpzYCksXG4gICk7XG4gIGNvbnN0IGltcG9ydFVybCA9IGNyZWF0ZUltcG9ydFVybChtb2R1bGVBYnNQYXRoKTtcbiAgY29uc3QgaW1wb3J0ZWQgPSBhd2FpdCBpbXBvcnQoaW1wb3J0VXJsKTtcblxuICBpZiAoIWltcG9ydGVkW3pvZFR5cGVJZF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgem9kVHlwZUlkICR7em9kVHlwZUlkfWApO1xuICB9XG4gIHJldHVybiBpbXBvcnRlZFt6b2RUeXBlSWRdLmRlc2NyaWJlKHpvZFR5cGVJZCk7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gKGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgem9kVHlwZSA9IHpvZEZvcm1hdFRvVHlwZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGggJiYgXCJtYXhcIiBpbiB6b2RUeXBlKSB7XG4gICAgICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZFN0cmluZykubWF4KHByb3AubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdBcnJheVByb3AocHJvcCkpIHtcbiAgICBsZXQgZWxlbWVudFR5cGU6IHouWm9kVHlwZTtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIGVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGVsZW1lbnRUeXBlID0gKGVsZW1lbnRUeXBlIGFzIHouWm9kU3RyaW5nKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50VHlwZSA9IHouc3RyaW5nKCk7XG4gICAgfVxuICAgIHpvZFR5cGUgPSBlbGVtZW50VHlwZS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU2VhcmNoVGV4dFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5hcnJheSh6Lm51bWJlcigpKTtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHouYXJyYXkoei5udW1iZXIoKSkpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksg7YOA7J6F7J2EIOywuOyhsCDsl5Tti7Dti7AgUEsg7YOA7J6F7JeQIOuUsOudvCDqsrDsoJVcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICBjb25zdCBwa1R5cGUgPSByZWxFbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgICBpZiAocGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwcm9w7J2EIHpvZFR5cGXsnLzroZwg67OA7ZmY7ZWY64qU642wIOyLpO2MqCAke3Byb3B9fWApO1xuICB9XG5cbiAgaWYgKChwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH0pLnVuc2lnbmVkKSB7XG4gICAgem9kVHlwZSA9ICh6b2RUeXBlIGFzIHouWm9kTnVtYmVyKS5ub25uZWdhdGl2ZSgpO1xuICB9XG4gIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgem9kVHlwZSA9IHpvZFR5cGUubnVsbGFibGUoKTtcbiAgfVxuXG4gIHJldHVybiB6b2RUeXBlO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3DsnYQgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlRGVmKHByb3A6IEVudGl0eVByb3AsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgbGV0IHN0bXQ6IHN0cmluZztcbiAgaWYgKGlzSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKWA7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouaW50KCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5iaWdpbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfS5hcnJheSgpYDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgY29uc3QgYmFzZSA9IHpvZEZvcm1hdFRvQ29kZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0ubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9LmFycmF5KClgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSkuYXJyYXkoKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICAvLyDrgrTsnqUg7YOA7J6F7J24IOqyveyasCDsiqTtgqTrp4gg7J2066aE7Jy866GcIOuzgO2ZmFxuICAgIGlmICgoQlVJTFRfSU5fVFlQRV9JRFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHByb3AuaWQpKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKChwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH0pLnVuc2lnbmVkKSB7XG4gICAgc3RtdCArPSBcIi5ub25uZWdhdGl2ZSgpXCI7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICBzdG10ICs9IFwiLm51bGxhYmxlKClcIjtcbiAgfVxuXG4gIC8vIG51bWVyaWMg7YOA7J6F7J2YIOqyveyasCBudWxsYWJsZSDsnbTtm4Tsl5AgbWV0YSDstpTqsIAgKOuplO2DgOuNsOydtO2EsOqwgCDstZzsg4HsnIQg66CI67Ko7JeQIOyeiOyWtOyVvCDtlagpXG4gIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApIHx8IGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgKz0gJy5tZXRhKHsgU29uYW11UHJvcFR5cGU6IFwibnVtZXJpY1wiIH0pJztcbiAgfVxuXG4gIHJldHVybiBgJHtzdG10fSxgO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3BOb2Rl66W8IFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogcGxhaW4sIGFycmF5LCBvYmplY3Qg64W465OcIO2DgOyeheydhCDsnqzqt4DsoIHsnLzroZwg7LKY66as7ZWY7JesIOykkeyyqSDqtazsobDrpbwg7KeA7JuQ7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGU6IEVudGl0eVByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJwbGFpblwiKSB7XG4gICAgcmV0dXJuIHByb3BUb1pvZFR5cGVEZWYocHJvcE5vZGUucHJvcCwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInouYXJyYXkoei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIFwifSkpLFwiLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBgfSkke3Byb3BOb2RlLnByb3A/Lm51bGxhYmxlID8gXCIubnVsbGFibGUoKVwiIDogXCJcIn0sYCxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1RzVHlwZURlZih6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgY2FzZSBcImFueVwiOlxuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4genQuZGVmLnR5cGU7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcIkRhdGVcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKX0gfCBudWxsYDtcbiAgICBjYXNlIFwiZGVmYXVsdFwiOlxuICAgICAgcmV0dXJuIHpvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmLmlubmVyVHlwZSk7XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCByZWNvcmRUeXBlID0genQgYXMgQW55Wm9kUmVjb3JkO1xuICAgICAgcmV0dXJuIGB7IFsga2V5OiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi5rZXlUeXBlKX0gXTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYudmFsdWVUeXBlKX19YDtcbiAgICB9XG4gICAgY2FzZSBcImxpdGVyYWxcIjpcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKCh6dCBhcyB6LlpvZExpdGVyYWwpLnZhbHVlcylcbiAgICAgICAgLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYG51bGxgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYHVuZGVmaW5lZGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiIHwgXCIpO1xuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyBBbnlab2RVbmlvbikub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb24pID0+IHpvZFR5cGVUb1RzVHlwZURlZihvcHRpb24pKVxuICAgICAgICAuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIHouWm9kRW51bSkub3B0aW9ucy5tYXAoKHZhbCkgPT4gYFwiJHt2YWx9XCJgKS5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2RBcnJheSkuZWxlbWVudCl9W11gO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwie1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoc2hhcGVba2V5XS5kZWYudHlwZSA9PT0gXCJvcHRpb25hbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fT86ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0uZGVmLmlubmVyVHlwZSl9LGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2RPcHRpb25hbCkuZGVmLmlubmVyVHlwZSl9IHwgdW5kZWZpbmVkYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAoenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFs7J2AIHN0cmluZ+ycvOuhnCDtj7TrsLFcbiAgICAgIGlmICghZGVmLnBhcnRzIHx8IGRlZi5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIOqwgSBwYXJ066W8IFR5cGVTY3JpcHQg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydDogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyDrpqzthLDrn7Qg6rCSIChzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgbnVsbCwgdW5kZWZpbmVkKVxuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cGFydH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgKHBhcnQgYXMgei5ab2RUeXBlKS5fem9kKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVRvVHNUeXBlRGVmKHBhcnQgYXMgei5ab2RUeXBlKTtcbiAgICAgICAgICByZXR1cm4gYCRcXHske2lubmVyVHlwZX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gYFxcJHtzdHJpbmd9YDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYFxcYCR7cGFydHMuam9pbihcIlwiKX1cXGBgO1xuICAgIH1cbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIFwiRmlsZVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyehSDsnbjsiqTthLTsiqTrpbwg7ZW064u57ZWY64qUIFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1pvZENvZGUoenQ6IHouWm9kVHlwZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJ1aWx0SW5TY2hlbWFOYW1lID0gZ2V0QnVpbHRJblNjaGVtYU5hbWUoenQpO1xuICBpZiAoYnVpbHRJblNjaGVtYU5hbWUpIHtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goYnVpbHRJblNjaGVtYU5hbWUpO1xuICAgIHJldHVybiBidWlsdEluU2NoZW1hTmFtZTtcbiAgfVxuXG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwiei5udW1iZXIoKVwiO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBcInouYmlnaW50KClcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiei5kYXRlKClcIjtcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgcmV0dXJuIFwiei5udWxsKClcIjtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ6LnVuZGVmaW5lZCgpXCI7XG4gICAgY2FzZSBcImFueVwiOlxuICAgICAgcmV0dXJuIFwiei5hbnkoKVwiO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIFwiei5uZXZlcigpXCI7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgQW55Wm9kTnVsbGFibGUpLmRlZi5pbm5lclR5cGUsIGluamVjdEltcG9ydEtleXMpfS5udWxsYWJsZSgpYDtcbiAgICBjYXNlIFwiZGVmYXVsdFwiOiB7XG4gICAgICBjb25zdCB6RGVmYXVsdERlZiA9ICh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWY7XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSh6RGVmYXVsdERlZi5pbm5lclR5cGUsIGluamVjdEltcG9ydEtleXMpfS5kZWZhdWx0KCR7ekRlZmF1bHREZWYuZGVmYXVsdFZhbHVlfSlgO1xuICAgIH1cbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHpSZWNvcmREZWYgPSAoenQgYXMgQW55Wm9kUmVjb3JkKS5kZWY7XG4gICAgICByZXR1cm4gYHoucmVjb3JkKCR7em9kVHlwZVRvWm9kQ29kZSh6UmVjb3JkRGVmLmtleVR5cGUsIGluamVjdEltcG9ydEtleXMpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6UmVjb3JkRGVmLnZhbHVlVHlwZSxcbiAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICl9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsPHN0cmluZyB8IG51bWJlcj4pLnZhbHVlcykubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYHoubGl0ZXJhbCgke2l0ZW1zWzBdfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoWyR7aXRlbXMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYHoudW5pb24oWyR7KHp0IGFzIEFueVpvZFVuaW9uKS5kZWYub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb246IHouWm9kVHlwZSkgPT4gem9kVHlwZVRvWm9kQ29kZShvcHRpb24sIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIixcIil9XSlgO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAvLyBOT1RFOiB6LmVudW0oW1wiQVwiLCBcIkJcIl0p64+EIHouZW51bSh7IEE6IFwiQVwiLCBCOiBcIkJcIiB9KeuhnCDsspjrpqzrkKguXG4gICAgICByZXR1cm4gYHouZW51bSh7JHtPYmplY3QuZW50cmllcygoenQgYXMgei5ab2RFbnVtKS5kZWYuZW50cmllcylcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT4gKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgPyBgJHtrZXl9OiBcIiR7dmFsfVwiYCA6IGAke2tleX06ICR7dmFsfWApKVxuICAgICAgICAuam9pbihcIiwgXCIpfX0pYDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgei5hcnJheSgke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlPikuZGVmLmVsZW1lbnQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKFxuICAgICAgICAgIChrZXkpID0+IGAke2tleX06ICR7em9kVHlwZVRvWm9kQ29kZShzaGFwZVtrZXldLCBpbmplY3RJbXBvcnRLZXlzKX0sYCxcbiAgICAgICAgKSxcbiAgICAgICAgXCJ9KVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGluamVjdEltcG9ydEtleXMpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbFxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJ6LnRlbXBsYXRlTGl0ZXJhbChbXSlcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHtwYXJ0fVwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyBab2RUeXBlIC0g7J6s6reA7KCB7Jy866GcIOuzgO2ZmFxuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiAocGFydCBhcyB6LlpvZFR5cGUpLl96b2QpIHtcbiAgICAgICAgICByZXR1cm4gem9kVHlwZVRvWm9kQ29kZShwYXJ0IGFzIHouWm9kVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgei50ZW1wbGF0ZUxpdGVyYWwoWyR7cGFydHMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICBjb25zdCB6SW50ZXJzZWN0aW9uRGVmID0gKHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPikuZGVmO1xuICAgICAgcmV0dXJuIGB6LmludGVyc2VjdGlvbigke3pvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgIHpJbnRlcnNlY3Rpb25EZWYubGVmdCxcbiAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICl9LCAke3pvZFR5cGVUb1pvZENvZGUoekludGVyc2VjdGlvbkRlZi5yaWdodCwgaW5qZWN0SW1wb3J0S2V5cyl9KWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDsnqzqt4DsoIHsnLzroZwg7KSR7LKp65CcIO2DgOyeheuTpOydhCDsspjrpqztlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKFxuICB6b2RUeXBlOiB6LlpvZFR5cGVBbnksXG4gIGJhc2VLZXk6IHN0cmluZyA9IFwicm9vdFwiLFxuKTogUmVuZGVyaW5nTm9kZSB7XG4gIGNvbnN0IGRlZiA9IHtcbiAgICBuYW1lOiBiYXNlS2V5LFxuICAgIGxhYmVsOiBpbmZsZWN0aW9uLmNhbWVsaXplKGJhc2VLZXksIGZhbHNlKSxcbiAgICB6b2RUeXBlLFxuICB9O1xuXG4gIC8qKlxuICAgKiDsvIDsnbTsiqQg7LKY66asIOyInOyEnFxuICAgKlxuICAgKiAxLiDtirnsiJgg7LyA7J207IqkIChkZXNjcmlwdGlvbiDquLDrsJgpXG4gICAqICAgIC0gU29uYW11RmlsZS9Tb25hbXVGaWxlW10gOiB6Lm9iamVjdC96LmFycmF57J207KeA66eMIO2MjOydvCDsl4XroZzrk5zsmqkg64K07J6lIO2DgOyehVxuICAgKlxuICAgKiAyLiDsnbzrsJgg7LyA7J207IqkIChpbnN0YW5jZW9mIOq4sOuwmClcbiAgICogICAgLSB6LlpvZE9iamVjdCA6IOydvOuwmCDqsJ3ssrRcbiAgICogICAgLSB6LlpvZEFycmF5IDog7J2867CYIOuwsOyXtFxuICAgKiAgICAgIC0gdmVjdG9yIDogei5hcnJheSh6Lm51bWJlcinsnbTsp4Drp4wg64Sk7J2067CNIOq4sOuwmOycvOuhnCDrsqHthLAg7J6E67Kg65SpXG4gICAqICAgICAgLSDsnbzrsJgg67Cw7Je0IDog6re4IOyZuFxuICAgKiAgICAtIHouWm9kVW5pb24sIHouWm9kT3B0aW9uYWwsIHouWm9kTnVsbGFibGUgOiDsnKDti7jrpqzti7Ag7YOA7J6FXG4gICAqICAgIC0g6riw7YOAIDogcmVzb2x2ZVJlbmRlclR5cGUoKeycvOuhnCDsspjrpqxcbiAgICovXG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZVtdIO2DgOyehSDqsJDsp4BcbiAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU29uYW11RmlsZVtdXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlLWFycmF5XCIgfTtcbiAgfVxuXG4gIC8vIO2KueyImCDsvIDsnbTsiqQ6IFNvbmFtdUZpbGUg64uo7J28IO2DgOyehSDqsJDsp4BcbiAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU29uYW11RmlsZVwiKSB7XG4gICAgcmV0dXJuIHsgLi4uZGVmLCByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZVwiIH07XG4gIH1cblxuICAvLyDsnbzrsJgg7LyA7J207IqkOiBab2RPYmplY3Qg7LK07YGsXG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGVBbnk+KS5kZWYuZWxlbWVudDtcbiAgICAvLyB2ZWN0b3Ig7YOA7J6FIO2MkOuzhDogbnVtYmVyIOuwsOyXtOydtOuptOyEnCBlbWJlZGRpbmcsIHZlY3RvciDrk7HsnZgg7J2066aE7J2EIOqwgOynhCDqsr3smrBcbiAgICBpZiAoXG4gICAgICBpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlciAmJlxuICAgICAgKGJhc2VLZXkuaW5jbHVkZXMoXCJlbWJlZGRpbmdcIikgfHwgYmFzZUtleS5pbmNsdWRlcyhcInZlY3RvclwiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgcmVuZGVyVHlwZTogXCJ2ZWN0b3JcIixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcImFycmF5XCIsXG4gICAgICBlbGVtZW50OiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIGNvbnN0IG9wdGlvbk5vZGVzID0gKHpvZFR5cGUgYXMgei5ab2RVbmlvbjx6LlpvZFR5cGVbXT4pLmRlZi5vcHRpb25zLm1hcCgob3B0KSA9PlxuICAgICAgem9kVHlwZVRvUmVuZGVyaW5nTm9kZShvcHQsIGJhc2VLZXkpLFxuICAgICk7XG4gICAgLy8gVE9ETzogWm9kVW5pb27snbQg65Ok7Ja07J6I64qUIOqyveyasCDtlbjrk6Trp4FcbiAgICByZXR1cm4gb3B0aW9uTm9kZXNbMF07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdWxsYWJsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi56b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCh6b2RUeXBlIGFzIHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiByZXNvbHZlUmVuZGVyVHlwZShiYXNlS2V5LCB6b2RUeXBlKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheqzvCDtgqQg7J2066aE7Jy866Gc67aA7YSwIOyggeygiO2VnCBSZW5kZXJUeXBl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlbmRlclR5cGUoa2V5OiBzdHJpbmcsIHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IFJlbmRlcmluZ05vZGVbXCJyZW5kZXJUeXBlXCJdIHtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERhdGUpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZVwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LmNvcmUuJFpvZFN0cmluZykge1xuICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIpIHtcbiAgICBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEJvb2xlYW4pIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgIHJldHVybiBcImVudW1zXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kUmVjb3JkKSB7XG4gICAgcmV0dXJuIFwicmVjb3JkXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQW55IHx8IHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZExpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUZW1wbGF0ZUxpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlLmRlZi50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEZBLFNBQVMscUJBQXFCLFNBQXdDO0NBRXBFLE9BRGdCLE9BQU8sUUFBUSxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxRQUFRLGdCQUFnQixNQUNuRixDQUFBLEdBQVUsRUFBRSxDQUFDO0FBQ3RCOzs7OztBQU1BLFNBQVMsZ0JBQWdCLFFBQWlDO0NBRXhELE1BQU0sYUFBcUM7RUFDekMsU0FBUztFQUNULFNBQVM7RUFDVCxhQUFhO0VBQ2IsYUFBYTtDQUNmO0NBR0EsTUFBTSxjQUFzQztFQUMxQyxTQUFTO0VBQ1QsVUFBVTtFQUNWLFlBQVk7RUFDWixZQUFZO0VBQ1osWUFBWTtDQUNkO0NBRUEsSUFBSSxVQUFVLFlBQ1osT0FBTyxXQUFXO0NBR3BCLElBQUksVUFBVSxhQUNaLE9BQU8sWUFBWTtDQUlyQixPQUFPLEtBQUssT0FB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
|