sonamu 0.7.1 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/ai/agents/types.d.ts +4 -3
  2. package/dist/ai/agents/types.d.ts.map +1 -1
  3. package/dist/ai/agents/types.js +1 -1
  4. package/dist/api/code-converters.js +2 -2
  5. package/dist/api/config.d.ts +4 -2
  6. package/dist/api/config.d.ts.map +1 -1
  7. package/dist/api/config.js +6 -3
  8. package/dist/api/decorators.d.ts.map +1 -1
  9. package/dist/api/decorators.js +3 -2
  10. package/dist/api/sonamu.d.ts.map +1 -1
  11. package/dist/api/sonamu.js +3 -4
  12. package/dist/bin/cli.js +13 -29
  13. package/dist/bin/{hot-hook-register.d.ts → hmr-hook-register.d.ts} +3 -3
  14. package/dist/bin/hmr-hook-register.d.ts.map +1 -0
  15. package/dist/bin/{hot-hook-register.js → hmr-hook-register.js} +5 -5
  16. package/dist/bin/ts-loader-register.d.ts +2 -0
  17. package/dist/bin/ts-loader-register.d.ts.map +1 -0
  18. package/dist/bin/ts-loader-register.js +34 -0
  19. package/dist/database/base-model.d.ts +2 -34
  20. package/dist/database/base-model.d.ts.map +1 -1
  21. package/dist/database/base-model.js +3 -170
  22. package/dist/database/base-model.types.d.ts +1 -0
  23. package/dist/database/base-model.types.d.ts.map +1 -1
  24. package/dist/database/base-model.types.js +2 -2
  25. package/dist/database/puri-wrapper.js +7 -3
  26. package/dist/database/upsert-builder.d.ts +7 -3
  27. package/dist/database/upsert-builder.d.ts.map +1 -1
  28. package/dist/database/upsert-builder.js +63 -25
  29. package/dist/entity/entity-manager.d.ts +1 -1
  30. package/dist/entity/entity.js +3 -3
  31. package/dist/migration/code-generation.d.ts.map +1 -1
  32. package/dist/migration/code-generation.js +8 -7
  33. package/dist/migration/migration-set.d.ts.map +1 -1
  34. package/dist/migration/migration-set.js +2 -25
  35. package/dist/migration/migrator.js +2 -2
  36. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  37. package/dist/migration/postgresql-schema-reader.js +2 -1
  38. package/dist/syncer/file-patterns.js +2 -2
  39. package/dist/syncer/syncer.js +3 -3
  40. package/dist/template/implementations/service.template.d.ts.map +1 -1
  41. package/dist/template/implementations/service.template.js +3 -2
  42. package/dist/template/zod-converter.js +4 -2
  43. package/dist/types/types.d.ts +6 -5
  44. package/dist/types/types.d.ts.map +1 -1
  45. package/dist/types/types.js +2 -2
  46. package/dist/utils/model.d.ts +9 -2
  47. package/dist/utils/model.d.ts.map +1 -1
  48. package/dist/utils/model.js +1 -1
  49. package/dist/utils/path-utils.d.ts +1 -1
  50. package/dist/utils/path-utils.d.ts.map +1 -1
  51. package/dist/utils/path-utils.js +1 -1
  52. package/package.json +12 -12
  53. package/src/ai/agents/types.ts +6 -3
  54. package/src/api/code-converters.ts +2 -2
  55. package/src/api/config.ts +17 -6
  56. package/src/api/decorators.ts +2 -1
  57. package/src/api/sonamu.ts +2 -5
  58. package/src/bin/cli.ts +13 -30
  59. package/src/bin/{hot-hook-register.ts → hmr-hook-register.ts} +4 -4
  60. package/src/bin/{loader-register.ts → ts-loader-register.ts} +2 -2
  61. package/src/database/base-model.ts +5 -236
  62. package/src/database/base-model.types.ts +2 -0
  63. package/src/database/puri-wrapper.ts +2 -2
  64. package/src/database/upsert-builder.ts +88 -29
  65. package/src/entity/entity.ts +2 -2
  66. package/src/migration/code-generation.ts +8 -6
  67. package/src/migration/migration-set.ts +0 -20
  68. package/src/migration/migrator.ts +1 -1
  69. package/src/migration/postgresql-schema-reader.ts +1 -0
  70. package/src/shared/web.shared.ts.txt +6 -4
  71. package/src/syncer/file-patterns.ts +1 -1
  72. package/src/syncer/syncer.ts +2 -2
  73. package/src/template/implementations/service.template.ts +2 -1
  74. package/src/template/zod-converter.ts +3 -1
  75. package/src/types/types.ts +3 -2
  76. package/src/utils/model.ts +10 -4
  77. package/src/utils/path-utils.ts +5 -2
  78. package/dist/bin/hot-hook-register.d.ts.map +0 -1
  79. package/dist/bin/loader-register.d.ts +0 -2
  80. package/dist/bin/loader-register.d.ts.map +0 -1
  81. package/dist/bin/loader-register.js +0 -34
@@ -0,0 +1,34 @@
1
+ import { register } from "node:module";
2
+ import * as path from "node:path";
3
+ import { exists } from "../utils/fs-utils.js";
4
+ import { findApiRootPath } from "../utils/utils.js";
5
+ /**
6
+ * @sonamu-kit/ts-loader/loader를 등록하는 스크립트입니다.
7
+ * 이 스크립트는 sonamu cli로 dev 실행할 때 --import로 실행됩니다.
8
+ */ async function setupSwcConfig() {
9
+ try {
10
+ const apiRoot = findApiRootPath();
11
+ // 프로젝트 루트에서 .swcrc 찾기
12
+ const projectSwcrcPath = path.join(apiRoot, ".swcrc");
13
+ if (await exists(projectSwcrcPath)) {
14
+ // 사용자 프로젝트에 .swcrc가 있으면 우선으로 사용합니다.
15
+ process.env.SWCRC_PATH = projectSwcrcPath;
16
+ return;
17
+ }
18
+ // 아니라면 sonamu가 관리하는 .swcrc.project-default를 가져다 씁니다.
19
+ const sonamuSwcrcPath = path.join(import.meta.dirname, "..", "..", ".swcrc.project-default");
20
+ if (await exists(sonamuSwcrcPath)) {
21
+ process.env.SWCRC_PATH = sonamuSwcrcPath;
22
+ return;
23
+ }
24
+ } catch {
25
+ // 환경 변수 설정 실패는 무시 (loader가 기본 설정 사용)
26
+ }
27
+ }
28
+ // swc 설정 파일 경로를 환경 변수로 설정
29
+ await setupSwcConfig();
30
+ register("@sonamu-kit/ts-loader/loader", {
31
+ parentURL: import.meta.url
32
+ });
33
+
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdHMtbG9hZGVyLXJlZ2lzdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlscy5qc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmpzXCI7XG5cbi8qKlxuICogQHNvbmFtdS1raXQvdHMtbG9hZGVyL2xvYWRlcuulvCDrk7HroZ3tlZjripQg7Iqk7YGs66a97Yq47J6F64uI64ukLlxuICog7J20IOyKpO2BrOumve2KuOuKlCBzb25hbXUgY2xp66GcIGRldiDsi6TtlontlaAg65WMIC0taW1wb3J066GcIOyLpO2WieuQqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0dXBTd2NDb25maWcoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXBpUm9vdCA9IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkOyEnCAuc3djcmMg7LC+6riwXG4gICAgY29uc3QgcHJvamVjdFN3Y3JjUGF0aCA9IHBhdGguam9pbihhcGlSb290LCBcIi5zd2NyY1wiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHByb2plY3RTd2NyY1BhdGgpKSB7XG4gICAgICAvLyDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47JeQIC5zd2NyY+qwgCDsnojsnLzrqbQg7Jqw7ISg7Jy866GcIOyCrOyaqe2VqeuLiOuLpC5cbiAgICAgIHByb2Nlc3MuZW52LlNXQ1JDX1BBVEggPSBwcm9qZWN0U3djcmNQYXRoO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyVhOuLiOudvOuptCBzb25hbXXqsIAg6rSA66as7ZWY64qUIC5zd2NyYy5wcm9qZWN0LWRlZmF1bHTrpbwg6rCA7KC464ukIOyUgeuLiOuLpC5cbiAgICBjb25zdCBzb25hbXVTd2NyY1BhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwiLnN3Y3JjLnByb2plY3QtZGVmYXVsdFwiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHNvbmFtdVN3Y3JjUGF0aCkpIHtcbiAgICAgIHByb2Nlc3MuZW52LlNXQ1JDX1BBVEggPSBzb25hbXVTd2NyY1BhdGg7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyDtmZjqsr0g67OA7IiYIOyEpOyglSDsi6TtjKjripQg66y07IucIChsb2FkZXLqsIAg6riw67O4IOyEpOyglSDsgqzsmqkpXG4gIH1cbn1cblxuLy8gc3djIOyEpOyglSDtjIzsnbwg6rK966Gc66W8IO2ZmOqyvSDrs4DsiJjroZwg7ISk7KCVXG5hd2FpdCBzZXR1cFN3Y0NvbmZpZygpO1xuXG5yZWdpc3RlcihcIkBzb25hbXUta2l0L3RzLWxvYWRlci9sb2FkZXJcIiwge1xuICBwYXJlbnRVUkw6IGltcG9ydC5tZXRhLnVybCxcbn0pO1xuIl0sIm5hbWVzIjpbInJlZ2lzdGVyIiwicGF0aCIsImV4aXN0cyIsImZpbmRBcGlSb290UGF0aCIsInNldHVwU3djQ29uZmlnIiwiYXBpUm9vdCIsInByb2plY3RTd2NyY1BhdGgiLCJqb2luIiwicHJvY2VzcyIsImVudiIsIlNXQ1JDX1BBVEgiLCJzb25hbXVTd2NyY1BhdGgiLCJkaXJuYW1lIiwicGFyZW50VVJMIiwidXJsIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLFFBQVEsY0FBYztBQUN2QyxZQUFZQyxVQUFVLFlBQVk7QUFDbEMsU0FBU0MsTUFBTSxRQUFRLHVCQUF1QjtBQUM5QyxTQUFTQyxlQUFlLFFBQVEsb0JBQW9CO0FBRXBEOzs7Q0FHQyxHQUNELGVBQWVDO0lBQ2IsSUFBSTtRQUNGLE1BQU1DLFVBQVVGO1FBRWhCLHNCQUFzQjtRQUN0QixNQUFNRyxtQkFBbUJMLEtBQUtNLElBQUksQ0FBQ0YsU0FBUztRQUM1QyxJQUFJLE1BQU1ILE9BQU9JLG1CQUFtQjtZQUNsQyxvQ0FBb0M7WUFDcENFLFFBQVFDLEdBQUcsQ0FBQ0MsVUFBVSxHQUFHSjtZQUN6QjtRQUNGO1FBRUEscURBQXFEO1FBQ3JELE1BQU1LLGtCQUFrQlYsS0FBS00sSUFBSSxDQUFDLFlBQVlLLE9BQU8sRUFBRSxNQUFNLE1BQU07UUFDbkUsSUFBSSxNQUFNVixPQUFPUyxrQkFBa0I7WUFDakNILFFBQVFDLEdBQUcsQ0FBQ0MsVUFBVSxHQUFHQztZQUN6QjtRQUNGO0lBQ0YsRUFBRSxPQUFNO0lBQ04scUNBQXFDO0lBQ3ZDO0FBQ0Y7QUFFQSwwQkFBMEI7QUFDMUIsTUFBTVA7QUFFTkosU0FBUyxnQ0FBZ0M7SUFDdkNhLFdBQVcsWUFBWUMsR0FBRztBQUM1QiJ9
@@ -1,12 +1,11 @@
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */
1
2
  import type { Knex } from "knex";
2
- import { type DatabaseSchemaExtend, type SubsetQuery } from "../types/types";
3
- import type { BaseListParams } from "../utils/model";
3
+ import type { DatabaseSchemaExtend } from "../types/types";
4
4
  import type { EnhancerMap, ExecuteSubsetQueryResult, ResolveSubsetIntersection, UnionExtractedTTables } from "./base-model.types";
5
5
  import type { DBPreset } from "./db";
6
6
  import { Puri } from "./puri";
7
7
  import type { InferAllSubsets, PuriLoaderQueries, PuriSubsetFn } from "./puri-subset.types";
8
8
  import { PuriWrapper } from "./puri-wrapper";
9
- import { UpsertBuilder } from "./upsert-builder";
10
9
  type UnknownDBRecord = Record<string, unknown>;
11
10
  /**
12
11
  * 모든 Model 클래스의 기본 클래스
@@ -85,37 +84,6 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
85
84
  * - nullable relation의 경우 모든 필드가 null이면 객체 자체를 null로
86
85
  */
87
86
  hydrate<T extends UnknownDBRecord>(rows: T[]): T[];
88
- runSubsetQuery<T extends BaseListParams, U extends string>({ params, baseTable, subset, subsetQuery, build, afterBuild, debug, db: _db, optimizeCountQuery, }: {
89
- subset: U;
90
- params: T;
91
- subsetQuery: SubsetQuery;
92
- build: (buildParams: {
93
- qb: Knex.QueryBuilder;
94
- db: Knex;
95
- select: (string | Knex.Raw)[];
96
- joins: SubsetQuery["joins"];
97
- virtual: string[];
98
- }) => Knex.QueryBuilder;
99
- afterBuild?: (buildParams: {
100
- qb: Knex.QueryBuilder;
101
- db: Knex;
102
- select: (string | Knex.Raw)[];
103
- joins: SubsetQuery["joins"];
104
- virtual: string[];
105
- }) => Knex.QueryBuilder;
106
- baseTable?: string;
107
- debug?: boolean | "list" | "count";
108
- db?: Knex;
109
- optimizeCountQuery?: boolean;
110
- }): Promise<{
111
- rows: any[];
112
- total?: number | undefined;
113
- subsetQuery: SubsetQuery;
114
- qb: Knex.QueryBuilder;
115
- }>;
116
- useLoaders(db: Knex, rows: UnknownDBRecord[], loaders: SubsetQuery["loaders"]): Promise<UnknownDBRecord[]>;
117
- getJoinClause(db: Knex<any, unknown>, join: SubsetQuery["joins"][number]): Knex.Raw<any>;
118
- getUpsertBuilder(): UpsertBuilder;
119
87
  }
120
88
  /**
121
89
  * Enhancer 파라미터 조건부 타입
@@ -1 +1 @@
1
- {"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,5 @@
1
- import assert from "assert";
2
- import inflection from "inflection";
3
- import { group, isObject, omit, set, unique } from "radashi";
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */ import { group, isObject, omit, set } from "radashi";
4
2
  import { Sonamu } from "../api/index.js";
5
- import { isCustomJoinClause } from "../types/types.js";
6
3
  import { getJoinTables, getTableNamesFromWhere } from "../utils/sql-parser.js";
7
4
  import { chunk } from "../utils/utils.js";
8
5
  import { DB } from "./db.js";
@@ -35,7 +32,7 @@ import { UpsertBuilder } from "./upsert-builder.js";
35
32
  }
36
33
  // 트랜잭션이 없으면 새로운 PuriWrapper 반환
37
34
  const db = this.getDB(which);
38
- return new PuriWrapper(db, this.getUpsertBuilder());
35
+ return new PuriWrapper(db, new UpsertBuilder());
39
36
  }
40
37
  async destroy() {
41
38
  return DB.destroy();
@@ -220,171 +217,7 @@ import { UpsertBuilder } from "./upsert-builder.js";
220
217
  return hydrated;
221
218
  });
222
219
  }
223
- // Legacy SubsetQuery 실행 (Puri 도입 전 호환용)
224
- async runSubsetQuery({ params, baseTable, subset, subsetQuery, build, afterBuild, debug, db: _db, optimizeCountQuery }) {
225
- const chalk = (await import("chalk")).default;
226
- const SqlParser = (await import("node-sql-parser")).default;
227
- const { getTableName, getTableNamesFromWhere } = await import("../utils/sql-parser.js");
228
- const db = _db ?? this.getDB(subset.startsWith("A") ? "w" : "r");
229
- baseTable = baseTable ?? inflection.pluralize(inflection.underscore(this.modelName));
230
- const queryMode = params.queryMode ?? (params.id !== undefined ? "list" : "both");
231
- const { select, virtual, joins, loaders } = subsetQuery;
232
- const qb = build({
233
- qb: db.from(baseTable),
234
- db,
235
- select,
236
- joins,
237
- virtual
238
- });
239
- const applyJoinClause = (qb, joins)=>{
240
- joins.forEach((join)=>{
241
- if (join.join === "inner") {
242
- qb.innerJoin(`${join.table} as ${join.as}`, this.getJoinClause(db, join));
243
- } else if (join.join === "outer") {
244
- qb.leftOuterJoin(`${join.table} as ${join.as}`, this.getJoinClause(db, join));
245
- }
246
- });
247
- };
248
- // countQuery
249
- const total = await (async ()=>{
250
- if (queryMode === "list") {
251
- return undefined;
252
- }
253
- const clonedQb = qb.clone().clear("order").clear("offset").clear("limit");
254
- const parser = new SqlParser.Parser();
255
- if (optimizeCountQuery) {
256
- const parsedQuery = parser.astify(clonedQb.toQuery(), {
257
- database: Sonamu.config.database.database
258
- });
259
- const tables = getTableNamesFromWhere(parsedQuery);
260
- const needToJoin = unique(tables.flatMap((table)=>table.split("__").map((t)=>inflection.pluralize(t))));
261
- applyJoinClause(clonedQb, joins.filter((j)=>needToJoin.includes(j.table)));
262
- } else {
263
- applyJoinClause(clonedQb, joins);
264
- }
265
- const processedQb = afterBuild?.({
266
- qb: clonedQb,
267
- db,
268
- select,
269
- joins,
270
- virtual
271
- }) ?? clonedQb;
272
- const parsedQuery = parser.astify(processedQb.toQuery(), {
273
- database: Sonamu.config.database.database
274
- });
275
- const q = Array.isArray(parsedQuery) ? parsedQuery[0] : parsedQuery;
276
- if (q.type !== "select") {
277
- throw new Error("Invalid query");
278
- }
279
- const countQuery = q.distinct !== null ? clonedQb.clear("select").select(db.raw(`COUNT(DISTINCT \`${getTableName(q.columns[0].expr)}\`.\`${q.columns[0].expr.column}\`) as total`)).first() : clonedQb.clear("select").count("*", {
280
- as: "total"
281
- }).first();
282
- const countRow = await countQuery;
283
- if (debug === true || debug === "count") {
284
- console.debug("DEBUG: count query", chalk.blue(countQuery.toQuery().toString()));
285
- }
286
- return countRow?.total ?? 0;
287
- })();
288
- // listQuery
289
- const rows = await (async ()=>{
290
- if (queryMode === "count") {
291
- return [];
292
- }
293
- if (params.num !== 0) {
294
- assert(params.num);
295
- qb.limit(params.num);
296
- qb.offset(params.num * ((params.page ?? 1) - 1));
297
- }
298
- const clonedQb = qb.clone().select(select);
299
- applyJoinClause(clonedQb, joins);
300
- const listQuery = afterBuild?.({
301
- qb: clonedQb,
302
- db,
303
- select,
304
- joins,
305
- virtual
306
- }) ?? clonedQb;
307
- let rows = await listQuery;
308
- if (debug === true || debug === "list") {
309
- console.debug("DEBUG: list query", chalk.blue(listQuery.toQuery().toString()));
310
- }
311
- rows = await this.useLoaders(db, rows, loaders);
312
- rows = this.hydrate(rows);
313
- return rows;
314
- })();
315
- return {
316
- rows,
317
- total,
318
- subsetQuery,
319
- qb
320
- };
321
- }
322
- // Legacy Loader 처리 (Puri 도입 전 호환용)
323
- async useLoaders(db, rows, loaders) {
324
- if (loaders.length === 0) {
325
- return rows;
326
- }
327
- for (const loader of loaders){
328
- let subQ;
329
- let subRows;
330
- let toCol;
331
- const fromIds = rows.map((row)=>row[loader.manyJoin.idField]);
332
- if (loader.manyJoin.through === undefined) {
333
- // HasMany
334
- const idColumn = `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`;
335
- subQ = db(loader.manyJoin.toTable).whereIn(idColumn, fromIds).select([
336
- ...loader.select,
337
- idColumn
338
- ]);
339
- loader.oneJoins.forEach((join)=>{
340
- if (join.join === "inner") {
341
- subQ.innerJoin(`${join.table} as ${join.as}`, this.getJoinClause(db, join));
342
- } else if (join.join === "outer") {
343
- subQ.leftOuterJoin(`${join.table} as ${join.as}`, this.getJoinClause(db, join));
344
- }
345
- });
346
- toCol = loader.manyJoin.toCol;
347
- } else {
348
- // ManyToMany
349
- const idColumn = `${loader.manyJoin.through.table}.${loader.manyJoin.through.fromCol}`;
350
- subQ = db(loader.manyJoin.through.table).join(loader.manyJoin.toTable, `${loader.manyJoin.through.table}.${loader.manyJoin.through.toCol}`, `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`).whereIn(idColumn, fromIds).select(unique([
351
- ...loader.select,
352
- idColumn
353
- ]));
354
- loader.oneJoins.forEach((join)=>{
355
- if (join.join === "inner") {
356
- subQ.innerJoin(`${join.table} as ${join.as}`, this.getJoinClause(db, join));
357
- } else if (join.join === "outer") {
358
- subQ.leftOuterJoin(`${join.table} as ${join.as}`, this.getJoinClause(db, join));
359
- }
360
- });
361
- toCol = loader.manyJoin.through.fromCol;
362
- }
363
- subRows = await subQ;
364
- if (loader.loaders) {
365
- subRows = await this.useLoaders(db, subRows, loader.loaders);
366
- }
367
- const subRowGroups = group(subRows, (row)=>row[toCol]);
368
- rows = rows.map((row)=>{
369
- row[loader.as] = (subRowGroups[row[loader.manyJoin.idField]] ?? []).map((r)=>omit(r, [
370
- toCol
371
- ]));
372
- return row;
373
- });
374
- }
375
- return rows;
376
- }
377
- getJoinClause(db, join) {
378
- if (!isCustomJoinClause(join)) {
379
- return db.raw(`${join.from} = ${join.to}`);
380
- } else {
381
- return db.raw(join.custom);
382
- }
383
- }
384
- getUpsertBuilder() {
385
- return new UpsertBuilder();
386
- }
387
220
  }
388
221
  export const BaseModel = new BaseModelClass();
389
222
 
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgaXNPYmplY3QsIG9taXQsIHNldCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIGlzQ3VzdG9tSm9pbkNsYXVzZSwgdHlwZSBTdWJzZXRRdWVyeSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBCYXNlTGlzdFBhcmFtcyB9IGZyb20gXCIuLi91dGlscy9tb2RlbFwiO1xuaW1wb3J0IHsgZ2V0Sm9pblRhYmxlcywgZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSB9IGZyb20gXCIuLi91dGlscy9zcWwtcGFyc2VyXCI7XG5pbXBvcnQgeyBjaHVuayB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbmhhbmNlck1hcCxcbiAgRXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0LFxuICBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uLFxuICBVbmlvbkV4dHJhY3RlZFRUYWJsZXMsXG59IGZyb20gXCIuL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgREJQcmVzZXQgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgUHVyaSB9IGZyb20gXCIuL3B1cmlcIjtcbmltcG9ydCB0eXBlIHsgSW5mZXJBbGxTdWJzZXRzLCBQdXJpTG9hZGVyUXVlcmllcywgUHVyaVN1YnNldEZuIH0gZnJvbSBcIi4vcHVyaS1zdWJzZXQudHlwZXNcIjtcbmltcG9ydCB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBVbmtub3duREJSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiDrqqjrk6AgTW9kZWwg7YG0656Y7Iqk7J2YIOq4sOuzuCDtgbTrnpjsiqRcbiAqXG4gKiBAdGVtcGxhdGUgVFN1YnNldEtleSAtIOyEnOu4jOyFiyDtgqQg7Jyg64uI7JioICjsmIg6IFwiQVwiIHwgXCJQXCIgfCBcIlNTXCIpXG4gKiBAdGVtcGxhdGUgVFN1YnNldE1hcHBpbmcgLSDshJzruIzshYvrs4Qg7LWc7KKFIOqysOqzvCDtg4DsnoUg66ek7ZWRXG4gKiBAdGVtcGxhdGUgVFN1YnNldFF1ZXJpZXMgLSDshJzruIzshYsg7L+866asIO2VqOyImCDqsJ3ssrRcbiAqIEB0ZW1wbGF0ZSBUTG9hZGVyUXVlcmllcyAtIOyEnOu4jOyFi+uzhCDroZzrjZQg7L+866asIOuwsOyXtCDqsJ3ssrRcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VNb2RlbENsYXNzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBQdXJpU3Vic2V0Rm4+ID0gbmV2ZXIsXG4gIFRMb2FkZXJRdWVyaWVzIGV4dGVuZHMgUHVyaUxvYWRlclF1ZXJpZXM8VFN1YnNldEtleT4gPSBuZXZlcixcbj4ge1xuICBwdWJsaWMgbW9kZWxOYW1lOiBzdHJpbmcgPSBcIlVua25vd25cIjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3Vic2V0UXVlcmllcz86IFRTdWJzZXRRdWVyaWVzLFxuICAgIHByb3RlY3RlZCBsb2FkZXJRdWVyaWVzPzogVExvYWRlclF1ZXJpZXMsXG4gICkge31cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCB0aGlzLmdldFVwc2VydEJ1aWxkZXIoKSk7XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCkge1xuICAgIHJldHVybiBEQi5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRJbnNlcnRlZElkcyhcbiAgICB3ZGI6IEtuZXgsXG4gICAgcm93czogVW5rbm93bkRCUmVjb3JkW10sXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgdW5xS2V5RmllbGRzOiBzdHJpbmdbXSxcbiAgICBjaHVua1NpemU6IG51bWJlciA9IDUwMCxcbiAgKSB7XG4gICAgaWYgKCF3ZGIpIHtcbiAgICAgIHdkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIH1cblxuICAgIGxldCB1bnFLZXlzOiBzdHJpbmdbXTtcbiAgICBsZXQgd2hlcmVJbkZpZWxkOiBzdHJpbmcgfCBLbmV4LlJhdztcbiAgICBsZXQgc2VsZWN0RmllbGQ6IHN0cmluZztcblxuICAgIGlmICh1bnFLZXlGaWVsZHMubGVuZ3RoID4gMSkge1xuICAgICAgd2hlcmVJbkZpZWxkID0gd2RiLnJhdyhgQ09OQ0FUX1dTKCdfJywgJyR7dW5xS2V5RmllbGRzLmpvaW4oXCIsXCIpfScpYCk7XG4gICAgICBzZWxlY3RGaWVsZCA9IGAke3doZXJlSW5GaWVsZH0gYXMgdG1wVWlkYDtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiB1bnFLZXlGaWVsZHMubWFwKChmaWVsZCkgPT4gcm93W2ZpZWxkXSkuam9pbihcIl9cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB1bnFLZXlGaWVsZHNbMF07XG4gICAgICBzZWxlY3RGaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbdW5xS2V5RmllbGRzWzBdXSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRJZHM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtcyBvZiBjaHVuayh1bnFLZXlzLCBjaHVua1NpemUpKSB7XG4gICAgICBjb25zdCBkYlJvd3MgPSBhd2FpdCB3ZGIodGFibGVOYW1lKVxuICAgICAgICAuc2VsZWN0KFwiaWRcIiwgd2RiLnJhdyhzZWxlY3RGaWVsZCkpXG4gICAgICAgIC53aGVyZUluKHdoZXJlSW5GaWVsZCBhcyBzdHJpbmcsIGl0ZW1zKTtcbiAgICAgIHJlc3VsdElkcyA9IHJlc3VsdElkcy5jb25jYXQoXG4gICAgICAgIGRiUm93cy5tYXAoKGRiUm93OiBVbmtub3duREJSZWNvcmQpID0+IHBhcnNlSW50KFN0cmluZyhkYlJvdy5pZCkpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdElkcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUg7ISc67iM7IWL7JeQIOuMgO2VnCDsv7zrpqwg67mM642UIO2ajeuTnVxuICAgKlxuICAgKiBAcmV0dXJucyBxYiAtIOy/vOumrCDruYzrjZQgKOyhsOqxtCDstpTqsIDsmqkpXG4gICAqIEByZXR1cm5zIG9uU3Vic2V0IC0g7Yq57KCVIOyEnOu4jOyFiyDsoITsmqkg7YOA7J6F7J20IO2VhOyalO2VoCDrlYwg7IKs7JqpXG4gICAqL1xuICBnZXRTdWJzZXRRdWVyaWVzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihzdWJzZXQ6IFQpIHtcbiAgICBpZiAoIXRoaXMuc3Vic2V0UXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3Vic2V0UXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXJpV3JhcHBlciA9IG5ldyBQdXJpV3JhcHBlcih0aGlzLmdldERCKFwiclwiKSwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gICAgY29uc3QgcWIgPSB0aGlzLnN1YnNldFF1ZXJpZXNbc3Vic2V0XT8uKHB1cmlXcmFwcGVyKTtcblxuICAgIC8vIE5vbkFsbG93ZWRBc1NpbmdsZVRhYmxlOiDri6jsnbwg7YWM7J2067iUIOy7rOufvCDsoJHqt7wg67Cp7KeA7JqpIOuniOy7pFxuICAgIHR5cGUgUUJUYWJsZXMgPSBVbmlvbkV4dHJhY3RlZFRUYWJsZXM8VFN1YnNldEtleSwgVFN1YnNldFF1ZXJpZXM+ICYge1xuICAgICAgTm9uQWxsb3dlZEFzU2luZ2xlVGFibGU6IHsgX19mdWxsdGV4dF9fOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBxYjogcWIgYXMgdW5rbm93biBhcyBQdXJpPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBRQlRhYmxlcywge30+LFxuICAgICAgb25TdWJzZXQ6ICgoX3N1YnNldDogVFN1YnNldEtleSB8IHJlYWRvbmx5IFRTdWJzZXRLZXlbXSkgPT4gcWIpIGFzIHtcbiAgICAgICAgLy8g64uo7J28IO2CpFxuICAgICAgICA8UyBleHRlbmRzIFRTdWJzZXRLZXk+KHN1YnNldDogUyk6IFJldHVyblR5cGU8VFN1YnNldFF1ZXJpZXNbU10+O1xuICAgICAgICAvLyDtgqQg67Cw7Je0IC0+IOq1kOynke2VqSDrsJjtmZhcbiAgICAgICAgPEFyciBleHRlbmRzIHJlYWRvbmx5IFRTdWJzZXRLZXlbXT4oXG4gICAgICAgICAgc3Vic2V0czogWy4uLkFycl0sXG4gICAgICAgICk6IFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248QXJyLCBUU3Vic2V0UXVlcmllcz47XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZXIg6rCd7LK0IOyDneyEsSDtl6ztjbxcbiAgICog7YOA7J6FIOqygOymnSDrsI8g7LaU66Gg7J2EIOuPhOyZgOykjFxuICAgKi9cbiAgY3JlYXRlRW5oYW5jZXJzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFQsIEluZmVyQWxsU3Vic2V0czxUU3Vic2V0UXVlcmllcywgVExvYWRlclF1ZXJpZXM+LCBUU3Vic2V0TWFwcGluZz4sXG4gICkge1xuICAgIHJldHVybiBlbmhhbmNlcnM7XG4gIH1cblxuICAvKipcbiAgICog7ISc67iM7IWLIOy/vOumrCDsi6TtlolcbiAgICpcbiAgICogMS4g7L+866asIOyLpO2WiSAocGFnaW5hdGlvbiDsoIHsmqkpXG4gICAqIDIuIOuhnOuNlCDsi6TtlokgKDE6TiwgTjpNIOq0gOqzhCDrjbDsnbTthLAg66Gc65SpKVxuICAgKiAzLiBIeWRyYXRlIChmbGF0IOKGkiDspJHssqkg6rCd7LK0KVxuICAgKiA0LiBFbmhhbmNlciDsoIHsmqkgKHZpcnR1YWwg7ZWE65OcIOqzhOyCsClcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJzZXRRdWVyeTxcbiAgICBUIGV4dGVuZHMgVFN1YnNldEtleSxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sXG4gID4oXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJzZXQ6IFQ7XG4gICAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PjtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBudW0/OiBudW1iZXI7XG4gICAgICAgIHBhZ2U/OiBudW1iZXI7XG4gICAgICAgIHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCI7XG4gICAgICB9O1xuICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgICAgb3B0aW1pemVDb3VudFF1ZXJ5PzogYm9vbGVhbjtcbiAgICB9ICYgRW5oYW5jZXJQYXJhbTxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz4sXG4gICk6IFByb21pc2U8RXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0PFRTdWJzZXRNYXBwaW5nLCBUPj4ge1xuICAgIGNvbnN0IHsgc3Vic2V0LCBxYiwgcGFyYW1zOiBxdWVyeVBhcmFtcywgZGVidWcgPSBmYWxzZSwgb3B0aW1pemVDb3VudFF1ZXJ5ID0gZmFsc2UgfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5sb2FkZXJRdWVyaWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2FkZXJRdWVyaWVzIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIGlmICghcXVlcnlQYXJhbXMubnVtIHx8ICFxdWVyeVBhcmFtcy5wYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJudW0gYW5kIHBhZ2UgYXJlIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbnVtLCBwYWdlIH0gPSBxdWVyeVBhcmFtcztcblxuICAgIC8vIENPVU5UIOy/vOumrCDsi6TtlolcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocWIsIHF1ZXJ5UGFyYW1zLCBkZWJ1Zywgb3B0aW1pemVDb3VudFF1ZXJ5KTtcblxuICAgIC8vIExJU1Qg7L+866asIOyLpO2WiVxuICAgIGNvbnN0IGNvbXB1dGVkUm93cyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUxpc3RRdWVyeShzdWJzZXQsIHFiLCBxdWVyeVBhcmFtcywgbnVtLCBwYWdlLCBkZWJ1Zyk7XG5cbiAgICAvLyBFbmhhbmNlciDsoIHsmqlcbiAgICBjb25zdCBlbmhhbmNlciA9IChwYXJhbXMgYXMgYW55KS5lbmhhbmNlcnM/LltzdWJzZXRdO1xuICAgIGNvbnN0IHJvd3MgPSAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb21wdXRlZFJvd3MubWFwKChyb3cpID0+IGVuaGFuY2VyPy4ocm93KSA/PyByb3cpLFxuICAgICkpIGFzIFRTdWJzZXRNYXBwaW5nW1RdW107XG5cbiAgICByZXR1cm4geyByb3dzLCB0b3RhbCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENPVU5UIOy/vOumrCDsi6TtlokgKOuCtOu2gCDrqZTshJzrk5wpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDb3VudFF1ZXJ5KFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIHBhcmFtczogeyBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiIH0sXG4gICAgZGVidWc6IGJvb2xlYW4sXG4gICAgb3B0aW1pemVDb3VudFF1ZXJ5OiBib29sZWFuLFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmIChwYXJhbXMucXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnRQdXJpID0gcWIuY2xvbmUoKS5jbGVhcihcIm9yZGVyXCIpLmNsZWFyKFwibGltaXRcIikuY2xlYXIoXCJvZmZzZXRcIik7XG5cbiAgICBpZiAob3B0aW1pemVDb3VudFF1ZXJ5KSB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IFNxbFBhcnNlciB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZS1zcWwtcGFyc2VyXCIpO1xuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFNxbFBhcnNlci5QYXJzZXIoKTtcbiAgICAgIGNvbnN0IHBhcnNlZFF1ZXJ5ID0gcGFyc2VyLmFzdGlmeShjb3VudFB1cmkudG9RdWVyeSgpLCB7XG4gICAgICAgIGRhdGFiYXNlOiBTb25hbXUuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGxlZnRKb2luVGFibGVzID0gZ2V0Sm9pblRhYmxlcyhwYXJzZWRRdWVyeSwgW1wiTEVGVCBKT0lOXCJdKTtcbiAgICAgIGNvbnN0IHdoZXJlVGFibGVzID0gZ2V0VGFibGVOYW1lc0Zyb21XaGVyZShwYXJzZWRRdWVyeSk7XG5cbiAgICAgIGNvbnN0IHRhYmxlc1RvUmVtb3ZlID0gbGVmdEpvaW5UYWJsZXMuZmlsdGVyKChqKSA9PiAhd2hlcmVUYWJsZXMuaW5jbHVkZXMoaikpO1xuICAgICAgdGFibGVzVG9SZW1vdmUuZm9yRWFjaCgodGFibGUpID0+IHtcbiAgICAgICAgY291bnRQdXJpLmNsZWFySm9pbih0YWJsZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDT1VOVCgqKeuhnCDsoITssrQg66CI7L2U65OcIOyImOulvCDqs4TsgrBcbiAgICAvLyBUT0RPOiBxYuydmCBESVNUSU5DVOqwgCDsnojripQg6rK97JqwIOyymOumrO2VtOyVvCDtlahcbiAgICBjb25zdCBjb3VudFJlc3VsdDogeyB0b3RhbD86IG51bWJlciB9ID0gYXdhaXQgY291bnRQdXJpXG4gICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgIC5zZWxlY3QoeyB0b3RhbDogUHVyaS5yYXdOdW1iZXIoYENPVU5UKCopOjppbnRlZ2VyYCkgfSlcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb3VudFB1cmkuZGVidWcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRSZXN1bHQ/LnRvdGFsID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogTElTVCDsv7zrpqwg7Iuk7ZaJICjrgrTrtoAg66mU7ISc65OcKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTGlzdFF1ZXJ5PFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgcGFyYW1zOiB7IHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCIgfSxcbiAgICBudW06IG51bWJlcixcbiAgICBwYWdlOiBudW1iZXIsXG4gICAgZGVidWc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJjb3VudFwiKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IHVubG9hZGVkUm93cyA9IChhd2FpdCBxYi5saW1pdChudW0pLm9mZnNldChudW0gKiAocGFnZSAtIDEpKSkgYXMgYW55W107XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIHFiLmRlYnVnKCk7XG4gICAgfVxuXG4gICAgLy8g66Gc642UIOyymOumrFxuICAgIGNvbnN0IGxvYWRlcnMgPSAodGhpcy5sb2FkZXJRdWVyaWVzIGFzIGFueSlbc3Vic2V0XTtcbiAgICBpZiAobG9hZGVycyAmJiBBcnJheS5pc0FycmF5KGxvYWRlcnMpKSB7XG4gICAgICB1bmxvYWRlZFJvd3MgPSBhd2FpdCB0aGlzLnByb2Nlc3NMb2FkZXJzKHVubG9hZGVkUm93cywgbG9hZGVycywgZGVidWcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh5ZHJhdGUodW5sb2FkZWRSb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsnqzqt4DsoIEg66Gc642UIOyymOumrFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTG9hZGVycyhyb3dzOiBhbnlbXSwgbG9hZGVyczogYW55W10sIGRlYnVnOiBib29sZWFuKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZUxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBjb25zdCB7IGFzLCByZWZJZCwgcWI6IHJlc29sdmVMb2FkZXJRYkZuLCBsb2FkZXJzOiBuZXN0ZWRMb2FkZXJzIH0gPSByZXNvbHZlTG9hZGVyO1xuXG4gICAgICBjb25zdCByZXNvbHZlTG9hZGVyUWIgPSByZXNvbHZlTG9hZGVyUWJGbihcbiAgICAgICAgbmV3IFB1cmlXcmFwcGVyKHRoaXMuZ2V0REIoXCJyXCIpLCBuZXcgVXBzZXJ0QnVpbGRlcigpKSxcbiAgICAgICAgcm93cy5tYXAoKHJvdykgPT4gcm93W3JlZklkXSksXG4gICAgICApO1xuXG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgcmVzb2x2ZUxvYWRlclFiLmRlYnVnKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBsb2FkZWRSb3dzID0gKGF3YWl0IHJlc29sdmVMb2FkZXJRYikgYXMgYW55W107XG5cbiAgICAgIC8vIOykkeyyqSBsb2FkZXJz6rCAIOyeiOycvOuptCDsnqzqt4Ag7LKY66asXG4gICAgICBpZiAobmVzdGVkTG9hZGVycyAmJiBuZXN0ZWRMb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9hZGVkUm93cyA9IGF3YWl0IHRoaXMucHJvY2Vzc0xvYWRlcnMobG9hZGVkUm93cywgbmVzdGVkTG9hZGVycywgZGVidWcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWJSb3dHcm91cHMgPSBncm91cChsb2FkZWRSb3dzLCAocm93KSA9PiByb3cucmVmSWQpO1xuXG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByb3dbYXNdID0gKHN1YlJvd0dyb3Vwc1tyb3dbcmVmSWRdXSA/PyBbXSkubWFwKChyKSA9PiBvbWl0KHIsIFtcInJlZklkXCJdKSk7XG4gICAgICAgIHJldHVybiByb3c7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0IOugiOy9lOuTnOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmFxuICAgKlxuICAgKiAtIGB1c2VyX19uYW1lYCDihpIgYHsgdXNlcjogeyBuYW1lIH0gfWBcbiAgICogLSBudWxsYWJsZSByZWxhdGlvbuydmCDqsr3smrAg66qo65OgIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsnpDssrTrpbwgbnVsbOuhnFxuICAgKi9cbiAgaHlkcmF0ZTxUIGV4dGVuZHMgVW5rbm93bkRCUmVjb3JkPihyb3dzOiBUW10pOiBUW10ge1xuICAgIHJldHVybiByb3dzLm1hcCgocm93OiBUKSA9PiB7XG4gICAgICAvLyBudWxsYWJsZSByZWxhdGlvbiDsspjrpqw6IOq0gOugqCDtlYTrk5zqsIAg7KCE67aAIG51bGzsnbgg6rK97JqwIOuwqeyngFxuICAgICAgY29uc3QgbmVzdGVkS2V5cyA9IE9iamVjdC5rZXlzKHJvdykuZmlsdGVyKChrZXkpID0+IGtleS5pbmNsdWRlcyhcIl9fXCIpKTtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5ncm91cEJ5KG5lc3RlZEtleXMsIChrZXkpID0+IGtleS5zcGxpdChcIl9fXCIpWzBdKTtcbiAgICAgIGNvbnN0IG51bGxLZXlzID0gT2JqZWN0LmVudHJpZXMoZ3JvdXBzKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChbXywgZGF0YV0pID0+XG4gICAgICAgICAgICBkYXRhICYmXG4gICAgICAgICAgICBkYXRhLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgIGRhdGEuZXZlcnkoXG4gICAgICAgICAgICAgIChmaWVsZCkgPT5cbiAgICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG5cbiAgICAgIGNvbnN0IGh5ZHJhdGVkID0gT2JqZWN0LmtleXMocm93KS5yZWR1Y2UoKHIsIGZpZWxkKSA9PiB7XG4gICAgICAgIGlmICghZmllbGQuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAgIC8vIOydvOuwmCDtlYTrk5w6IOuwsOyXtCDrgrQg6rCd7LK066m0IOyerOq3gCBoeWRyYXRlXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93W2ZpZWxkXSkgJiYgaXNPYmplY3Qocm93W2ZpZWxkXVswXSkpIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gdGhpcy5oeWRyYXRlKHJvd1tmaWVsZF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByW2ZpZWxkXSA9IHJvd1tmaWVsZF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KSR7LKpIO2VhOuTnCDsspjrpqw6IHVzZXJfX25hbWUg4oaSIHVzZXJbbmFtZV1cbiAgICAgICAgY29uc3QgcGFydHMgPSBmaWVsZC5zcGxpdChcIl9fXCIpO1xuICAgICAgICBjb25zdCBvYmpQYXRoID1cbiAgICAgICAgICBwYXJ0c1swXSArXG4gICAgICAgICAgcGFydHNcbiAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gYFske3BhcnR9XWApXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICByID0gc2V0KFxuICAgICAgICAgIHIsXG4gICAgICAgICAgb2JqUGF0aCxcbiAgICAgICAgICByb3dbZmllbGRdICYmIEFycmF5LmlzQXJyYXkocm93W2ZpZWxkXSkgJiYgaXNPYmplY3Qocm93W2ZpZWxkXVswXSlcbiAgICAgICAgICAgID8gdGhpcy5oeWRyYXRlKHJvd1tmaWVsZF0pXG4gICAgICAgICAgICA6IHJvd1tmaWVsZF0sXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LCB7fSBhcyBVbmtub3duREJSZWNvcmQpO1xuXG4gICAgICAvLyBudWxsIHJlbGF0aW9uIOyymOumrFxuICAgICAgbnVsbEtleXMuZm9yRWFjaCgobnVsbEtleSkgPT4ge1xuICAgICAgICBoeWRyYXRlZFtudWxsS2V5XSA9IG51bGw7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGh5ZHJhdGVkO1xuICAgIH0pIGFzIFRbXTtcbiAgfVxuXG4gIC8vIExlZ2FjeSBTdWJzZXRRdWVyeSDsi6TtlokgKFB1cmkg64+E7J6FIOyghCDtmLjtmZjsmqkpXG4gIGFzeW5jIHJ1blN1YnNldFF1ZXJ5PFQgZXh0ZW5kcyBCYXNlTGlzdFBhcmFtcywgVSBleHRlbmRzIHN0cmluZz4oe1xuICAgIHBhcmFtcyxcbiAgICBiYXNlVGFibGUsXG4gICAgc3Vic2V0LFxuICAgIHN1YnNldFF1ZXJ5LFxuICAgIGJ1aWxkLFxuICAgIGFmdGVyQnVpbGQsXG4gICAgZGVidWcsXG4gICAgZGI6IF9kYixcbiAgICBvcHRpbWl6ZUNvdW50UXVlcnksXG4gIH06IHtcbiAgICBzdWJzZXQ6IFU7XG4gICAgcGFyYW1zOiBUO1xuICAgIHN1YnNldFF1ZXJ5OiBTdWJzZXRRdWVyeTtcbiAgICBidWlsZDogKGJ1aWxkUGFyYW1zOiB7XG4gICAgICBxYjogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgICBkYjogS25leDtcbiAgICAgIHNlbGVjdDogKHN0cmluZyB8IEtuZXguUmF3KVtdO1xuICAgICAgam9pbnM6IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl07XG4gICAgICB2aXJ0dWFsOiBzdHJpbmdbXTtcbiAgICB9KSA9PiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgICBhZnRlckJ1aWxkPzogKGJ1aWxkUGFyYW1zOiB7XG4gICAgICBxYjogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgICBkYjogS25leDtcbiAgICAgIHNlbGVjdDogKHN0cmluZyB8IEtuZXguUmF3KVtdO1xuICAgICAgam9pbnM6IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl07XG4gICAgICB2aXJ0dWFsOiBzdHJpbmdbXTtcbiAgICB9KSA9PiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgICBiYXNlVGFibGU/OiBzdHJpbmc7XG4gICAgZGVidWc/OiBib29sZWFuIHwgXCJsaXN0XCIgfCBcImNvdW50XCI7XG4gICAgZGI/OiBLbmV4O1xuICAgIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFB1cmkg64+E7J6FIOyghOq5jOyngCBhbnnroZwg7Jyg7KeAXG4gICAgcm93czogYW55W107XG4gICAgdG90YWw/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgc3Vic2V0UXVlcnk6IFN1YnNldFF1ZXJ5O1xuICAgIHFiOiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgfT4ge1xuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnN0IFNxbFBhcnNlciA9IChhd2FpdCBpbXBvcnQoXCJub2RlLXNxbC1wYXJzZXJcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgeyBnZXRUYWJsZU5hbWUsIGdldFRhYmxlTmFtZXNGcm9tV2hlcmUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3NxbC1wYXJzZXJcIik7XG5cbiAgICBjb25zdCBkYiA9IF9kYiA/PyB0aGlzLmdldERCKHN1YnNldC5zdGFydHNXaXRoKFwiQVwiKSA/IFwid1wiIDogXCJyXCIpO1xuICAgIGJhc2VUYWJsZSA9IGJhc2VUYWJsZSA/PyBpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5tb2RlbE5hbWUpKTtcbiAgICBjb25zdCBxdWVyeU1vZGUgPSBwYXJhbXMucXVlcnlNb2RlID8/IChwYXJhbXMuaWQgIT09IHVuZGVmaW5lZCA/IFwibGlzdFwiIDogXCJib3RoXCIpO1xuXG4gICAgY29uc3QgeyBzZWxlY3QsIHZpcnR1YWwsIGpvaW5zLCBsb2FkZXJzIH0gPSBzdWJzZXRRdWVyeTtcbiAgICBjb25zdCBxYiA9IGJ1aWxkKHtcbiAgICAgIHFiOiBkYi5mcm9tKGJhc2VUYWJsZSksXG4gICAgICBkYixcbiAgICAgIHNlbGVjdCxcbiAgICAgIGpvaW5zLFxuICAgICAgdmlydHVhbCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFwcGx5Sm9pbkNsYXVzZSA9IChxYjogS25leC5RdWVyeUJ1aWxkZXIsIGpvaW5zOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdKSA9PiB7XG4gICAgICBqb2lucy5mb3JFYWNoKChqb2luKSA9PiB7XG4gICAgICAgIGlmIChqb2luLmpvaW4gPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgIHFiLmlubmVySm9pbihgJHtqb2luLnRhYmxlfSBhcyAke2pvaW4uYXN9YCwgdGhpcy5nZXRKb2luQ2xhdXNlKGRiLCBqb2luKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoam9pbi5qb2luID09PSBcIm91dGVyXCIpIHtcbiAgICAgICAgICBxYi5sZWZ0T3V0ZXJKb2luKGAke2pvaW4udGFibGV9IGFzICR7am9pbi5hc31gLCB0aGlzLmdldEpvaW5DbGF1c2UoZGIsIGpvaW4pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIGNvdW50UXVlcnlcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbG9uZWRRYiA9IHFiLmNsb25lKCkuY2xlYXIoXCJvcmRlclwiKS5jbGVhcihcIm9mZnNldFwiKS5jbGVhcihcImxpbWl0XCIpO1xuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFNxbFBhcnNlci5QYXJzZXIoKTtcblxuICAgICAgaWYgKG9wdGltaXplQ291bnRRdWVyeSkge1xuICAgICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHBhcnNlci5hc3RpZnkoY2xvbmVkUWIudG9RdWVyeSgpLCB7XG4gICAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0YWJsZXMgPSBnZXRUYWJsZU5hbWVzRnJvbVdoZXJlKHBhcnNlZFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgbmVlZFRvSm9pbiA9IHVuaXF1ZShcbiAgICAgICAgICB0YWJsZXMuZmxhdE1hcCgodGFibGUpID0+IHRhYmxlLnNwbGl0KFwiX19cIikubWFwKCh0KSA9PiBpbmZsZWN0aW9uLnBsdXJhbGl6ZSh0KSkpLFxuICAgICAgICApO1xuICAgICAgICBhcHBseUpvaW5DbGF1c2UoXG4gICAgICAgICAgY2xvbmVkUWIsXG4gICAgICAgICAgam9pbnMuZmlsdGVyKChqKSA9PiBuZWVkVG9Kb2luLmluY2x1ZGVzKGoudGFibGUpKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcGx5Sm9pbkNsYXVzZShjbG9uZWRRYiwgam9pbnMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9jZXNzZWRRYiA9IGFmdGVyQnVpbGQ/Lih7IHFiOiBjbG9uZWRRYiwgZGIsIHNlbGVjdCwgam9pbnMsIHZpcnR1YWwgfSkgPz8gY2xvbmVkUWI7XG5cbiAgICAgIGNvbnN0IHBhcnNlZFF1ZXJ5ID0gcGFyc2VyLmFzdGlmeShwcm9jZXNzZWRRYi50b1F1ZXJ5KCksIHtcbiAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHEgPSBBcnJheS5pc0FycmF5KHBhcnNlZFF1ZXJ5KSA/IHBhcnNlZFF1ZXJ5WzBdIDogcGFyc2VkUXVlcnk7XG4gICAgICBpZiAocS50eXBlICE9PSBcInNlbGVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcXVlcnlcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvdW50UXVlcnkgPVxuICAgICAgICBxLmRpc3RpbmN0ICE9PSBudWxsXG4gICAgICAgICAgPyBjbG9uZWRRYlxuICAgICAgICAgICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgICAgICAgICAgLnNlbGVjdChcbiAgICAgICAgICAgICAgICBkYi5yYXcoXG4gICAgICAgICAgICAgICAgICBgQ09VTlQoRElTVElOQ1QgXFxgJHtnZXRUYWJsZU5hbWUocS5jb2x1bW5zWzBdLmV4cHIpfVxcYC5cXGAke3EuY29sdW1uc1swXS5leHByLmNvbHVtbn1cXGApIGFzIHRvdGFsYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5maXJzdCgpXG4gICAgICAgICAgOiBjbG9uZWRRYi5jbGVhcihcInNlbGVjdFwiKS5jb3VudChcIipcIiwgeyBhczogXCJ0b3RhbFwiIH0pLmZpcnN0KCk7XG4gICAgICBjb25zdCBjb3VudFJvdzogeyB0b3RhbD86IG51bWJlciB9ID0gYXdhaXQgY291bnRRdWVyeTtcblxuICAgICAgaWYgKGRlYnVnID09PSB0cnVlIHx8IGRlYnVnID09PSBcImNvdW50XCIpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkRFQlVHOiBjb3VudCBxdWVyeVwiLCBjaGFsay5ibHVlKGNvdW50UXVlcnkudG9RdWVyeSgpLnRvU3RyaW5nKCkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvdW50Um93Py50b3RhbCA/PyAwO1xuICAgIH0pKCk7XG5cbiAgICAvLyBsaXN0UXVlcnlcbiAgICBjb25zdCByb3dzID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChxdWVyeU1vZGUgPT09IFwiY291bnRcIikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMubnVtICE9PSAwKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMubnVtKTtcbiAgICAgICAgcWIubGltaXQocGFyYW1zLm51bSk7XG4gICAgICAgIHFiLm9mZnNldChwYXJhbXMubnVtICogKChwYXJhbXMucGFnZSA/PyAxKSAtIDEpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xvbmVkUWIgPSBxYi5jbG9uZSgpLnNlbGVjdChzZWxlY3QpO1xuICAgICAgYXBwbHlKb2luQ2xhdXNlKGNsb25lZFFiLCBqb2lucyk7XG5cbiAgICAgIGNvbnN0IGxpc3RRdWVyeSA9IGFmdGVyQnVpbGQ/Lih7IHFiOiBjbG9uZWRRYiwgZGIsIHNlbGVjdCwgam9pbnMsIHZpcnR1YWwgfSkgPz8gY2xvbmVkUWI7XG5cbiAgICAgIGxldCByb3dzID0gYXdhaXQgbGlzdFF1ZXJ5O1xuICAgICAgaWYgKGRlYnVnID09PSB0cnVlIHx8IGRlYnVnID09PSBcImxpc3RcIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKFwiREVCVUc6IGxpc3QgcXVlcnlcIiwgY2hhbGsuYmx1ZShsaXN0UXVlcnkudG9RdWVyeSgpLnRvU3RyaW5nKCkpKTtcbiAgICAgIH1cblxuICAgICAgcm93cyA9IGF3YWl0IHRoaXMudXNlTG9hZGVycyhkYiwgcm93cywgbG9hZGVycyk7XG4gICAgICByb3dzID0gdGhpcy5oeWRyYXRlKHJvd3MpO1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB7IHJvd3MsIHRvdGFsLCBzdWJzZXRRdWVyeSwgcWIgfTtcbiAgfVxuXG4gIC8vIExlZ2FjeSBMb2FkZXIg7LKY66asIChQdXJpIOuPhOyehSDsoIQg7Zi47ZmY7JqpKVxuICBhc3luYyB1c2VMb2FkZXJzKGRiOiBLbmV4LCByb3dzOiBVbmtub3duREJSZWNvcmRbXSwgbG9hZGVyczogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdKSB7XG4gICAgaWYgKGxvYWRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBsZXQgc3ViUTogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgICBsZXQgc3ViUm93czogVW5rbm93bkRCUmVjb3JkW107XG4gICAgICBsZXQgdG9Db2w6IHN0cmluZztcblxuICAgICAgY29uc3QgZnJvbUlkcyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1tsb2FkZXIubWFueUpvaW4uaWRGaWVsZF0pO1xuXG4gICAgICBpZiAobG9hZGVyLm1hbnlKb2luLnRocm91Z2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgIGNvbnN0IGlkQ29sdW1uID0gYCR7bG9hZGVyLm1hbnlKb2luLnRvVGFibGV9LiR7bG9hZGVyLm1hbnlKb2luLnRvQ29sfWA7XG4gICAgICAgIHN1YlEgPSBkYihsb2FkZXIubWFueUpvaW4udG9UYWJsZSlcbiAgICAgICAgICAud2hlcmVJbihpZENvbHVtbiBhcyBzdHJpbmcsIGZyb21JZHMgYXMgc3RyaW5nW10pXG4gICAgICAgICAgLnNlbGVjdChbLi4ubG9hZGVyLnNlbGVjdCwgaWRDb2x1bW5dKTtcblxuICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbikgPT4ge1xuICAgICAgICAgIGlmIChqb2luLmpvaW4gPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgICAgc3ViUS5pbm5lckpvaW4oYCR7am9pbi50YWJsZX0gYXMgJHtqb2luLmFzfWAsIHRoaXMuZ2V0Sm9pbkNsYXVzZShkYiwgam9pbikpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoam9pbi5qb2luID09PSBcIm91dGVyXCIpIHtcbiAgICAgICAgICAgIHN1YlEubGVmdE91dGVySm9pbihgJHtqb2luLnRhYmxlfSBhcyAke2pvaW4uYXN9YCwgdGhpcy5nZXRKb2luQ2xhdXNlKGRiLCBqb2luKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdG9Db2wgPSBsb2FkZXIubWFueUpvaW4udG9Db2w7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNYW55VG9NYW55XG4gICAgICAgIGNvbnN0IGlkQ29sdW1uID0gYCR7bG9hZGVyLm1hbnlKb2luLnRocm91Z2gudGFibGV9LiR7bG9hZGVyLm1hbnlKb2luLnRocm91Z2guZnJvbUNvbH1gO1xuICAgICAgICBzdWJRID0gZGIobG9hZGVyLm1hbnlKb2luLnRocm91Z2gudGFibGUpXG4gICAgICAgICAgLmpvaW4oXG4gICAgICAgICAgICBsb2FkZXIubWFueUpvaW4udG9UYWJsZSxcbiAgICAgICAgICAgIGAke2xvYWRlci5tYW55Sm9pbi50aHJvdWdoLnRhYmxlfS4ke2xvYWRlci5tYW55Sm9pbi50aHJvdWdoLnRvQ29sfWAsXG4gICAgICAgICAgICBgJHtsb2FkZXIubWFueUpvaW4udG9UYWJsZX0uJHtsb2FkZXIubWFueUpvaW4udG9Db2x9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgLndoZXJlSW4oaWRDb2x1bW4gYXMgc3RyaW5nLCBmcm9tSWRzIGFzIHN0cmluZ1tdKVxuICAgICAgICAgIC5zZWxlY3QodW5pcXVlKFsuLi5sb2FkZXIuc2VsZWN0LCBpZENvbHVtbl0pKTtcblxuICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbikgPT4ge1xuICAgICAgICAgIGlmIChqb2luLmpvaW4gPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgICAgc3ViUS5pbm5lckpvaW4oYCR7am9pbi50YWJsZX0gYXMgJHtqb2luLmFzfWAsIHRoaXMuZ2V0Sm9pbkNsYXVzZShkYiwgam9pbikpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoam9pbi5qb2luID09PSBcIm91dGVyXCIpIHtcbiAgICAgICAgICAgIHN1YlEubGVmdE91dGVySm9pbihgJHtqb2luLnRhYmxlfSBhcyAke2pvaW4uYXN9YCwgdGhpcy5nZXRKb2luQ2xhdXNlKGRiLCBqb2luKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdG9Db2wgPSBsb2FkZXIubWFueUpvaW4udGhyb3VnaC5mcm9tQ29sO1xuICAgICAgfVxuICAgICAgc3ViUm93cyA9IGF3YWl0IHN1YlE7XG5cbiAgICAgIGlmIChsb2FkZXIubG9hZGVycykge1xuICAgICAgICBzdWJSb3dzID0gYXdhaXQgdGhpcy51c2VMb2FkZXJzKGRiLCBzdWJSb3dzLCBsb2FkZXIubG9hZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKHN1YlJvd3MsIChyb3cpID0+IHJvd1t0b0NvbF0gYXMgc3RyaW5nKTtcbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1tsb2FkZXIuYXNdID0gKHN1YlJvd0dyb3Vwc1tyb3dbbG9hZGVyLm1hbnlKb2luLmlkRmllbGRdIGFzIHN0cmluZ10gPz8gW10pLm1hcCgocikgPT5cbiAgICAgICAgICBvbWl0KHIsIFt0b0NvbF0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcm93O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgZ2V0Sm9pbkNsYXVzZShkYjogS25leDxhbnksIHVua25vd24+LCBqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pOiBLbmV4LlJhdzxhbnk+IHtcbiAgICBpZiAoIWlzQ3VzdG9tSm9pbkNsYXVzZShqb2luKSkge1xuICAgICAgcmV0dXJuIGRiLnJhdyhgJHtqb2luLmZyb219ID0gJHtqb2luLnRvfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGIucmF3KGpvaW4uY3VzdG9tKTtcbiAgICB9XG4gIH1cblxuICBnZXRVcHNlcnRCdWlsZGVyKCk6IFVwc2VydEJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgOiB7IGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiaW5mbGVjdGlvbiIsImdyb3VwIiwiaXNPYmplY3QiLCJvbWl0Iiwic2V0IiwidW5pcXVlIiwiU29uYW11IiwiaXNDdXN0b21Kb2luQ2xhdXNlIiwiZ2V0Sm9pblRhYmxlcyIsImdldFRhYmxlTmFtZXNGcm9tV2hlcmUiLCJjaHVuayIsIkRCIiwiUHVyaSIsIlB1cmlXcmFwcGVyIiwiVXBzZXJ0QnVpbGRlciIsIkJhc2VNb2RlbENsYXNzIiwibW9kZWxOYW1lIiwic3Vic2V0UXVlcmllcyIsImxvYWRlclF1ZXJpZXMiLCJnZXREQiIsIndoaWNoIiwiZ2V0UHVyaSIsInRyeCIsImdldFRyYW5zYWN0aW9uQ29udGV4dCIsImdldFRyYW5zYWN0aW9uIiwiZGIiLCJnZXRVcHNlcnRCdWlsZGVyIiwiZGVzdHJveSIsImdldEluc2VydGVkSWRzIiwid2RiIiwicm93cyIsInRhYmxlTmFtZSIsInVucUtleUZpZWxkcyIsImNodW5rU2l6ZSIsInVucUtleXMiLCJ3aGVyZUluRmllbGQiLCJzZWxlY3RGaWVsZCIsImxlbmd0aCIsInJhdyIsImpvaW4iLCJtYXAiLCJyb3ciLCJmaWVsZCIsInJlc3VsdElkcyIsIml0ZW1zIiwiZGJSb3dzIiwic2VsZWN0Iiwid2hlcmVJbiIsImNvbmNhdCIsImRiUm93IiwicGFyc2VJbnQiLCJTdHJpbmciLCJpZCIsImdldFN1YnNldFF1ZXJpZXMiLCJzdWJzZXQiLCJFcnJvciIsInB1cmlXcmFwcGVyIiwicWIiLCJvblN1YnNldCIsIl9zdWJzZXQiLCJjcmVhdGVFbmhhbmNlcnMiLCJlbmhhbmNlcnMiLCJleGVjdXRlU3Vic2V0UXVlcnkiLCJwYXJhbXMiLCJxdWVyeVBhcmFtcyIsImRlYnVnIiwib3B0aW1pemVDb3VudFF1ZXJ5IiwibnVtIiwicGFnZSIsInRvdGFsIiwiZXhlY3V0ZUNvdW50UXVlcnkiLCJjb21wdXRlZFJvd3MiLCJleGVjdXRlTGlzdFF1ZXJ5IiwiZW5oYW5jZXIiLCJQcm9taXNlIiwiYWxsIiwicXVlcnlNb2RlIiwiY291bnRQdXJpIiwiY2xvbmUiLCJjbGVhciIsImRlZmF1bHQiLCJTcWxQYXJzZXIiLCJwYXJzZXIiLCJQYXJzZXIiLCJwYXJzZWRRdWVyeSIsImFzdGlmeSIsInRvUXVlcnkiLCJkYXRhYmFzZSIsImNvbmZpZyIsImxlZnRKb2luVGFibGVzIiwid2hlcmVUYWJsZXMiLCJ0YWJsZXNUb1JlbW92ZSIsImZpbHRlciIsImoiLCJpbmNsdWRlcyIsImZvckVhY2giLCJ0YWJsZSIsImNsZWFySm9pbiIsImNvdW50UmVzdWx0IiwicmF3TnVtYmVyIiwiZmlyc3QiLCJ1bmxvYWRlZFJvd3MiLCJsaW1pdCIsIm9mZnNldCIsImxvYWRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJwcm9jZXNzTG9hZGVycyIsImh5ZHJhdGUiLCJyZXNvbHZlTG9hZGVyIiwiYXMiLCJyZWZJZCIsInJlc29sdmVMb2FkZXJRYkZuIiwibmVzdGVkTG9hZGVycyIsInJlc29sdmVMb2FkZXJRYiIsImxvYWRlZFJvd3MiLCJzdWJSb3dHcm91cHMiLCJyIiwibmVzdGVkS2V5cyIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJncm91cHMiLCJncm91cEJ5Iiwic3BsaXQiLCJudWxsS2V5cyIsImVudHJpZXMiLCJfIiwiZGF0YSIsImV2ZXJ5IiwiaHlkcmF0ZWQiLCJyZWR1Y2UiLCJwYXJ0cyIsIm9ialBhdGgiLCJzbGljZSIsInBhcnQiLCJudWxsS2V5IiwicnVuU3Vic2V0UXVlcnkiLCJiYXNlVGFibGUiLCJzdWJzZXRRdWVyeSIsImJ1aWxkIiwiYWZ0ZXJCdWlsZCIsIl9kYiIsImNoYWxrIiwiZ2V0VGFibGVOYW1lIiwic3RhcnRzV2l0aCIsInBsdXJhbGl6ZSIsInVuZGVyc2NvcmUiLCJ1bmRlZmluZWQiLCJ2aXJ0dWFsIiwiam9pbnMiLCJmcm9tIiwiYXBwbHlKb2luQ2xhdXNlIiwiaW5uZXJKb2luIiwiZ2V0Sm9pbkNsYXVzZSIsImxlZnRPdXRlckpvaW4iLCJjbG9uZWRRYiIsInRhYmxlcyIsIm5lZWRUb0pvaW4iLCJmbGF0TWFwIiwidCIsInByb2Nlc3NlZFFiIiwicSIsInR5cGUiLCJjb3VudFF1ZXJ5IiwiZGlzdGluY3QiLCJjb2x1bW5zIiwiZXhwciIsImNvbHVtbiIsImNvdW50IiwiY291bnRSb3ciLCJjb25zb2xlIiwiYmx1ZSIsInRvU3RyaW5nIiwibGlzdFF1ZXJ5IiwidXNlTG9hZGVycyIsImxvYWRlciIsInN1YlEiLCJzdWJSb3dzIiwidG9Db2wiLCJmcm9tSWRzIiwibWFueUpvaW4iLCJpZEZpZWxkIiwidGhyb3VnaCIsImlkQ29sdW1uIiwidG9UYWJsZSIsIm9uZUpvaW5zIiwiZnJvbUNvbCIsInRvIiwiY3VzdG9tIiwiQmFzZU1vZGVsIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFD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
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp7J2YIO2DgOyeheydgCDqsJzrs4Qg66qo64247JeQ7IScIO2ZleygleuQmOuvgOuhnCBCYXNlTW9kZWzsl5DshJzripQgYW5566W8IO2XiOyaqe2VqCAqL1xuXG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgZ3JvdXAsIGlzT2JqZWN0LCBvbWl0LCBzZXQgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Sm9pblRhYmxlcywgZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSB9IGZyb20gXCIuLi91dGlscy9zcWwtcGFyc2VyXCI7XG5pbXBvcnQgeyBjaHVuayB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbmhhbmNlck1hcCxcbiAgRXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0LFxuICBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uLFxuICBVbmlvbkV4dHJhY3RlZFRUYWJsZXMsXG59IGZyb20gXCIuL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgREJQcmVzZXQgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgUHVyaSB9IGZyb20gXCIuL3B1cmlcIjtcbmltcG9ydCB0eXBlIHsgSW5mZXJBbGxTdWJzZXRzLCBQdXJpTG9hZGVyUXVlcmllcywgUHVyaVN1YnNldEZuIH0gZnJvbSBcIi4vcHVyaS1zdWJzZXQudHlwZXNcIjtcbmltcG9ydCB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBVbmtub3duREJSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiDrqqjrk6AgTW9kZWwg7YG0656Y7Iqk7J2YIOq4sOuzuCDtgbTrnpjsiqRcbiAqXG4gKiBAdGVtcGxhdGUgVFN1YnNldEtleSAtIOyEnOu4jOyFiyDtgqQg7Jyg64uI7JioICjsmIg6IFwiQVwiIHwgXCJQXCIgfCBcIlNTXCIpXG4gKiBAdGVtcGxhdGUgVFN1YnNldE1hcHBpbmcgLSDshJzruIzshYvrs4Qg7LWc7KKFIOqysOqzvCDtg4DsnoUg66ek7ZWRXG4gKiBAdGVtcGxhdGUgVFN1YnNldFF1ZXJpZXMgLSDshJzruIzshYsg7L+866asIO2VqOyImCDqsJ3ssrRcbiAqIEB0ZW1wbGF0ZSBUTG9hZGVyUXVlcmllcyAtIOyEnOu4jOyFi+uzhCDroZzrjZQg7L+866asIOuwsOyXtCDqsJ3ssrRcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VNb2RlbENsYXNzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBQdXJpU3Vic2V0Rm4+ID0gbmV2ZXIsXG4gIFRMb2FkZXJRdWVyaWVzIGV4dGVuZHMgUHVyaUxvYWRlclF1ZXJpZXM8VFN1YnNldEtleT4gPSBuZXZlcixcbj4ge1xuICBwdWJsaWMgbW9kZWxOYW1lOiBzdHJpbmcgPSBcIlVua25vd25cIjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3Vic2V0UXVlcmllcz86IFRTdWJzZXRRdWVyaWVzLFxuICAgIHByb3RlY3RlZCBsb2FkZXJRdWVyaWVzPzogVExvYWRlclF1ZXJpZXMsXG4gICkge31cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgcmV0dXJuIERCLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGFzeW5jIGdldEluc2VydGVkSWRzKFxuICAgIHdkYjogS25leCxcbiAgICByb3dzOiBVbmtub3duREJSZWNvcmRbXSxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICB1bnFLZXlGaWVsZHM6IHN0cmluZ1tdLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyID0gNTAwLFxuICApIHtcbiAgICBpZiAoIXdkYikge1xuICAgICAgd2RiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgfVxuXG4gICAgbGV0IHVucUtleXM6IHN0cmluZ1tdO1xuICAgIGxldCB3aGVyZUluRmllbGQ6IHN0cmluZyB8IEtuZXguUmF3O1xuICAgIGxldCBzZWxlY3RGaWVsZDogc3RyaW5nO1xuXG4gICAgaWYgKHVucUtleUZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB3ZGIucmF3KGBDT05DQVRfV1MoJ18nLCAnJHt1bnFLZXlGaWVsZHMuam9pbihcIixcIil9JylgKTtcbiAgICAgIHNlbGVjdEZpZWxkID0gYCR7d2hlcmVJbkZpZWxkfSBhcyB0bXBVaWRgO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHVucUtleUZpZWxkcy5tYXAoKGZpZWxkKSA9PiByb3dbZmllbGRdKS5qb2luKFwiX1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoZXJlSW5GaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHNlbGVjdEZpZWxkID0gdW5xS2V5RmllbGRzWzBdO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1t1bnFLZXlGaWVsZHNbMF1dIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdElkczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW1zIG9mIGNodW5rKHVucUtleXMsIGNodW5rU2l6ZSkpIHtcbiAgICAgIGNvbnN0IGRiUm93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgIC5zZWxlY3QoXCJpZFwiLCB3ZGIucmF3KHNlbGVjdEZpZWxkKSlcbiAgICAgICAgLndoZXJlSW4od2hlcmVJbkZpZWxkIGFzIHN0cmluZywgaXRlbXMpO1xuICAgICAgcmVzdWx0SWRzID0gcmVzdWx0SWRzLmNvbmNhdChcbiAgICAgICAgZGJSb3dzLm1hcCgoZGJSb3c6IFVua25vd25EQlJlY29yZCkgPT4gcGFyc2VJbnQoU3RyaW5nKGRiUm93LmlkKSkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0SWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSDshJzruIzshYvsl5Ag64yA7ZWcIOy/vOumrCDruYzrjZQg7ZqN65OdXG4gICAqXG4gICAqIEByZXR1cm5zIHFiIC0g7L+866asIOu5jOuNlCAo7KGw6rG0IOy2lOqwgOyaqSlcbiAgICogQHJldHVybnMgb25TdWJzZXQgLSDtirnsoJUg7ISc67iM7IWLIOyghOyaqSDtg4DsnoXsnbQg7ZWE7JqU7ZWgIOuVjCDsgqzsmqlcbiAgICovXG4gIGdldFN1YnNldFF1ZXJpZXM8VCBleHRlbmRzIFRTdWJzZXRLZXk+KHN1YnNldDogVCkge1xuICAgIGlmICghdGhpcy5zdWJzZXRRdWVyaWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdWJzZXRRdWVyaWVzIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1cmlXcmFwcGVyID0gbmV3IFB1cmlXcmFwcGVyKHRoaXMuZ2V0REIoXCJyXCIpLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgICBjb25zdCBxYiA9IHRoaXMuc3Vic2V0UXVlcmllc1tzdWJzZXRdPy4ocHVyaVdyYXBwZXIpO1xuXG4gICAgLy8gTm9uQWxsb3dlZEFzU2luZ2xlVGFibGU6IOuLqOydvCDthYzsnbTruJQg7Lus65+8IOygkeq3vCDrsKnsp4Dsmqkg66eI7LukXG4gICAgdHlwZSBRQlRhYmxlcyA9IFVuaW9uRXh0cmFjdGVkVFRhYmxlczxUU3Vic2V0S2V5LCBUU3Vic2V0UXVlcmllcz4gJiB7XG4gICAgICBOb25BbGxvd2VkQXNTaW5nbGVUYWJsZTogeyBfX2Z1bGx0ZXh0X186IHRydWUgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHFiOiBxYiBhcyB1bmtub3duIGFzIFB1cmk8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIFFCVGFibGVzLCB7fT4sXG4gICAgICBvblN1YnNldDogKChfc3Vic2V0OiBUU3Vic2V0S2V5IHwgcmVhZG9ubHkgVFN1YnNldEtleVtdKSA9PiBxYikgYXMge1xuICAgICAgICAvLyDri6jsnbwg7YKkXG4gICAgICAgIDxTIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBTKTogUmV0dXJuVHlwZTxUU3Vic2V0UXVlcmllc1tTXT47XG4gICAgICAgIC8vIO2CpCDrsLDsl7QgLT4g6rWQ7KeR7ZWpIOuwmO2ZmFxuICAgICAgICA8QXJyIGV4dGVuZHMgcmVhZG9ubHkgVFN1YnNldEtleVtdPihcbiAgICAgICAgICBzdWJzZXRzOiBbLi4uQXJyXSxcbiAgICAgICAgKTogUmVzb2x2ZVN1YnNldEludGVyc2VjdGlvbjxBcnIsIFRTdWJzZXRRdWVyaWVzPjtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmhhbmNlciDqsJ3ssrQg7IOd7ISxIO2XrO2NvFxuICAgKiDtg4DsnoUg6rKA7KadIOuwjyDstpTroaDsnYQg64+E7JmA7KSMXG4gICAqL1xuICBjcmVhdGVFbmhhbmNlcnM8VCBleHRlbmRzIFRTdWJzZXRLZXk+KFxuICAgIGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VCwgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sIFRTdWJzZXRNYXBwaW5nPixcbiAgKSB7XG4gICAgcmV0dXJuIGVuaGFuY2VycztcbiAgfVxuXG4gIC8qKlxuICAgKiDshJzruIzshYsg7L+866asIOyLpO2WiVxuICAgKlxuICAgKiAxLiDsv7zrpqwg7Iuk7ZaJIChwYWdpbmF0aW9uIOyggeyaqSlcbiAgICogMi4g66Gc642UIOyLpO2WiSAoMTpOLCBOOk0g6rSA6rOEIOuNsOydtO2EsCDroZzrlKkpXG4gICAqIDMuIEh5ZHJhdGUgKGZsYXQg4oaSIOykkeyyqSDqsJ3ssrQpXG4gICAqIDQuIEVuaGFuY2VyIOyggeyaqSAodmlydHVhbCDtlYTrk5wg6rOE7IKwKVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YnNldFF1ZXJ5PFxuICAgIFQgZXh0ZW5kcyBUU3Vic2V0S2V5LFxuICAgIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBJbmZlckFsbFN1YnNldHM8VFN1YnNldFF1ZXJpZXMsIFRMb2FkZXJRdWVyaWVzPixcbiAgPihcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YnNldDogVDtcbiAgICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+O1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG51bT86IG51bWJlcjtcbiAgICAgICAgcGFnZT86IG51bWJlcjtcbiAgICAgICAgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIjtcbiAgICAgIH07XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBvcHRpbWl6ZUNvdW50UXVlcnk/OiBib29sZWFuO1xuICAgIH0gJiBFbmhhbmNlclBhcmFtPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nPixcbiAgKTogUHJvbWlzZTxFeGVjdXRlU3Vic2V0UXVlcnlSZXN1bHQ8VFN1YnNldE1hcHBpbmcsIFQ+PiB7XG4gICAgY29uc3QgeyBzdWJzZXQsIHFiLCBwYXJhbXM6IHF1ZXJ5UGFyYW1zLCBkZWJ1ZyA9IGZhbHNlLCBvcHRpbWl6ZUNvdW50UXVlcnkgPSBmYWxzZSB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmxvYWRlclF1ZXJpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImxvYWRlclF1ZXJpZXMgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKCFxdWVyeVBhcmFtcy5udW0gfHwgIXF1ZXJ5UGFyYW1zLnBhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm51bSBhbmQgcGFnZSBhcmUgcmVxdWlyZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW0sIHBhZ2UgfSA9IHF1ZXJ5UGFyYW1zO1xuXG4gICAgLy8gQ09VTlQg7L+866asIOyLpO2WiVxuICAgIGNvbnN0IHRvdGFsID0gYXdhaXQgdGhpcy5leGVjdXRlQ291bnRRdWVyeShxYiwgcXVlcnlQYXJhbXMsIGRlYnVnLCBvcHRpbWl6ZUNvdW50UXVlcnkpO1xuXG4gICAgLy8gTElTVCDsv7zrpqwg7Iuk7ZaJXG4gICAgY29uc3QgY29tcHV0ZWRSb3dzID0gYXdhaXQgdGhpcy5leGVjdXRlTGlzdFF1ZXJ5KHN1YnNldCwgcWIsIHF1ZXJ5UGFyYW1zLCBudW0sIHBhZ2UsIGRlYnVnKTtcblxuICAgIC8vIEVuaGFuY2VyIOyggeyaqVxuICAgIGNvbnN0IGVuaGFuY2VyID0gKHBhcmFtcyBhcyBhbnkpLmVuaGFuY2Vycz8uW3N1YnNldF07XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbXB1dGVkUm93cy5tYXAoKHJvdykgPT4gZW5oYW5jZXI/Lihyb3cpID8/IHJvdyksXG4gICAgKSkgYXMgVFN1YnNldE1hcHBpbmdbVF1bXTtcblxuICAgIHJldHVybiB7IHJvd3MsIHRvdGFsIH07XG4gIH1cblxuICAvKipcbiAgICogQ09VTlQg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUNvdW50UXVlcnkoXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgcGFyYW1zOiB7IHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCIgfSxcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgICBvcHRpbWl6ZUNvdW50UXVlcnk6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHBhcmFtcy5xdWVyeU1vZGUgPT09IFwibGlzdFwiKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudFB1cmkgPSBxYi5jbG9uZSgpLmNsZWFyKFwib3JkZXJcIikuY2xlYXIoXCJsaW1pdFwiKS5jbGVhcihcIm9mZnNldFwiKTtcblxuICAgIGlmIChvcHRpbWl6ZUNvdW50UXVlcnkpIHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdDogU3FsUGFyc2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlLXNxbC1wYXJzZXJcIik7XG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgU3FsUGFyc2VyLlBhcnNlcigpO1xuICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSBwYXJzZXIuYXN0aWZ5KGNvdW50UHVyaS50b1F1ZXJ5KCksIHtcbiAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbGVmdEpvaW5UYWJsZXMgPSBnZXRKb2luVGFibGVzKHBhcnNlZFF1ZXJ5LCBbXCJMRUZUIEpPSU5cIl0pO1xuICAgICAgY29uc3Qgd2hlcmVUYWJsZXMgPSBnZXRUYWJsZU5hbWVzRnJvbVdoZXJlKHBhcnNlZFF1ZXJ5KTtcblxuICAgICAgY29uc3QgdGFibGVzVG9SZW1vdmUgPSBsZWZ0Sm9pblRhYmxlcy5maWx0ZXIoKGopID0+ICF3aGVyZVRhYmxlcy5pbmNsdWRlcyhqKSk7XG4gICAgICB0YWJsZXNUb1JlbW92ZS5mb3JFYWNoKCh0YWJsZSkgPT4ge1xuICAgICAgICBjb3VudFB1cmkuY2xlYXJKb2luKHRhYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENPVU5UKCop66GcIOyghOyytCDroIjsvZTrk5wg7IiY66W8IOqzhOyCsFxuICAgIC8vIFRPRE86IHFi7J2YIERJU1RJTkNU6rCAIOyeiOuKlCDqsr3smrAg7LKY66as7ZW07JW8IO2VqFxuICAgIGNvbnN0IGNvdW50UmVzdWx0OiB7IHRvdGFsPzogbnVtYmVyIH0gPSBhd2FpdCBjb3VudFB1cmlcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLnNlbGVjdCh7IHRvdGFsOiBQdXJpLnJhd051bWJlcihgQ09VTlQoKik6OmludGVnZXJgKSB9KVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvdW50UHVyaS5kZWJ1ZygpO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudFJlc3VsdD8udG90YWwgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMSVNUIOy/vOumrCDsi6TtlokgKOuCtOu2gCDrqZTshJzrk5wpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVMaXN0UXVlcnk8VCBleHRlbmRzIFRTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIG51bTogbnVtYmVyLFxuICAgIHBhZ2U6IG51bWJlcixcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGlmIChwYXJhbXMucXVlcnlNb2RlID09PSBcImNvdW50XCIpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBsZXQgdW5sb2FkZWRSb3dzID0gKGF3YWl0IHFiLmxpbWl0KG51bSkub2Zmc2V0KG51bSAqIChwYWdlIC0gMSkpKSBhcyBhbnlbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgcWIuZGVidWcoKTtcbiAgICB9XG5cbiAgICAvLyDroZzrjZQg7LKY66asXG4gICAgY29uc3QgbG9hZGVycyA9ICh0aGlzLmxvYWRlclF1ZXJpZXMgYXMgYW55KVtzdWJzZXRdO1xuICAgIGlmIChsb2FkZXJzICYmIEFycmF5LmlzQXJyYXkobG9hZGVycykpIHtcbiAgICAgIHVubG9hZGVkUm93cyA9IGF3YWl0IHRoaXMucHJvY2Vzc0xvYWRlcnModW5sb2FkZWRSb3dzLCBsb2FkZXJzLCBkZWJ1Zyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKHJvd3M6IGFueVtdLCBsb2FkZXJzOiBhbnlbXSwgZGVidWc6IGJvb2xlYW4pOiBQcm9taXNlPGFueVtdPiB7XG4gICAgZm9yIChjb25zdCByZXNvbHZlTG9hZGVyIG9mIGxvYWRlcnMpIHtcbiAgICAgIGNvbnN0IHsgYXMsIHJlZklkLCBxYjogcmVzb2x2ZUxvYWRlclFiRm4sIGxvYWRlcnM6IG5lc3RlZExvYWRlcnMgfSA9IHJlc29sdmVMb2FkZXI7XG5cbiAgICAgIGNvbnN0IHJlc29sdmVMb2FkZXJRYiA9IHJlc29sdmVMb2FkZXJRYkZuKFxuICAgICAgICBuZXcgUHVyaVdyYXBwZXIodGhpcy5nZXREQihcInJcIiksIG5ldyBVcHNlcnRCdWlsZGVyKCkpLFxuICAgICAgICByb3dzLm1hcCgocm93KSA9PiByb3dbcmVmSWRdKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICByZXNvbHZlTG9hZGVyUWIuZGVidWcoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGxvYWRlZFJvd3MgPSAoYXdhaXQgcmVzb2x2ZUxvYWRlclFiKSBhcyBhbnlbXTtcblxuICAgICAgLy8g7KSR7LKpIGxvYWRlcnPqsIAg7J6I7Jy866m0IOyerOq3gCDsspjrpqxcbiAgICAgIGlmIChuZXN0ZWRMb2FkZXJzICYmIG5lc3RlZExvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyhsb2FkZWRSb3dzLCBuZXN0ZWRMb2FkZXJzLCBkZWJ1Zyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKGxvYWRlZFJvd3MsIChyb3cpID0+IHJvdy5yZWZJZCk7XG5cbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1thc10gPSAoc3ViUm93R3JvdXBzW3Jvd1tyZWZJZF1dID8/IFtdKS5tYXAoKHIpID0+IG9taXQociwgW1wicmVmSWRcIl0pKTtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXQg66CI7L2U65Oc66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmYXG4gICAqXG4gICAqIC0gYHVzZXJfX25hbWVgIOKGkiBgeyB1c2VyOiB7IG5hbWUgfSB9YFxuICAgKiAtIG51bGxhYmxlIHJlbGF0aW9u7J2YIOqyveyasCDrqqjrk6Ag7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyekOyytOulvCBudWxs66GcXG4gICAqL1xuICBoeWRyYXRlPFQgZXh0ZW5kcyBVbmtub3duREJSZWNvcmQ+KHJvd3M6IFRbXSk6IFRbXSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3c6IFQpID0+IHtcbiAgICAgIC8vIG51bGxhYmxlIHJlbGF0aW9uIOyymOumrDog6rSA66CoIO2VhOuTnOqwgCDsoITrtoAgbnVsbOyduCDqsr3smrAg67Cp7KeAXG4gICAgICBjb25zdCBuZXN0ZWRLZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoKGtleSkgPT4ga2V5LmluY2x1ZGVzKFwiX19cIikpO1xuICAgICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0Lmdyb3VwQnkobmVzdGVkS2V5cywgKGtleSkgPT4ga2V5LnNwbGl0KFwiX19cIilbMF0pO1xuICAgICAgY29uc3QgbnVsbEtleXMgPSBPYmplY3QuZW50cmllcyhncm91cHMpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFtfLCBkYXRhXSkgPT5cbiAgICAgICAgICAgIGRhdGEgJiZcbiAgICAgICAgICAgIGRhdGEubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgZGF0YS5ldmVyeShcbiAgICAgICAgICAgICAgKGZpZWxkKSA9PlxuICAgICAgICAgICAgICAgIHJvd1tmaWVsZF0gPT09IG51bGwgfHwgKEFycmF5LmlzQXJyYXkocm93W2ZpZWxkXSkgJiYgcm93W2ZpZWxkXS5sZW5ndGggPT09IDApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcblxuICAgICAgY29uc3QgaHlkcmF0ZWQgPSBPYmplY3Qua2V5cyhyb3cpLnJlZHVjZSgociwgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgICAgLy8g7J2867CYIO2VhOuTnDog67Cw7Je0IOuCtCDqsJ3ssrTrqbQg7J6s6reAIGh5ZHJhdGVcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKSkge1xuICAgICAgICAgICAgcltmaWVsZF0gPSB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gcm93W2ZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDspJHssqkg7ZWE65OcIOyymOumrDogdXNlcl9fbmFtZSDihpIgdXNlcltuYW1lXVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpZWxkLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGNvbnN0IG9ialBhdGggPVxuICAgICAgICAgIHBhcnRzWzBdICtcbiAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBgWyR7cGFydH1dYClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICAgIHIgPSBzZXQoXG4gICAgICAgICAgcixcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIHJvd1tmaWVsZF0gJiYgQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSlcbiAgICAgICAgICAgIDogcm93W2ZpZWxkXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sIHt9IGFzIFVua25vd25EQlJlY29yZCk7XG5cbiAgICAgIC8vIG51bGwgcmVsYXRpb24g7LKY66asXG4gICAgICBudWxsS2V5cy5mb3JFYWNoKChudWxsS2V5KSA9PiB7XG4gICAgICAgIGh5ZHJhdGVkW251bGxLZXldID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgfSkgYXMgVFtdO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgOiB7IGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibmFtZXMiOlsiZ3JvdXAiLCJpc09iamVjdCIsIm9taXQiLCJzZXQiLCJTb25hbXUiLCJnZXRKb2luVGFibGVzIiwiZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSIsImNodW5rIiwiREIiLCJQdXJpIiwiUHVyaVdyYXBwZXIiLCJVcHNlcnRCdWlsZGVyIiwiQmFzZU1vZGVsQ2xhc3MiLCJtb2RlbE5hbWUiLCJzdWJzZXRRdWVyaWVzIiwibG9hZGVyUXVlcmllcyIsImdldERCIiwid2hpY2giLCJnZXRQdXJpIiwidHJ4IiwiZ2V0VHJhbnNhY3Rpb25Db250ZXh0IiwiZ2V0VHJhbnNhY3Rpb24iLCJkYiIsImRlc3Ryb3kiLCJnZXRJbnNlcnRlZElkcyIsIndkYiIsInJvd3MiLCJ0YWJsZU5hbWUiLCJ1bnFLZXlGaWVsZHMiLCJjaHVua1NpemUiLCJ1bnFLZXlzIiwid2hlcmVJbkZpZWxkIiwic2VsZWN0RmllbGQiLCJsZW5ndGgiLCJyYXciLCJqb2luIiwibWFwIiwicm93IiwiZmllbGQiLCJyZXN1bHRJZHMiLCJpdGVtcyIsImRiUm93cyIsInNlbGVjdCIsIndoZXJlSW4iLCJjb25jYXQiLCJkYlJvdyIsInBhcnNlSW50IiwiU3RyaW5nIiwiaWQiLCJnZXRTdWJzZXRRdWVyaWVzIiwic3Vic2V0IiwiRXJyb3IiLCJwdXJpV3JhcHBlciIsInFiIiwib25TdWJzZXQiLCJfc3Vic2V0IiwiY3JlYXRlRW5oYW5jZXJzIiwiZW5oYW5jZXJzIiwiZXhlY3V0ZVN1YnNldFF1ZXJ5IiwicGFyYW1zIiwicXVlcnlQYXJhbXMiLCJkZWJ1ZyIsIm9wdGltaXplQ291bnRRdWVyeSIsIm51bSIsInBhZ2UiLCJ0b3RhbCIsImV4ZWN1dGVDb3VudFF1ZXJ5IiwiY29tcHV0ZWRSb3dzIiwiZXhlY3V0ZUxpc3RRdWVyeSIsImVuaGFuY2VyIiwiUHJvbWlzZSIsImFsbCIsInF1ZXJ5TW9kZSIsImNvdW50UHVyaSIsImNsb25lIiwiY2xlYXIiLCJkZWZhdWx0IiwiU3FsUGFyc2VyIiwicGFyc2VyIiwiUGFyc2VyIiwicGFyc2VkUXVlcnkiLCJhc3RpZnkiLCJ0b1F1ZXJ5IiwiZGF0YWJhc2UiLCJjb25maWciLCJsZWZ0Sm9pblRhYmxlcyIsIndoZXJlVGFibGVzIiwidGFibGVzVG9SZW1vdmUiLCJmaWx0ZXIiLCJqIiwiaW5jbHVkZXMiLCJmb3JFYWNoIiwidGFibGUiLCJjbGVhckpvaW4iLCJjb3VudFJlc3VsdCIsInJhd051bWJlciIsImZpcnN0IiwidW5sb2FkZWRSb3dzIiwibGltaXQiLCJvZmZzZXQiLCJsb2FkZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJvY2Vzc0xvYWRlcnMiLCJoeWRyYXRlIiwicmVzb2x2ZUxvYWRlciIsImFzIiwicmVmSWQiLCJyZXNvbHZlTG9hZGVyUWJGbiIsIm5lc3RlZExvYWRlcnMiLCJyZXNvbHZlTG9hZGVyUWIiLCJsb2FkZWRSb3dzIiwic3ViUm93R3JvdXBzIiwiciIsIm5lc3RlZEtleXMiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiZ3JvdXBzIiwiZ3JvdXBCeSIsInNwbGl0IiwibnVsbEtleXMiLCJlbnRyaWVzIiwiXyIsImRhdGEiLCJldmVyeSIsImh5ZHJhdGVkIiwicmVkdWNlIiwicGFydHMiLCJvYmpQYXRoIiwic2xpY2UiLCJwYXJ0IiwibnVsbEtleSIsIkJhc2VNb2RlbCJdLCJtYXBwaW5ncyI6IkFBQUEsa0dBQWtHLEdBR2xHLFNBQVNBLEtBQUssRUFBRUMsUUFBUSxFQUFFQyxJQUFJLEVBQUVDLEdBQUcsUUFBUSxVQUFVO0FBQ3JELFNBQVNDLE1BQU0sUUFBUSxrQkFBUztBQUVoQyxTQUFTQyxhQUFhLEVBQUVDLHNCQUFzQixRQUFRLHlCQUFzQjtBQUM1RSxTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBUXZDLFNBQVNDLEVBQUUsUUFBUSxVQUFPO0FBQzFCLFNBQVNDLElBQUksUUFBUSxZQUFTO0FBRTlCLFNBQVNDLFdBQVcsUUFBUSxvQkFBaUI7QUFDN0MsU0FBU0MsYUFBYSxRQUFRLHNCQUFtQjtBQUlqRDs7Ozs7OztDQU9DLEdBQ0QsT0FBTyxNQUFNQzs7O0lBTUpDLFlBQW9CLFVBQVU7SUFFckMsWUFDRSxBQUFVQyxhQUE4QixFQUN4QyxBQUFVQyxhQUE4QixDQUN4QzthQUZVRCxnQkFBQUE7YUFDQUMsZ0JBQUFBO0lBQ1Q7SUFFSEMsTUFBTUMsS0FBZSxFQUFRO1FBQzNCLE9BQU9ULEdBQUdRLEtBQUssQ0FBQ0M7SUFDbEI7SUFFQUMsUUFBUUQsS0FBZSxFQUFlO1FBQ3BDLHNCQUFzQjtRQUN0QixNQUFNRSxNQUFNWCxHQUFHWSxxQkFBcUIsR0FBR0MsY0FBYyxDQUFDSjtRQUN0RCxJQUFJRSxLQUFLO1lBQ1AsT0FBT0E7UUFDVDtRQUVBLCtCQUErQjtRQUMvQixNQUFNRyxLQUFLLElBQUksQ0FBQ04sS0FBSyxDQUFDQztRQUN0QixPQUFPLElBQUlQLFlBQVlZLElBQUksSUFBSVg7SUFDakM7SUFFQSxNQUFNWSxVQUFVO1FBQ2QsT0FBT2YsR0FBR2UsT0FBTztJQUNuQjtJQUVBLE1BQU1DLGVBQ0pDLEdBQVMsRUFDVEMsSUFBdUIsRUFDdkJDLFNBQWlCLEVBQ2pCQyxZQUFzQixFQUN0QkMsWUFBb0IsR0FBRyxFQUN2QjtRQUNBLElBQUksQ0FBQ0osS0FBSztZQUNSQSxNQUFNLElBQUksQ0FBQ1QsS0FBSyxDQUFDO1FBQ25CO1FBRUEsSUFBSWM7UUFDSixJQUFJQztRQUNKLElBQUlDO1FBRUosSUFBSUosYUFBYUssTUFBTSxHQUFHLEdBQUc7WUFDM0JGLGVBQWVOLElBQUlTLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixFQUFFTixhQUFhTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEVILGNBQWMsR0FBR0QsYUFBYSxVQUFVLENBQUM7WUFDekNELFVBQVVKLEtBQUtVLEdBQUcsQ0FBQyxDQUFDQyxNQUFRVCxhQUFhUSxHQUFHLENBQUMsQ0FBQ0UsUUFBVUQsR0FBRyxDQUFDQyxNQUFNLEVBQUVILElBQUksQ0FBQztRQUMzRSxPQUFPO1lBQ0xKLGVBQWVILFlBQVksQ0FBQyxFQUFFO1lBQzlCSSxjQUFjSixZQUFZLENBQUMsRUFBRTtZQUM3QkUsVUFBVUosS0FBS1UsR0FBRyxDQUFDLENBQUNDLE1BQVFBLEdBQUcsQ0FBQ1QsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNsRDtRQUVBLElBQUlXLFlBQXNCLEVBQUU7UUFDNUIsS0FBSyxNQUFNQyxTQUFTakMsTUFBTXVCLFNBQVNELFdBQVk7WUFDN0MsTUFBTVksU0FBUyxNQUFNaEIsSUFBSUUsV0FDdEJlLE1BQU0sQ0FBQyxNQUFNakIsSUFBSVMsR0FBRyxDQUFDRixjQUNyQlcsT0FBTyxDQUFDWixjQUF3QlM7WUFDbkNELFlBQVlBLFVBQVVLLE1BQU0sQ0FDMUJILE9BQU9MLEdBQUcsQ0FBQyxDQUFDUyxRQUEyQkMsU0FBU0MsT0FBT0YsTUFBTUcsRUFBRTtRQUVuRTtRQUVBLE9BQU9UO0lBQ1Q7SUFFQTs7Ozs7R0FLQyxHQUNEVSxpQkFBdUNDLE1BQVMsRUFBRTtRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDcEMsYUFBYSxFQUFFO1lBQ3ZCLE1BQU0sSUFBSXFDLE1BQU07UUFDbEI7UUFFQSxNQUFNQyxjQUFjLElBQUkxQyxZQUFZLElBQUksQ0FBQ00sS0FBSyxDQUFDLE1BQU0sSUFBSUw7UUFDekQsTUFBTTBDLEtBQUssSUFBSSxDQUFDdkMsYUFBYSxDQUFDb0MsT0FBTyxHQUFHRTtRQU94QyxPQUFPO1lBQ0xDLElBQUlBO1lBQ0pDLFVBQVcsQ0FBQ0MsVUFBZ0RGO1FBUTlEO0lBQ0Y7SUFFQTs7O0dBR0MsR0FDREcsZ0JBQ0VDLFNBQTBGLEVBQzFGO1FBQ0EsT0FBT0E7SUFDVDtJQUVBOzs7Ozs7O0dBT0MsR0FDRCxNQUFNQyxtQkFJSkMsTUFVK0QsRUFDVDtRQUN0RCxNQUFNLEVBQUVULE1BQU0sRUFBRUcsRUFBRSxFQUFFTSxRQUFRQyxXQUFXLEVBQUVDLFFBQVEsS0FBSyxFQUFFQyxxQkFBcUIsS0FBSyxFQUFFLEdBQUdIO1FBRXZGLElBQUksQ0FBQyxJQUFJLENBQUM1QyxhQUFhLEVBQUU7WUFDdkIsTUFBTSxJQUFJb0MsTUFBTTtRQUNsQjtRQUVBLElBQUksQ0FBQ1MsWUFBWUcsR0FBRyxJQUFJLENBQUNILFlBQVlJLElBQUksRUFBRTtZQUN6QyxNQUFNLElBQUliLE1BQU07UUFDbEI7UUFFQSxNQUFNLEVBQUVZLEdBQUcsRUFBRUMsSUFBSSxFQUFFLEdBQUdKO1FBRXRCLGNBQWM7UUFDZCxNQUFNSyxRQUFRLE1BQU0sSUFBSSxDQUFDQyxpQkFBaUIsQ0FBQ2IsSUFBSU8sYUFBYUMsT0FBT0M7UUFFbkUsYUFBYTtRQUNiLE1BQU1LLGVBQWUsTUFBTSxJQUFJLENBQUNDLGdCQUFnQixDQUFDbEIsUUFBUUcsSUFBSU8sYUFBYUcsS0FBS0MsTUFBTUg7UUFFckYsY0FBYztRQUNkLE1BQU1RLFdBQVcsQUFBQ1YsT0FBZUYsU0FBUyxFQUFFLENBQUNQLE9BQU87UUFDcEQsTUFBTXhCLE9BQVEsTUFBTTRDLFFBQVFDLEdBQUcsQ0FDN0JKLGFBQWEvQixHQUFHLENBQUMsQ0FBQ0MsTUFBUWdDLFdBQVdoQyxRQUFRQTtRQUcvQyxPQUFPO1lBQUVYO1lBQU11QztRQUFNO0lBQ3ZCO0lBRUE7O0dBRUMsR0FDRCxNQUFjQyxrQkFDWmIsRUFBdUIsRUFDdkJNLE1BQWlELEVBQ2pERSxLQUFjLEVBQ2RDLGtCQUEyQixFQUNWO1FBQ2pCLElBQUlILE9BQU9hLFNBQVMsS0FBSyxRQUFRO1lBQy9CLE9BQU87UUFDVDtRQUVBLE1BQU1DLFlBQVlwQixHQUFHcUIsS0FBSyxHQUFHQyxLQUFLLENBQUMsU0FBU0EsS0FBSyxDQUFDLFNBQVNBLEtBQUssQ0FBQztRQUVqRSxJQUFJYixvQkFBb0I7WUFDdEIsTUFBTSxFQUFFYyxTQUFTQyxTQUFTLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztZQUM1QyxNQUFNQyxTQUFTLElBQUlELFVBQVVFLE1BQU07WUFDbkMsTUFBTUMsY0FBY0YsT0FBT0csTUFBTSxDQUFDUixVQUFVUyxPQUFPLElBQUk7Z0JBQ3JEQyxVQUFVL0UsT0FBT2dGLE1BQU0sQ0FBQ0QsUUFBUSxDQUFDQSxRQUFRO1lBQzNDO1lBRUEsTUFBTUUsaUJBQWlCaEYsY0FBYzJFLGFBQWE7Z0JBQUM7YUFBWTtZQUMvRCxNQUFNTSxjQUFjaEYsdUJBQXVCMEU7WUFFM0MsTUFBTU8saUJBQWlCRixlQUFlRyxNQUFNLENBQUMsQ0FBQ0MsSUFBTSxDQUFDSCxZQUFZSSxRQUFRLENBQUNEO1lBQzFFRixlQUFlSSxPQUFPLENBQUMsQ0FBQ0M7Z0JBQ3RCbkIsVUFBVW9CLFNBQVMsQ0FBQ0Q7WUFDdEI7UUFDRjtRQUVBLHlCQUF5QjtRQUN6QixtQ0FBbUM7UUFDbkMsTUFBTUUsY0FBa0MsTUFBTXJCLFVBQzNDRSxLQUFLLENBQUMsVUFDTmpDLE1BQU0sQ0FBQztZQUFFdUIsT0FBT3hELEtBQUtzRixTQUFTLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUFFLEdBQ3BEQyxLQUFLO1FBRVIsSUFBSW5DLE9BQU87WUFDVFksVUFBVVosS0FBSztRQUNqQjtRQUVBLE9BQU9pQyxhQUFhN0IsU0FBUztJQUMvQjtJQUVBOztHQUVDLEdBQ0QsTUFBY0csaUJBQ1psQixNQUFTLEVBQ1RHLEVBQXVCLEVBQ3ZCTSxNQUFpRCxFQUNqREksR0FBVyxFQUNYQyxJQUFZLEVBQ1pILEtBQWMsRUFDRTtRQUNoQixJQUFJRixPQUFPYSxTQUFTLEtBQUssU0FBUztZQUNoQyxPQUFPLEVBQUU7UUFDWDtRQUVBLElBQUl5QixlQUFnQixNQUFNNUMsR0FBRzZDLEtBQUssQ0FBQ25DLEtBQUtvQyxNQUFNLENBQUNwQyxNQUFPQyxDQUFBQSxPQUFPLENBQUE7UUFFN0QsSUFBSUgsT0FBTztZQUNUUixHQUFHUSxLQUFLO1FBQ1Y7UUFFQSxRQUFRO1FBQ1IsTUFBTXVDLFVBQVUsQUFBQyxJQUFJLENBQUNyRixhQUFhLEFBQVEsQ0FBQ21DLE9BQU87UUFDbkQsSUFBSWtELFdBQVdDLE1BQU1DLE9BQU8sQ0FBQ0YsVUFBVTtZQUNyQ0gsZUFBZSxNQUFNLElBQUksQ0FBQ00sY0FBYyxDQUFDTixjQUFjRyxTQUFTdkM7UUFDbEU7UUFFQSxPQUFPLElBQUksQ0FBQzJDLE9BQU8sQ0FBQ1A7SUFDdEI7SUFFQTs7R0FFQyxHQUNELE1BQWNNLGVBQWU3RSxJQUFXLEVBQUUwRSxPQUFjLEVBQUV2QyxLQUFjLEVBQWtCO1FBQ3hGLEtBQUssTUFBTTRDLGlCQUFpQkwsUUFBUztZQUNuQyxNQUFNLEVBQUVNLEVBQUUsRUFBRUMsS0FBSyxFQUFFdEQsSUFBSXVELGlCQUFpQixFQUFFUixTQUFTUyxhQUFhLEVBQUUsR0FBR0o7WUFFckUsTUFBTUssa0JBQWtCRixrQkFDdEIsSUFBSWxHLFlBQVksSUFBSSxDQUFDTSxLQUFLLENBQUMsTUFBTSxJQUFJTCxrQkFDckNlLEtBQUtVLEdBQUcsQ0FBQyxDQUFDQyxNQUFRQSxHQUFHLENBQUNzRSxNQUFNO1lBRzlCLElBQUk5QyxPQUFPO2dCQUNUaUQsZ0JBQWdCakQsS0FBSztZQUN2QjtZQUVBLElBQUlrRCxhQUFjLE1BQU1EO1lBRXhCLHdCQUF3QjtZQUN4QixJQUFJRCxpQkFBaUJBLGNBQWM1RSxNQUFNLEdBQUcsR0FBRztnQkFDN0M4RSxhQUFhLE1BQU0sSUFBSSxDQUFDUixjQUFjLENBQUNRLFlBQVlGLGVBQWVoRDtZQUNwRTtZQUVBLE1BQU1tRCxlQUFlaEgsTUFBTStHLFlBQVksQ0FBQzFFLE1BQVFBLElBQUlzRSxLQUFLO1lBRXpEakYsT0FBT0EsS0FBS1UsR0FBRyxDQUFDLENBQUNDO2dCQUNmQSxHQUFHLENBQUNxRSxHQUFHLEdBQUcsQUFBQ00sQ0FBQUEsWUFBWSxDQUFDM0UsR0FBRyxDQUFDc0UsTUFBTSxDQUFDLElBQUksRUFBRSxBQUFELEVBQUd2RSxHQUFHLENBQUMsQ0FBQzZFLElBQU0vRyxLQUFLK0csR0FBRzt3QkFBQztxQkFBUTtnQkFDdkUsT0FBTzVFO1lBQ1Q7UUFDRjtRQUVBLE9BQU9YO0lBQ1Q7SUFFQTs7Ozs7R0FLQyxHQUNEOEUsUUFBbUM5RSxJQUFTLEVBQU87UUFDakQsT0FBT0EsS0FBS1UsR0FBRyxDQUFDLENBQUNDO1lBQ2YsOENBQThDO1lBQzlDLE1BQU02RSxhQUFhQyxPQUFPQyxJQUFJLENBQUMvRSxLQUFLbUQsTUFBTSxDQUFDLENBQUM2QixNQUFRQSxJQUFJM0IsUUFBUSxDQUFDO1lBQ2pFLE1BQU00QixTQUFTSCxPQUFPSSxPQUFPLENBQUNMLFlBQVksQ0FBQ0csTUFBUUEsSUFBSUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JFLE1BQU1DLFdBQVdOLE9BQU9PLE9BQU8sQ0FBQ0osUUFDN0I5QixNQUFNLENBQ0wsQ0FBQyxDQUFDbUMsR0FBR0MsS0FBSyxHQUNSQSxRQUNBQSxLQUFLM0YsTUFBTSxHQUFHLEtBQ2QyRixLQUFLQyxLQUFLLENBQ1IsQ0FBQ3ZGLFFBQ0NELEdBQUcsQ0FBQ0MsTUFBTSxLQUFLLFFBQVMrRCxNQUFNQyxPQUFPLENBQUNqRSxHQUFHLENBQUNDLE1BQU0sS0FBS0QsR0FBRyxDQUFDQyxNQUFNLENBQUNMLE1BQU0sS0FBSyxJQUdsRkcsR0FBRyxDQUFDLENBQUMsQ0FBQ2lGLElBQUksR0FBS0E7WUFFbEIsTUFBTVMsV0FBV1gsT0FBT0MsSUFBSSxDQUFDL0UsS0FBSzBGLE1BQU0sQ0FBQyxDQUFDZCxHQUFHM0U7Z0JBQzNDLElBQUksQ0FBQ0EsTUFBTW9ELFFBQVEsQ0FBQyxPQUFPO29CQUN6Qiw2QkFBNkI7b0JBQzdCLElBQUlXLE1BQU1DLE9BQU8sQ0FBQ2pFLEdBQUcsQ0FBQ0MsTUFBTSxLQUFLckMsU0FBU29DLEdBQUcsQ0FBQ0MsTUFBTSxDQUFDLEVBQUUsR0FBRzt3QkFDeEQyRSxDQUFDLENBQUMzRSxNQUFNLEdBQUcsSUFBSSxDQUFDa0UsT0FBTyxDQUFDbkUsR0FBRyxDQUFDQyxNQUFNO29CQUNwQyxPQUFPO3dCQUNMMkUsQ0FBQyxDQUFDM0UsTUFBTSxHQUFHRCxHQUFHLENBQUNDLE1BQU07b0JBQ3ZCO29CQUNBLE9BQU8yRTtnQkFDVDtnQkFFQSxvQ0FBb0M7Z0JBQ3BDLE1BQU1lLFFBQVExRixNQUFNa0YsS0FBSyxDQUFDO2dCQUMxQixNQUFNUyxVQUNKRCxLQUFLLENBQUMsRUFBRSxHQUNSQSxNQUNHRSxLQUFLLENBQUMsR0FDTjlGLEdBQUcsQ0FBQyxDQUFDK0YsT0FBUyxDQUFDLENBQUMsRUFBRUEsS0FBSyxDQUFDLENBQUMsRUFDekJoRyxJQUFJLENBQUM7Z0JBRVY4RSxJQUFJOUcsSUFDRjhHLEdBQ0FnQixTQUNBNUYsR0FBRyxDQUFDQyxNQUFNLElBQUkrRCxNQUFNQyxPQUFPLENBQUNqRSxHQUFHLENBQUNDLE1BQU0sS0FBS3JDLFNBQVNvQyxHQUFHLENBQUNDLE1BQU0sQ0FBQyxFQUFFLElBQzdELElBQUksQ0FBQ2tFLE9BQU8sQ0FBQ25FLEdBQUcsQ0FBQ0MsTUFBTSxJQUN2QkQsR0FBRyxDQUFDQyxNQUFNO2dCQUdoQixPQUFPMkU7WUFDVCxHQUFHLENBQUM7WUFFSixtQkFBbUI7WUFDbkJRLFNBQVM5QixPQUFPLENBQUMsQ0FBQ3lDO2dCQUNoQk4sUUFBUSxDQUFDTSxRQUFRLEdBQUc7WUFDdEI7WUFFQSxPQUFPTjtRQUNUO0lBQ0Y7QUFDRjtBQXNCQSxPQUFPLE1BQU1PLFlBQVksSUFBSXpILGlCQUFpQiJ9
@@ -1,3 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */
1
2
  /**
2
3
  * BaseModel 타입 시스템
3
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"base-model.types.d.ts","sourceRoot":"","sources":["../../src/database/base-model.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-model.types.d.ts","sourceRoot":"","sources":["../../src/database/base-model.types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /**
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */ /**
2
2
  * BaseModel 타입 시스템
3
3
  *
4
4
  * BaseModelClass에서 사용하는 타입 유틸리티들.
@@ -7,4 +7,4 @@
7
7
  * executeSubsetQuery 반환 타입
8
8
  */ export { };
9
9
 
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZU1vZGVsIO2DgOyehSDsi5zsiqTthZxcbiAqXG4gKiBCYXNlTW9kZWxDbGFzc+yXkOyEnCDsgqzsmqntlZjripQg7YOA7J6FIOycoO2LuOumrO2LsOuTpC5cbiAqIEVuaGFuY2VyLCBTdWJzZXRRdWVyeSDqtZDsp5Htlakg65OxIE1vZGVsIOqzhOy4teyXkOyEnCDtlYTsmpTtlZwg7YOA7J6FIOygleydmC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlTdWJzZXRGbiB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFB1cmkg7YWM7J2067iUIOy2lOy2nCDsnKDti7jrpqzti7Bcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQdXJpIOyduOyKpO2EtOyKpOyXkOyEnCBUVGFibGVzIO2DgOyehSDstpTstpxcbiAqL1xuZXhwb3J0IHR5cGUgRXh0cmFjdFB1cmlUYWJsZXM8VD4gPSBUIGV4dGVuZHMgUHVyaTxhbnksIGluZmVyIFRUYWJsZXMsIGFueT4gPyBUVGFibGVzIDogbmV2ZXI7XG5cbi8qKlxuICogU3Vic2V0UXVlcmllc+yXkOyEnCDrqqjrk6AgVFRhYmxlc+ydmCDsnKDri4jsmKgg7LaU7LacXG4gKiBnZXRTdWJzZXRRdWVyaWVz7J2YIHFiIO2DgOyehSDsoJXsnZjsl5Ag7IKs7JqpXG4gKi9cbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPixcbj4gPSBFeHRyYWN0UHVyaVRhYmxlczxSZXR1cm5UeXBlPFRTdWJzZXRRdWVyaWVzW1RTdWJzZXRLZXldPj47XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFN1YnNldCDqtZDsp5Htlakg6rOE7IKwIChvblN1YnNldCDrqZTshJzrk5zsmqkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICog65GQIFB1cmnsnZgg7YWM7J2067iUIOq1kOynke2VqeydhCDqsIDsp4Qg7IOI66Gc7Jq0IFB1cmkg7IOd7ISxXG4gKi9cbnR5cGUgTWVyZ2VQdXJpVGFibGVzPEEsIEIsIFRBID0gRXh0cmFjdFB1cmlUYWJsZXM8QT4sIFRCID0gRXh0cmFjdFB1cmlUYWJsZXM8Qj4+ID0gUHVyaTxcbiAgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIFBpY2s8VEEsIEV4dHJhY3Q8a2V5b2YgVEEsIGtleW9mIFRCPj4sXG4gIGFueVxuPjtcblxuLyoqXG4gKiDshJzruIzshYsg7YKkIOuwsOyXtOydhCDsiJztmoztlZjrqbAg7YWM7J2067iUIOq1kOynke2VqSBQdXJpIOqzhOyCsFxuICpcbiAqIG9uU3Vic2V0KFsnQScsICdQJ10p7JmAIOqwmeydtCDsl6zrn6wgc3Vic2V07J2EIOyngOygle2WiOydhCDrlYwsXG4gKiDqs7XthrXsnLzroZwg7IKs7JqpIOqwgOuKpe2VnCDthYzsnbTruJTrp4wg7Y+s7ZWo65CcIFB1cmkg7YOA7J6FIOuwmO2ZmFxuICovXG5leHBvcnQgdHlwZSBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uPFxuICBLZXlzIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW10sXG4gIFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCAoLi4uYXJnczogYW55KSA9PiBhbnk+LFxuPiA9IEtleXMgZXh0ZW5kcyBbaW5mZXIgSGVhZCBleHRlbmRzIHN0cmluZywgLi4uaW5mZXIgVGFpbCBleHRlbmRzIHN0cmluZ1tdXVxuICA/IFRhaWwgZXh0ZW5kcyBbXVxuICAgID8gUmV0dXJuVHlwZTxRdWVyaWVzW0hlYWRdPlxuICAgIDogTWVyZ2VQdXJpVGFibGVzPFJldHVyblR5cGU8UXVlcmllc1tIZWFkXT4sIFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248VGFpbCwgUXVlcmllcz4+XG4gIDogbmV2ZXI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVuaGFuY2VyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICog64uo7J28IEVuaGFuY2VyIO2VqOyImCDtg4DsnoVcbiAqIGNvbXB1dGVkIOqysOqzvOulvCDrsJvslYQg7LWc7KKFIG1hcHBpbmcg7YOA7J6F7Jy866GcIOuzgO2ZmFxuICovXG5leHBvcnQgdHlwZSBFbmhhbmNlckZuPFRDb21wdXRlZCwgVE1hcHBpbmc+ID0gKHJvdzogVENvbXB1dGVkKSA9PiBUTWFwcGluZyB8IFByb21pc2U8VE1hcHBpbmc+O1xuXG4vKipcbiAqIEVuaGFuY2Vy6rCAIO2VhOyImOyduCBTdWJzZXRLZXkg7LaU7LacXG4gKlxuICogQ29tcHV0ZWRSZXN1bHRzW0td6rCAIFN1YnNldE1hcHBpbmdbS13sl5Ag7ZWg64u5IOu2iOqwgOuKpe2VmOuptCDtlbTri7kgS+uKlCDtlYTsiJhcbiAqICjspoksIHZpcnR1YWwg7ZWE65OcIOuTsSDstpTqsIAg67OA7ZmY7J20IO2VhOyalO2VnCDqsr3smrApXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVpcmVkRW5oYW5jZXJLZXlzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4+ID0ge1xuICBbSyBpbiBUU3Vic2V0S2V5XTogVENvbXB1dGVkUmVzdWx0c1tLXSBleHRlbmRzIFRTdWJzZXRNYXBwaW5nW0tdID8gbmV2ZXIgOiBLO1xufVtUU3Vic2V0S2V5XTtcblxuLyoqXG4gKiBFbmhhbmNlciDqsJ3ssrQg7YOA7J6FIOygleydmFxuICpcbiAqIC0gQ29tcHV0ZWRSZXN1bHRzW0td6rCAIFN1YnNldE1hcHBpbmdbS13sl5AgYXNzaWduYWJsZe2VmOuptCDihpIgZW5oYW5jZXIg7ISg7YOd7KCBXG4gKiAtIOq3uOugh+yngCDslYrsnLzrqbQg4oaSIGVuaGFuY2VyIO2VhOyImFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyB2aXJ0dWFsIO2VhOuTnCBlbXBsb3llZV9jb3VudOqwgCDsnojripQg6rK97JqwXG4gKiB0eXBlIENvbXB1dGVkID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVxuICogdHlwZSBNYXBwaW5nID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtcGxveWVlX2NvdW50OiBudW1iZXIgfVxuICogLy8g4oaSIEVuaGFuY2VyIO2VhOyImCAoZW1wbG95ZWVfY291bnQg6rOE7IKwIO2VhOyalClcbiAqL1xuZXhwb3J0IHR5cGUgRW5oYW5jZXJNYXA8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIC8vIENvbXB1dGVk6rCAIE1hcHBpbmfsl5Ag7Zi47ZmY65CY66m0IOyEoO2DneyggVxuICBbSyBpbiBUU3Vic2V0S2V5IGFzIFRDb21wdXRlZFJlc3VsdHNbS10gZXh0ZW5kcyBUU3Vic2V0TWFwcGluZ1tLXSA/IEsgOiBuZXZlcl0/OiBFbmhhbmNlckZuPFxuICAgIFRDb21wdXRlZFJlc3VsdHNbS10sXG4gICAgVFN1YnNldE1hcHBpbmdbS11cbiAgPjtcbn0gJiB7XG4gIC8vIO2YuO2ZmOuQmOyngCDslYrsnLzrqbQg7ZWE7IiYXG4gIFtLIGluIFRTdWJzZXRLZXkgYXMgVENvbXB1dGVkUmVzdWx0c1tLXSBleHRlbmRzIFRTdWJzZXRNYXBwaW5nW0tdID8gbmV2ZXIgOiBLXTogRW5oYW5jZXJGbjxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzW0tdLFxuICAgIFRTdWJzZXRNYXBwaW5nW0tdXG4gID47XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBleGVjdXRlU3Vic2V0UXVlcnlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBleGVjdXRlU3Vic2V0UXVlcnkg6riw67O4IO2MjOudvOuvuO2EsFxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRlU3Vic2V0UXVlcnlCYXNlUGFyYW1zPFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBzdWJzZXQ6IFRTdWJzZXRLZXk7XG4gIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+O1xuICBwYXJhbXM6IHtcbiAgICBudW0/OiBudW1iZXI7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiO1xuICB9O1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIGV4ZWN1dGVTdWJzZXRRdWVyeSDtjIzrnbzrr7jthLAgKEVuaGFuY2VyIO2PrO2VqClcbiAqXG4gKiBSZXF1aXJlZEVuaGFuY2VyS2V5c+qwgCDsl4bsnLzrqbQgZW5oYW5jZXJzIOyEoO2DneyggSwg7J6I7Jy866m0IO2VhOyImFxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRlU3Vic2V0UXVlcnlQYXJhbXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVCBleHRlbmRzIFRTdWJzZXRLZXksXG4+ID0gRXhlY3V0ZVN1YnNldFF1ZXJ5QmFzZVBhcmFtczxUPiAmXG4gIChbUmVxdWlyZWRFbmhhbmNlcktleXM8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+XSBleHRlbmRzIFtuZXZlcl1cbiAgICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgICA6IHsgZW5oYW5jZXJzOiBFbmhhbmNlck1hcDxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz4gfSk7XG5cbi8qKlxuICogZXhlY3V0ZVN1YnNldFF1ZXJ5IOuwmO2ZmCDtg4DsnoVcbiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0PFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFQgZXh0ZW5kcyBzdHJpbmcsXG4+ID0ge1xuICByb3dzOiBUU3Vic2V0TWFwcGluZ1tUXVtdO1xuICB0b3RhbDogbnVtYmVyO1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Q0FLQyxHQTRJRDs7Q0FFQyxHQUNELFdBTUUifQ==
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp7J2YIO2DgOyeheydgCDqsJzrs4Qg66qo64247JeQ7IScIO2ZleygleuQmOuvgOuhnCBCYXNlTW9kZWzsl5DshJzripQgYW5566W8IO2XiOyaqe2VqCAqL1xuXG4vKipcbiAqIEJhc2VNb2RlbCDtg4DsnoUg7Iuc7Iqk7YWcXG4gKlxuICogQmFzZU1vZGVsQ2xhc3Psl5DshJwg7IKs7Jqp7ZWY64qUIO2DgOyehSDsnKDti7jrpqzti7Drk6QuXG4gKiBFbmhhbmNlciwgU3Vic2V0UXVlcnkg6rWQ7KeR7ZWpIOuTsSBNb2RlbCDqs4TsuLXsl5DshJwg7ZWE7JqU7ZWcIO2DgOyehSDsoJXsnZguXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBQdXJpU3Vic2V0Rm4gfSBmcm9tIFwiLi9wdXJpLXN1YnNldC50eXBlc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQdXJpIO2FjOydtOu4lCDstpTstpwg7Jyg7Yu466as7YuwXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUHVyaSDsnbjsiqTthLTsiqTsl5DshJwgVFRhYmxlcyDtg4DsnoUg7LaU7LacXG4gKi9cbmV4cG9ydCB0eXBlIEV4dHJhY3RQdXJpVGFibGVzPFQ+ID0gVCBleHRlbmRzIFB1cmk8YW55LCBpbmZlciBUVGFibGVzLCBhbnk+ID8gVFRhYmxlcyA6IG5ldmVyO1xuXG4vKipcbiAqIFN1YnNldFF1ZXJpZXPsl5DshJwg66qo65OgIFRUYWJsZXPsnZgg7Jyg64uI7JioIOy2lOy2nFxuICogZ2V0U3Vic2V0UXVlcmllc+ydmCBxYiDtg4DsnoUg7KCV7J2Y7JeQIOyCrOyaqVxuICovXG5leHBvcnQgdHlwZSBVbmlvbkV4dHJhY3RlZFRUYWJsZXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIFB1cmlTdWJzZXRGbj4sXG4+ID0gRXh0cmFjdFB1cmlUYWJsZXM8UmV0dXJuVHlwZTxUU3Vic2V0UXVlcmllc1tUU3Vic2V0S2V5XT4+O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTdWJzZXQg6rWQ7KeR7ZWpIOqzhOyCsCAob25TdWJzZXQg66mU7ISc65Oc7JqpKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIOuRkCBQdXJp7J2YIO2FjOydtOu4lCDqtZDsp5HtlansnYQg6rCA7KeEIOyDiOuhnOyatCBQdXJpIOyDneyEsVxuICovXG50eXBlIE1lcmdlUHVyaVRhYmxlczxBLCBCLCBUQSA9IEV4dHJhY3RQdXJpVGFibGVzPEE+LCBUQiA9IEV4dHJhY3RQdXJpVGFibGVzPEI+PiA9IFB1cmk8XG4gIERhdGFiYXNlU2NoZW1hRXh0ZW5kLFxuICBQaWNrPFRBLCBFeHRyYWN0PGtleW9mIFRBLCBrZXlvZiBUQj4+LFxuICBhbnlcbj47XG5cbi8qKlxuICog7ISc67iM7IWLIO2CpCDrsLDsl7TsnYQg7Iic7ZqM7ZWY66mwIO2FjOydtOu4lCDqtZDsp5HtlakgUHVyaSDqs4TsgrBcbiAqXG4gKiBvblN1YnNldChbJ0EnLCAnUCddKeyZgCDqsJnsnbQg7Jes65+sIHN1YnNldOydhCDsp4DsoJXtlojsnYQg65WMLFxuICog6rO17Ya17Jy866GcIOyCrOyaqSDqsIDriqXtlZwg7YWM7J2067iU66eMIO2PrO2VqOuQnCBQdXJpIO2DgOyehSDrsJjtmZhcbiAqL1xuZXhwb3J0IHR5cGUgUmVzb2x2ZVN1YnNldEludGVyc2VjdGlvbjxcbiAgS2V5cyBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdLFxuICBRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueSkgPT4gYW55Pixcbj4gPSBLZXlzIGV4dGVuZHMgW2luZmVyIEhlYWQgZXh0ZW5kcyBzdHJpbmcsIC4uLmluZmVyIFRhaWwgZXh0ZW5kcyBzdHJpbmdbXV1cbiAgPyBUYWlsIGV4dGVuZHMgW11cbiAgICA/IFJldHVyblR5cGU8UXVlcmllc1tIZWFkXT5cbiAgICA6IE1lcmdlUHVyaVRhYmxlczxSZXR1cm5UeXBlPFF1ZXJpZXNbSGVhZF0+LCBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uPFRhaWwsIFF1ZXJpZXM+PlxuICA6IG5ldmVyO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbmhhbmNlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIOuLqOydvCBFbmhhbmNlciDtlajsiJgg7YOA7J6FXG4gKiBjb21wdXRlZCDqsrDqs7zrpbwg67Cb7JWEIOy1nOyihSBtYXBwaW5nIO2DgOyeheycvOuhnCDrs4DtmZhcbiAqL1xuZXhwb3J0IHR5cGUgRW5oYW5jZXJGbjxUQ29tcHV0ZWQsIFRNYXBwaW5nPiA9IChyb3c6IFRDb21wdXRlZCkgPT4gVE1hcHBpbmcgfCBQcm9taXNlPFRNYXBwaW5nPjtcblxuLyoqXG4gKiBFbmhhbmNlcuqwgCDtlYTsiJjsnbggU3Vic2V0S2V5IOy2lOy2nFxuICpcbiAqIENvbXB1dGVkUmVzdWx0c1tLXeqwgCBTdWJzZXRNYXBwaW5nW0td7JeQIO2VoOuLuSDrtojqsIDriqXtlZjrqbQg7ZW064u5IEvripQg7ZWE7IiYXG4gKiAo7KaJLCB2aXJ0dWFsIO2VhOuTnCDrk7Eg7LaU6rCAIOuzgO2ZmOydtCDtlYTsmpTtlZwg6rK97JqwKVxuICovXG5leHBvcnQgdHlwZSBSZXF1aXJlZEVuaGFuY2VyS2V5czxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IHtcbiAgW0sgaW4gVFN1YnNldEtleV06IFRDb21wdXRlZFJlc3VsdHNbS10gZXh0ZW5kcyBUU3Vic2V0TWFwcGluZ1tLXSA/IG5ldmVyIDogSztcbn1bVFN1YnNldEtleV07XG5cbi8qKlxuICogRW5oYW5jZXIg6rCd7LK0IO2DgOyehSDsoJXsnZhcbiAqXG4gKiAtIENvbXB1dGVkUmVzdWx0c1tLXeqwgCBTdWJzZXRNYXBwaW5nW0td7JeQIGFzc2lnbmFibGXtlZjrqbQg4oaSIGVuaGFuY2VyIOyEoO2DneyggVxuICogLSDqt7jroIfsp4Ag7JWK7Jy866m0IOKGkiBlbmhhbmNlciDtlYTsiJhcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gdmlydHVhbCDtlYTrk5wgZW1wbG95ZWVfY291bnTqsIAg7J6I64qUIOqyveyasFxuICogdHlwZSBDb21wdXRlZCA9IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nIH1cbiAqIHR5cGUgTWFwcGluZyA9IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBlbXBsb3llZV9jb3VudDogbnVtYmVyIH1cbiAqIC8vIOKGkiBFbmhhbmNlciDtlYTsiJggKGVtcGxveWVlX2NvdW50IOqzhOyCsCDtlYTsmpQpXG4gKi9cbmV4cG9ydCB0eXBlIEVuaGFuY2VyTWFwPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4+ID0ge1xuICAvLyBDb21wdXRlZOqwgCBNYXBwaW5n7JeQIO2YuO2ZmOuQmOuptCDshKDtg53soIFcbiAgW0sgaW4gVFN1YnNldEtleSBhcyBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBLIDogbmV2ZXJdPzogRW5oYW5jZXJGbjxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzW0tdLFxuICAgIFRTdWJzZXRNYXBwaW5nW0tdXG4gID47XG59ICYge1xuICAvLyDtmLjtmZjrkJjsp4Ag7JWK7Jy866m0IO2VhOyImFxuICBbSyBpbiBUU3Vic2V0S2V5IGFzIFRDb21wdXRlZFJlc3VsdHNbS10gZXh0ZW5kcyBUU3Vic2V0TWFwcGluZ1tLXSA/IG5ldmVyIDogS106IEVuaGFuY2VyRm48XG4gICAgVENvbXB1dGVkUmVzdWx0c1tLXSxcbiAgICBUU3Vic2V0TWFwcGluZ1tLXVxuICA+O1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gZXhlY3V0ZVN1YnNldFF1ZXJ5XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogZXhlY3V0ZVN1YnNldFF1ZXJ5IOq4sOuzuCDtjIzrnbzrr7jthLBcbiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0ZVN1YnNldFF1ZXJ5QmFzZVBhcmFtczxUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgc3Vic2V0OiBUU3Vic2V0S2V5O1xuICBxYjogUHVyaTxhbnksIGFueSwgYW55PjtcbiAgcGFyYW1zOiB7XG4gICAgbnVtPzogbnVtYmVyO1xuICAgIHBhZ2U/OiBudW1iZXI7XG4gICAgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIjtcbiAgfTtcbiAgZGVidWc/OiBib29sZWFuO1xuICBvcHRpbWl6ZUNvdW50UXVlcnk/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBleGVjdXRlU3Vic2V0UXVlcnkg7YyM652866+47YSwIChFbmhhbmNlciDtj6ztlagpXG4gKlxuICogUmVxdWlyZWRFbmhhbmNlcktleXPqsIAg7JeG7Jy866m0IGVuaGFuY2VycyDshKDtg53soIEsIOyeiOycvOuptCDtlYTsiJhcbiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0ZVN1YnNldFF1ZXJ5UGFyYW1zPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4gIFQgZXh0ZW5kcyBUU3Vic2V0S2V5LFxuPiA9IEV4ZWN1dGVTdWJzZXRRdWVyeUJhc2VQYXJhbXM8VD4gJlxuICAoW1JlcXVpcmVkRW5oYW5jZXJLZXlzPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nPl0gZXh0ZW5kcyBbbmV2ZXJdXG4gICAgPyB7IGVuaGFuY2Vycz86IEVuaGFuY2VyTWFwPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nPiB9XG4gICAgOiB7IGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH0pO1xuXG4vKipcbiAqIGV4ZWN1dGVTdWJzZXRRdWVyeSDrsJjtmZgg7YOA7J6FXG4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGVTdWJzZXRRdWVyeVJlc3VsdDxcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUIGV4dGVuZHMgc3RyaW5nLFxuPiA9IHtcbiAgcm93czogVFN1YnNldE1hcHBpbmdbVF1bXTtcbiAgdG90YWw6IG51bWJlcjtcbn07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0dBQWtHLEdBRWxHOzs7OztDQUtDLEdBNElEOztDQUVDLEdBQ0QsV0FNRSJ9