sonamu 0.7.8 → 0.7.9

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 (34) hide show
  1. package/dist/database/base-model.d.ts +47 -2
  2. package/dist/database/base-model.d.ts.map +1 -1
  3. package/dist/database/base-model.js +87 -5
  4. package/dist/entity/entity-manager.d.ts +5 -5
  5. package/dist/entity/entity.d.ts +9 -0
  6. package/dist/entity/entity.d.ts.map +1 -1
  7. package/dist/entity/entity.js +16 -1
  8. package/dist/migration/code-generation.d.ts.map +1 -1
  9. package/dist/migration/code-generation.js +12 -9
  10. package/dist/migration/migration-set.js +3 -1
  11. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  12. package/dist/migration/postgresql-schema-reader.js +3 -2
  13. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  14. package/dist/template/implementations/generated.template.js +3 -2
  15. package/dist/types/types.d.ts +30 -25
  16. package/dist/types/types.d.ts.map +1 -1
  17. package/dist/types/types.js +10 -7
  18. package/dist/vector/config.d.ts.map +1 -1
  19. package/dist/vector/config.js +2 -2
  20. package/dist/vector/embedding.d.ts +12 -8
  21. package/dist/vector/embedding.d.ts.map +1 -1
  22. package/dist/vector/embedding.js +59 -74
  23. package/dist/vector/vector-search.js +2 -2
  24. package/package.json +12 -5
  25. package/src/database/base-model.ts +132 -7
  26. package/src/entity/entity.ts +19 -0
  27. package/src/migration/code-generation.ts +15 -8
  28. package/src/migration/migration-set.ts +2 -0
  29. package/src/migration/postgresql-schema-reader.ts +1 -0
  30. package/src/template/implementations/generated.template.ts +3 -4
  31. package/src/types/types.ts +12 -6
  32. package/src/vector/config.ts +2 -4
  33. package/src/vector/embedding.ts +73 -104
  34. package/src/vector/vector-search.ts +1 -1
@@ -1,6 +1,8 @@
1
1
  /** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */
2
2
  import type { Knex } from "knex";
3
3
  import type { DatabaseSchemaExtend } from "../types/types";
4
+ import type { EmbeddingItem, EmbeddingProvider, HybridSearchOptions, HybridSearchResult, ProgressCallback, VectorSearchOptions, VectorSearchResult } from "../vector/types";
5
+ import { VectorSearch } from "../vector/vector-search";
4
6
  import type { EnhancerMap, ExecuteSubsetQueryResult, ResolveSubsetIntersection, UnionExtractedTTables } from "./base-model.types";
5
7
  import type { DBPreset } from "./db";
6
8
  import { Puri } from "./puri";
@@ -22,6 +24,49 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
22
24
  constructor(subsetQueries?: TSubsetQueries | undefined, loaderQueries?: TLoaderQueries | undefined);
23
25
  getDB(which: DBPreset): Knex;
24
26
  getPuri(which: DBPreset): PuriWrapper;
27
+ private _vectorSearch;
28
+ /**
29
+ * 벡터 검색 인스턴스 반환
30
+ * - 기본 provider: voyage
31
+ * - 기본 dimensions: 1024 (DEFAULT_VECTOR_CONFIG 사용)
32
+ */
33
+ getVector<T = Record<string, unknown>>(): VectorSearch<T>;
34
+ /**
35
+ * 벡터 검색 (코사인 유사도)
36
+ * @param query - 검색어
37
+ * @param options - 검색 옵션
38
+ */
39
+ vectorSearch<T = Record<string, unknown>>(query: string, options?: VectorSearchOptions & {
40
+ provider?: EmbeddingProvider;
41
+ }): Promise<VectorSearchResult<T>[]>;
42
+ /**
43
+ * 하이브리드 검색 (Vector + FTS)
44
+ * @param query - 검색어
45
+ * @param options - 검색 옵션
46
+ */
47
+ hybridSearch<T = Record<string, unknown>>(query: string, options?: HybridSearchOptions & {
48
+ provider?: EmbeddingProvider;
49
+ }): Promise<HybridSearchResult<T>[]>;
50
+ /**
51
+ * 단일 레코드에 임베딩 저장
52
+ * @param id - 레코드 ID
53
+ * @param text - 임베딩할 텍스트
54
+ * @param options - provider, embeddingColumn 옵션
55
+ */
56
+ saveEmbedding(id: number, text: string, options?: {
57
+ provider?: EmbeddingProvider;
58
+ embeddingColumn?: string;
59
+ }): Promise<void>;
60
+ /**
61
+ * 여러 레코드에 임베딩 일괄 저장
62
+ * @param items - { id, text } 배열
63
+ * @param options - provider, embeddingColumn, onProgress 옵션
64
+ */
65
+ saveEmbeddingsBatch(items: EmbeddingItem[], options?: {
66
+ provider?: EmbeddingProvider;
67
+ embeddingColumn?: string;
68
+ onProgress?: ProgressCallback;
69
+ }): Promise<void>;
25
70
  destroy(): Promise<void>;
26
71
  getInsertedIds(wdb: Knex, rows: UnknownDBRecord[], tableName: string, unqKeyFields: string[], chunkSize?: number): Promise<number[]>;
27
72
  /**
@@ -58,8 +103,8 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
58
103
  subset: T;
59
104
  qb: Puri<any, any, any>;
60
105
  params: {
61
- num?: number;
62
- page?: number;
106
+ num: number;
107
+ page: number;
63
108
  queryMode?: "list" | "count" | "both";
64
109
  };
65
110
  debug?: boolean;
@@ -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,7 +1,9 @@
1
1
  /** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */ import { group, isObject, omit, set } from "radashi";
2
2
  import { Sonamu } from "../api/index.js";
3
+ import { EntityManager } from "../entity/entity-manager.js";
3
4
  import { getJoinTables, getTableNamesFromWhere } from "../utils/sql-parser.js";
4
5
  import { chunk } from "../utils/utils.js";
6
+ import { VectorSearch } from "../vector/vector-search.js";
5
7
  import { DB } from "./db.js";
6
8
  import { Puri } from "./puri.js";
7
9
  import { PuriWrapper } from "./puri-wrapper.js";
@@ -34,7 +36,83 @@ import { UpsertBuilder } from "./upsert-builder.js";
34
36
  const db = this.getDB(which);
35
37
  return new PuriWrapper(db, new UpsertBuilder());
36
38
  }
39
+ // VectorSearch 인스턴스 캐시
40
+ _vectorSearch = null;
41
+ /**
42
+ * 벡터 검색 인스턴스 반환
43
+ * - 기본 provider: voyage
44
+ * - 기본 dimensions: 1024 (DEFAULT_VECTOR_CONFIG 사용)
45
+ */ getVector() {
46
+ if (this._vectorSearch) {
47
+ return this._vectorSearch;
48
+ }
49
+ const entity = EntityManager.get(this.modelName);
50
+ this._vectorSearch = new VectorSearch(this.getDB("w"), entity.table);
51
+ return this._vectorSearch;
52
+ }
53
+ /**
54
+ * 벡터 검색 (코사인 유사도)
55
+ * @param query - 검색어
56
+ * @param options - 검색 옵션
57
+ */ async vectorSearch(query, options = {}) {
58
+ const entity = EntityManager.get(this.modelName);
59
+ const vectorProp = entity.getVectorColumn();
60
+ if (!vectorProp) {
61
+ throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
62
+ }
63
+ const vs = new VectorSearch(this.getDB("w"), entity.table);
64
+ return vs.search(query, options.provider ?? "voyage", {
65
+ ...options,
66
+ embeddingColumn: options.embeddingColumn ?? vectorProp.name
67
+ });
68
+ }
69
+ /**
70
+ * 하이브리드 검색 (Vector + FTS)
71
+ * @param query - 검색어
72
+ * @param options - 검색 옵션
73
+ */ async hybridSearch(query, options = {}) {
74
+ const entity = EntityManager.get(this.modelName);
75
+ const vectorProp = entity.getVectorColumn();
76
+ if (!vectorProp) {
77
+ throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
78
+ }
79
+ const vs = new VectorSearch(this.getDB("w"), entity.table);
80
+ return vs.hybridSearch(query, options.provider ?? "voyage", {
81
+ ...options,
82
+ embeddingColumn: options.embeddingColumn ?? vectorProp.name
83
+ });
84
+ }
85
+ /**
86
+ * 단일 레코드에 임베딩 저장
87
+ * @param id - 레코드 ID
88
+ * @param text - 임베딩할 텍스트
89
+ * @param options - provider, embeddingColumn 옵션
90
+ */ async saveEmbedding(id, text, options = {}) {
91
+ const entity = EntityManager.get(this.modelName);
92
+ const vectorProp = entity.getVectorColumn(options.embeddingColumn);
93
+ if (!vectorProp) {
94
+ throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
95
+ }
96
+ const { provider = "voyage" } = options;
97
+ const vs = this.getVector();
98
+ return vs.saveEmbedding(id, text, provider, vectorProp.name);
99
+ }
100
+ /**
101
+ * 여러 레코드에 임베딩 일괄 저장
102
+ * @param items - { id, text } 배열
103
+ * @param options - provider, embeddingColumn, onProgress 옵션
104
+ */ async saveEmbeddingsBatch(items, options = {}) {
105
+ const entity = EntityManager.get(this.modelName);
106
+ const vectorProp = entity.getVectorColumn(options.embeddingColumn);
107
+ if (!vectorProp) {
108
+ throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
109
+ }
110
+ const { provider = "voyage", onProgress } = options;
111
+ const vs = this.getVector();
112
+ return vs.saveEmbeddingsBatch(items, provider, vectorProp.name, onProgress);
113
+ }
37
114
  async destroy() {
115
+ this._vectorSearch = null;
38
116
  return DB.destroy();
39
117
  }
40
118
  async getInsertedIds(wdb, rows, tableName, unqKeyFields, chunkSize = 500) {
@@ -94,9 +172,6 @@ import { UpsertBuilder } from "./upsert-builder.js";
94
172
  if (!this.loaderQueries) {
95
173
  throw new Error("loaderQueries is not defined");
96
174
  }
97
- if (!queryParams.num || !queryParams.page) {
98
- throw new Error("num and page are required");
99
- }
100
175
  const { num, page } = queryParams;
101
176
  // COUNT 쿼리 실행
102
177
  const total = await this.executeCountQuery(qb, queryParams, debug, optimizeCountQuery);
@@ -148,7 +223,14 @@ import { UpsertBuilder } from "./upsert-builder.js";
148
223
  if (params.queryMode === "count") {
149
224
  return [];
150
225
  }
151
- let unloadedRows = await qb.limit(num).offset(num * (page - 1));
226
+ const limitedQb = (()=>{
227
+ if (num === 0) {
228
+ return qb;
229
+ } else {
230
+ return qb.limit(num).offset(num * (page - 1));
231
+ }
232
+ })();
233
+ let unloadedRows = await limitedQb;
152
234
  if (debug) {
153
235
  qb.debug();
154
236
  }
@@ -231,4 +313,4 @@ import { UpsertBuilder } from "./upsert-builder.js";
231
313
  }
232
314
  export const BaseModel = new BaseModelClass();
233
315
 
234
- //# 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+IG9taXQociwgW1wicmVmSWRcIl0pKTtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXQg66CI7L2U65Oc66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmYXG4gICAqXG4gICAqIC0gYHVzZXJfX25hbWVgIOKGkiBgeyB1c2VyOiB7IG5hbWUgfSB9YFxuICAgKiAtIG51bGxhYmxlIHJlbGF0aW9u7J2YIOqyveyasCBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7J6Q7LK066W8IG51bGzroZxcbiAgICovXG4gIGh5ZHJhdGU8VCBleHRlbmRzIFVua25vd25EQlJlY29yZD4ocm93czogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgLy8gbnVsbGFibGUgcmVsYXRpb24g7LKY66asOiDqt7jro7nsnZggaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyghOyytOulvCBudWxs66GcXG4gICAgICBjb25zdCBuZXN0ZWRLZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoKGtleSkgPT4ga2V5LmluY2x1ZGVzKFwiX19cIikpO1xuICAgICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0Lmdyb3VwQnkobmVzdGVkS2V5cywgKGtleSkgPT4ga2V5LnNwbGl0KFwiX19cIilbMF0pO1xuXG4gICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOyduCDqt7jro7kg7LC+6riwICjsmIg6IHBhcmVudF9faWTqsIAgbnVsbOydtOuptCBwYXJlbnQg6re466O5IOyghOyytOqwgCBudWxsKVxuICAgICAgY29uc3QgbnVsbEtleXMgPSBPYmplY3QuZW50cmllcyhncm91cHMpXG4gICAgICAgIC5maWx0ZXIoKFtncm91cEtleSwgZmllbGRzXSkgPT4ge1xuICAgICAgICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgIC8vIOq3uOujueydmCBpZCDtlYTrk5wg7LC+6riwICjsmIg6IFwicGFyZW50X19pZFwiKVxuICAgICAgICAgIGNvbnN0IGlkRmllbGQgPSBgJHtncm91cEtleX1fX2lkYDtcbiAgICAgICAgICBpZiAoaWRGaWVsZCBpbiByb3cpIHtcbiAgICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTqsIAgbnVsbFxuICAgICAgICAgICAgcmV0dXJuIHJvd1tpZEZpZWxkXSA9PT0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAg7JeG7Jy866m0IOq4sOyhtCDroZzsp4E6IOuqqOuToCDtlYTrk5zqsIAgbnVsbOyduOyngCDtmZXsnbhcbiAgICAgICAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KFxuICAgICAgICAgICAgKGZpZWxkKSA9PlxuICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcblxuICAgICAgY29uc3QgaHlkcmF0ZWQgPSBPYmplY3Qua2V5cyhyb3cpLnJlZHVjZSgociwgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgICAgLy8g7J2867CYIO2VhOuTnDog67Cw7Je0IOuCtCDqsJ3ssrTrqbQg7J6s6reAIGh5ZHJhdGVcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKSkge1xuICAgICAgICAgICAgcltmaWVsZF0gPSB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gcm93W2ZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDspJHssqkg7ZWE65OcIOyymOumrDogdXNlcl9fbmFtZSDihpIgdXNlcltuYW1lXVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpZWxkLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGNvbnN0IG9ialBhdGggPVxuICAgICAgICAgIHBhcnRzWzBdICtcbiAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBgWyR7cGFydH1dYClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICAgIHIgPSBzZXQoXG4gICAgICAgICAgcixcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIHJvd1tmaWVsZF0gJiYgQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSlcbiAgICAgICAgICAgIDogcm93W2ZpZWxkXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sIHt9IGFzIFVua25vd25EQlJlY29yZCk7XG5cbiAgICAgIC8vIG51bGwgcmVsYXRpb24g7LKY66asXG4gICAgICBudWxsS2V5cy5mb3JFYWNoKChudWxsS2V5KSA9PiB7XG4gICAgICAgIGh5ZHJhdGVkW251bGxLZXldID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgfSkgYXMgVFtdO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgOiB7IGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibmFtZXMiOlsiZ3JvdXAiLCJpc09iamVjdCIsIm9taXQiLCJzZXQiLCJTb25hbXUiLCJnZXRKb2luVGFibGVzIiwiZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSIsImNodW5rIiwiREIiLCJQdXJpIiwiUHVyaVdyYXBwZXIiLCJVcHNlcnRCdWlsZGVyIiwiQmFzZU1vZGVsQ2xhc3MiLCJtb2RlbE5hbWUiLCJzdWJzZXRRdWVyaWVzIiwibG9hZGVyUXVlcmllcyIsImdldERCIiwid2hpY2giLCJnZXRQdXJpIiwidHJ4IiwiZ2V0VHJhbnNhY3Rpb25Db250ZXh0IiwiZ2V0VHJhbnNhY3Rpb24iLCJkYiIsImRlc3Ryb3kiLCJnZXRJbnNlcnRlZElkcyIsIndkYiIsInJvd3MiLCJ0YWJsZU5hbWUiLCJ1bnFLZXlGaWVsZHMiLCJjaHVua1NpemUiLCJ1bnFLZXlzIiwid2hlcmVJbkZpZWxkIiwic2VsZWN0RmllbGQiLCJsZW5ndGgiLCJyYXciLCJqb2luIiwibWFwIiwicm93IiwiZmllbGQiLCJyZXN1bHRJZHMiLCJpdGVtcyIsImRiUm93cyIsInNlbGVjdCIsIndoZXJlSW4iLCJjb25jYXQiLCJkYlJvdyIsInBhcnNlSW50IiwiU3RyaW5nIiwiaWQiLCJnZXRTdWJzZXRRdWVyaWVzIiwic3Vic2V0IiwiRXJyb3IiLCJwdXJpV3JhcHBlciIsInFiIiwib25TdWJzZXQiLCJfc3Vic2V0IiwiY3JlYXRlRW5oYW5jZXJzIiwiZW5oYW5jZXJzIiwiZXhlY3V0ZVN1YnNldFF1ZXJ5IiwicGFyYW1zIiwicXVlcnlQYXJhbXMiLCJkZWJ1ZyIsIm9wdGltaXplQ291bnRRdWVyeSIsIm51bSIsInBhZ2UiLCJ0b3RhbCIsImV4ZWN1dGVDb3VudFF1ZXJ5IiwiY29tcHV0ZWRSb3dzIiwiZXhlY3V0ZUxpc3RRdWVyeSIsImVuaGFuY2VyIiwiUHJvbWlzZSIsImFsbCIsInF1ZXJ5TW9kZSIsImNvdW50UHVyaSIsImNsb25lIiwiY2xlYXIiLCJkZWZhdWx0IiwiU3FsUGFyc2VyIiwicGFyc2VyIiwiUGFyc2VyIiwicGFyc2VkUXVlcnkiLCJhc3RpZnkiLCJ0b1F1ZXJ5IiwiZGF0YWJhc2UiLCJjb25maWciLCJsZWZ0Sm9pblRhYmxlcyIsIndoZXJlVGFibGVzIiwidGFibGVzVG9SZW1vdmUiLCJmaWx0ZXIiLCJqIiwiaW5jbHVkZXMiLCJmb3JFYWNoIiwidGFibGUiLCJjbGVhckpvaW4iLCJjb3VudFJlc3VsdCIsInJhd051bWJlciIsImZpcnN0IiwidW5sb2FkZWRSb3dzIiwibGltaXQiLCJvZmZzZXQiLCJsb2FkZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJvY2Vzc0xvYWRlcnMiLCJoeWRyYXRlIiwicmVzb2x2ZUxvYWRlciIsImFzIiwicmVmSWQiLCJyZXNvbHZlTG9hZGVyUWJGbiIsIm5lc3RlZExvYWRlcnMiLCJyZXNvbHZlTG9hZGVyUWIiLCJsb2FkZWRSb3dzIiwic3ViUm93R3JvdXBzIiwiciIsIm5lc3RlZEtleXMiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiZ3JvdXBzIiwiZ3JvdXBCeSIsInNwbGl0IiwibnVsbEtleXMiLCJlbnRyaWVzIiwiZ3JvdXBLZXkiLCJmaWVsZHMiLCJpZEZpZWxkIiwiZXZlcnkiLCJoeWRyYXRlZCIsInJlZHVjZSIsInBhcnRzIiwib2JqUGF0aCIsInNsaWNlIiwicGFydCIsIm51bGxLZXkiLCJCYXNlTW9kZWwiXSwibWFwcGluZ3MiOiJBQUFBLGtHQUFrRyxHQUdsRyxTQUFTQSxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsSUFBSSxFQUFFQyxHQUFHLFFBQVEsVUFBVTtBQUNyRCxTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFFaEMsU0FBU0MsYUFBYSxFQUFFQyxzQkFBc0IsUUFBUSx5QkFBc0I7QUFDNUUsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQVF2QyxTQUFTQyxFQUFFLFFBQVEsVUFBTztBQUMxQixTQUFTQyxJQUFJLFFBQVEsWUFBUztBQUU5QixTQUFTQyxXQUFXLFFBQVEsb0JBQWlCO0FBQzdDLFNBQVNDLGFBQWEsUUFBUSxzQkFBbUI7QUFJakQ7Ozs7Ozs7Q0FPQyxHQUNELE9BQU8sTUFBTUM7OztJQU1KQyxZQUFvQixVQUFVO0lBRXJDLFlBQ0UsQUFBVUMsYUFBOEIsRUFDeEMsQUFBVUMsYUFBOEIsQ0FDeEM7YUFGVUQsZ0JBQUFBO2FBQ0FDLGdCQUFBQTtJQUNUO0lBRUhDLE1BQU1DLEtBQWUsRUFBUTtRQUMzQixPQUFPVCxHQUFHUSxLQUFLLENBQUNDO0lBQ2xCO0lBRUFDLFFBQVFELEtBQWUsRUFBZTtRQUNwQyxzQkFBc0I7UUFDdEIsTUFBTUUsTUFBTVgsR0FBR1kscUJBQXFCLEdBQUdDLGNBQWMsQ0FBQ0o7UUFDdEQsSUFBSUUsS0FBSztZQUNQLE9BQU9BO1FBQ1Q7UUFFQSwrQkFBK0I7UUFDL0IsTUFBTUcsS0FBSyxJQUFJLENBQUNOLEtBQUssQ0FBQ0M7UUFDdEIsT0FBTyxJQUFJUCxZQUFZWSxJQUFJLElBQUlYO0lBQ2pDO0lBRUEsTUFBTVksVUFBVTtRQUNkLE9BQU9mLEdBQUdlLE9BQU87SUFDbkI7SUFFQSxNQUFNQyxlQUNKQyxHQUFTLEVBQ1RDLElBQXVCLEVBQ3ZCQyxTQUFp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
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp7J2YIO2DgOyeheydgCDqsJzrs4Qg66qo64247JeQ7IScIO2ZleygleuQmOuvgOuhnCBCYXNlTW9kZWzsl5DshJzripQgYW5566W8IO2XiOyaqe2VqCAqL1xuXG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgZ3JvdXAsIGlzT2JqZWN0LCBvbWl0LCBzZXQgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VTY2hlbWFFeHRlbmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGdldEpvaW5UYWJsZXMsIGdldFRhYmxlTmFtZXNGcm9tV2hlcmUgfSBmcm9tIFwiLi4vdXRpbHMvc3FsLXBhcnNlclwiO1xuaW1wb3J0IHsgY2h1bmsgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW1iZWRkaW5nSXRlbSxcbiAgRW1iZWRkaW5nUHJvdmlkZXIsXG4gIEh5YnJpZFNlYXJjaE9wdGlvbnMsXG4gIEh5YnJpZFNlYXJjaFJlc3VsdCxcbiAgUHJvZ3Jlc3NDYWxsYmFjayxcbiAgVmVjdG9yU2VhcmNoT3B0aW9ucyxcbiAgVmVjdG9yU2VhcmNoUmVzdWx0LFxufSBmcm9tIFwiLi4vdmVjdG9yL3R5cGVzXCI7XG5pbXBvcnQgeyBWZWN0b3JTZWFyY2ggfSBmcm9tIFwiLi4vdmVjdG9yL3ZlY3Rvci1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW5oYW5jZXJNYXAsXG4gIEV4ZWN1dGVTdWJzZXRRdWVyeVJlc3VsdCxcbiAgUmVzb2x2ZVN1YnNldEludGVyc2VjdGlvbixcbiAgVW5pb25FeHRyYWN0ZWRUVGFibGVzLFxufSBmcm9tIFwiLi9iYXNlLW1vZGVsLnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IERCUHJlc2V0IH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IEluZmVyQWxsU3Vic2V0cywgUHVyaUxvYWRlclF1ZXJpZXMsIFB1cmlTdWJzZXRGbiB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHsgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuL3Vwc2VydC1idWlsZGVyXCI7XG5cbnR5cGUgVW5rbm93bkRCUmVjb3JkID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICog66qo65OgIE1vZGVsIO2BtOuemOyKpOydmCDquLDrs7gg7YG0656Y7IqkXG4gKlxuICogQHRlbXBsYXRlIFRTdWJzZXRLZXkgLSDshJzruIzshYsg7YKkIOycoOuLiOyYqCAo7JiIOiBcIkFcIiB8IFwiUFwiIHwgXCJTU1wiKVxuICogQHRlbXBsYXRlIFRTdWJzZXRNYXBwaW5nIC0g7ISc67iM7IWL67OEIOy1nOyihSDqsrDqs7wg7YOA7J6FIOunpO2VkVxuICogQHRlbXBsYXRlIFRTdWJzZXRRdWVyaWVzIC0g7ISc67iM7IWLIOy/vOumrCDtlajsiJgg6rCd7LK0XG4gKiBAdGVtcGxhdGUgVExvYWRlclF1ZXJpZXMgLSDshJzruIzshYvrs4Qg66Gc642UIOy/vOumrCDrsLDsl7Qg6rCd7LK0XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlTW9kZWxDbGFzczxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyA9IG5ldmVyLFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPiA9IG5ldmVyLFxuICBUTG9hZGVyUXVlcmllcyBleHRlbmRzIFB1cmlMb2FkZXJRdWVyaWVzPFRTdWJzZXRLZXk+ID0gbmV2ZXIsXG4+IHtcbiAgcHVibGljIG1vZGVsTmFtZTogc3RyaW5nID0gXCJVbmtub3duXCI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHN1YnNldFF1ZXJpZXM/OiBUU3Vic2V0UXVlcmllcyxcbiAgICBwcm90ZWN0ZWQgbG9hZGVyUXVlcmllcz86IFRMb2FkZXJRdWVyaWVzLFxuICApIHt9XG5cbiAgZ2V0REIod2hpY2g6IERCUHJlc2V0KTogS25leCB7XG4gICAgcmV0dXJuIERCLmdldERCKHdoaWNoKTtcbiAgfVxuXG4gIGdldFB1cmkod2hpY2g6IERCUHJlc2V0KTogUHVyaVdyYXBwZXIge1xuICAgIC8vIO2KuOuenOyereyFmCDsu6jthY3siqTtirjsl5DshJwg7Yq4656c7J6t7IWYIO2ajeuTnVxuICAgIGNvbnN0IHRyeCA9IERCLmdldFRyYW5zYWN0aW9uQ29udGV4dCgpLmdldFRyYW5zYWN0aW9uKHdoaWNoKTtcbiAgICBpZiAodHJ4KSB7XG4gICAgICByZXR1cm4gdHJ4O1xuICAgIH1cblxuICAgIC8vIO2KuOuenOyereyFmOydtCDsl4bsnLzrqbQg7IOI66Gc7Jq0IFB1cmlXcmFwcGVyIOuwmO2ZmFxuICAgIGNvbnN0IGRiID0gdGhpcy5nZXREQih3aGljaCk7XG4gICAgcmV0dXJuIG5ldyBQdXJpV3JhcHBlcihkYiwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gIH1cblxuICAvLyBWZWN0b3JTZWFyY2gg7J247Iqk7YS07IqkIOy6kOyLnFxuICBwcml2YXRlIF92ZWN0b3JTZWFyY2g6IFZlY3RvclNlYXJjaDxhbnk+IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIOuyoe2EsCDqsoDsg4kg7J247Iqk7YS07IqkIOuwmO2ZmFxuICAgKiAtIOq4sOuzuCBwcm92aWRlcjogdm95YWdlXG4gICAqIC0g6riw67O4IGRpbWVuc2lvbnM6IDEwMjQgKERFRkFVTFRfVkVDVE9SX0NPTkZJRyDsgqzsmqkpXG4gICAqL1xuICBnZXRWZWN0b3I8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBWZWN0b3JTZWFyY2g8VD4ge1xuICAgIGlmICh0aGlzLl92ZWN0b3JTZWFyY2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl92ZWN0b3JTZWFyY2ggYXMgVmVjdG9yU2VhcmNoPFQ+O1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMubW9kZWxOYW1lKTtcblxuICAgIHRoaXMuX3ZlY3RvclNlYXJjaCA9IG5ldyBWZWN0b3JTZWFyY2g8VD4odGhpcy5nZXREQihcIndcIiksIGVudGl0eS50YWJsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5fdmVjdG9yU2VhcmNoIGFzIFZlY3RvclNlYXJjaDxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLAg6rKA7IOJICjsvZTsgqzsnbgg7Jyg7IKs64+EKVxuICAgKiBAcGFyYW0gcXVlcnkgLSDqsoDsg4nslrRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDqsoDsg4kg7Ji17IWYXG4gICAqL1xuICBhc3luYyB2ZWN0b3JTZWFyY2g8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFZlY3RvclNlYXJjaE9wdGlvbnMgJiB7IHByb3ZpZGVyPzogRW1iZWRkaW5nUHJvdmlkZXIgfSA9IHt9LFxuICApOiBQcm9taXNlPFZlY3RvclNlYXJjaFJlc3VsdDxUPltdPiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQodGhpcy5tb2RlbE5hbWUpO1xuICAgIGNvbnN0IHZlY3RvclByb3AgPSBlbnRpdHkuZ2V0VmVjdG9yQ29sdW1uKCk7XG4gICAgaWYgKCF2ZWN0b3JQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5tb2RlbE5hbWV9IEVudGl0eeyXkCB2ZWN0b3Ig7Lus65+87J20IOygleydmOuQmOyngCDslYrslZjsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdnMgPSBuZXcgVmVjdG9yU2VhcmNoPFQ+KHRoaXMuZ2V0REIoXCJ3XCIpLCBlbnRpdHkudGFibGUpO1xuICAgIHJldHVybiB2cy5zZWFyY2gocXVlcnksIG9wdGlvbnMucHJvdmlkZXIgPz8gXCJ2b3lhZ2VcIiwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGVtYmVkZGluZ0NvbHVtbjogb3B0aW9ucy5lbWJlZGRpbmdDb2x1bW4gPz8gdmVjdG9yUHJvcC5uYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOydtOu4jOumrOuTnCDqsoDsg4kgKFZlY3RvciArIEZUUylcbiAgICogQHBhcmFtIHF1ZXJ5IC0g6rKA7IOJ7Ja0XG4gICAqIEBwYXJhbSBvcHRpb25zIC0g6rKA7IOJIOyYteyFmFxuICAgKi9cbiAgYXN5bmMgaHlicmlkU2VhcmNoPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBIeWJyaWRTZWFyY2hPcHRpb25zICYgeyBwcm92aWRlcj86IEVtYmVkZGluZ1Byb3ZpZGVyIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxIeWJyaWRTZWFyY2hSZXN1bHQ8VD5bXT4ge1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMubW9kZWxOYW1lKTtcbiAgICBjb25zdCB2ZWN0b3JQcm9wID0gZW50aXR5LmdldFZlY3RvckNvbHVtbigpO1xuICAgIGlmICghdmVjdG9yUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubW9kZWxOYW1lfSBFbnRpdHnsl5AgdmVjdG9yIOy7rOufvOydtCDsoJXsnZjrkJjsp4Ag7JWK7JWY7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHZzID0gbmV3IFZlY3RvclNlYXJjaDxUPih0aGlzLmdldERCKFwid1wiKSwgZW50aXR5LnRhYmxlKTtcbiAgICByZXR1cm4gdnMuaHlicmlkU2VhcmNoKHF1ZXJ5LCBvcHRpb25zLnByb3ZpZGVyID8/IFwidm95YWdlXCIsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBlbWJlZGRpbmdDb2x1bW46IG9wdGlvbnMuZW1iZWRkaW5nQ29sdW1uID8/IHZlY3RvclByb3AubmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg66CI7L2U65Oc7JeQIOyehOuyoOuUqSDsoIDsnqVcbiAgICogQHBhcmFtIGlkIC0g66CI7L2U65OcIElEXG4gICAqIEBwYXJhbSB0ZXh0IC0g7J6E67Kg65Sp7ZWgIO2FjeyKpO2KuFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIHByb3ZpZGVyLCBlbWJlZGRpbmdDb2x1bW4g7Ji17IWYXG4gICAqL1xuICBhc3luYyBzYXZlRW1iZWRkaW5nKFxuICAgIGlkOiBudW1iZXIsXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgcHJvdmlkZXI/OiBFbWJlZGRpbmdQcm92aWRlcjsgZW1iZWRkaW5nQ29sdW1uPzogc3RyaW5nIH0gPSB7fSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQodGhpcy5tb2RlbE5hbWUpO1xuICAgIGNvbnN0IHZlY3RvclByb3AgPSBlbnRpdHkuZ2V0VmVjdG9yQ29sdW1uKG9wdGlvbnMuZW1iZWRkaW5nQ29sdW1uKTtcbiAgICBpZiAoIXZlY3RvclByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsTmFtZX0gRW50aXR57JeQIHZlY3RvciDsu6zrn7zsnbQg7KCV7J2Y65CY7KeAIOyViuyVmOyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHByb3ZpZGVyID0gXCJ2b3lhZ2VcIiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB2cyA9IHRoaXMuZ2V0VmVjdG9yKCk7XG4gICAgcmV0dXJuIHZzLnNhdmVFbWJlZGRpbmcoaWQsIHRleHQsIHByb3ZpZGVyLCB2ZWN0b3JQcm9wLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXrOufrCDroIjsvZTrk5zsl5Ag7J6E67Kg65SpIOydvOq0hCDsoIDsnqVcbiAgICogQHBhcmFtIGl0ZW1zIC0geyBpZCwgdGV4dCB9IOuwsOyXtFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIHByb3ZpZGVyLCBlbWJlZGRpbmdDb2x1bW4sIG9uUHJvZ3Jlc3Mg7Ji17IWYXG4gICAqL1xuICBhc3luYyBzYXZlRW1iZWRkaW5nc0JhdGNoKFxuICAgIGl0ZW1zOiBFbWJlZGRpbmdJdGVtW10sXG4gICAgb3B0aW9uczoge1xuICAgICAgcHJvdmlkZXI/OiBFbWJlZGRpbmdQcm92aWRlcjtcbiAgICAgIGVtYmVkZGluZ0NvbHVtbj86IHN0cmluZztcbiAgICAgIG9uUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIH0gPSB7fSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQodGhpcy5tb2RlbE5hbWUpO1xuICAgIGNvbnN0IHZlY3RvclByb3AgPSBlbnRpdHkuZ2V0VmVjdG9yQ29sdW1uKG9wdGlvbnMuZW1iZWRkaW5nQ29sdW1uKTtcbiAgICBpZiAoIXZlY3RvclByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsTmFtZX0gRW50aXR57JeQIHZlY3RvciDsu6zrn7zsnbQg7KCV7J2Y65CY7KeAIOyViuyVmOyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHByb3ZpZGVyID0gXCJ2b3lhZ2VcIiwgb25Qcm9ncmVzcyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB2cyA9IHRoaXMuZ2V0VmVjdG9yKCk7XG4gICAgcmV0dXJuIHZzLnNhdmVFbWJlZGRpbmdzQmF0Y2goaXRlbXMsIHByb3ZpZGVyLCB2ZWN0b3JQcm9wLm5hbWUsIG9uUHJvZ3Jlc3MpO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICB0aGlzLl92ZWN0b3JTZWFyY2ggPSBudWxsO1xuICAgIHJldHVybiBEQi5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRJbnNlcnRlZElkcyhcbiAgICB3ZGI6IEtuZXgsXG4gICAgcm93czogVW5rbm93bkRCUmVjb3JkW10sXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgdW5xS2V5RmllbGRzOiBzdHJpbmdbXSxcbiAgICBjaHVua1NpemU6IG51bWJlciA9IDUwMCxcbiAgKSB7XG4gICAgaWYgKCF3ZGIpIHtcbiAgICAgIHdkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIH1cblxuICAgIGxldCB1bnFLZXlzOiBzdHJpbmdbXTtcbiAgICBsZXQgd2hlcmVJbkZpZWxkOiBzdHJpbmcgfCBLbmV4LlJhdztcbiAgICBsZXQgc2VsZWN0RmllbGQ6IHN0cmluZztcblxuICAgIGlmICh1bnFLZXlGaWVsZHMubGVuZ3RoID4gMSkge1xuICAgICAgd2hlcmVJbkZpZWxkID0gd2RiLnJhdyhgQ09OQ0FUX1dTKCdfJywgJyR7dW5xS2V5RmllbGRzLmpvaW4oXCIsXCIpfScpYCk7XG4gICAgICBzZWxlY3RGaWVsZCA9IGAke3doZXJlSW5GaWVsZH0gYXMgdG1wVWlkYDtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiB1bnFLZXlGaWVsZHMubWFwKChmaWVsZCkgPT4gcm93W2ZpZWxkXSkuam9pbihcIl9cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB1bnFLZXlGaWVsZHNbMF07XG4gICAgICBzZWxlY3RGaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbdW5xS2V5RmllbGRzWzBdXSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRJZHM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtcyBvZiBjaHVuayh1bnFLZXlzLCBjaHVua1NpemUpKSB7XG4gICAgICBjb25zdCBkYlJvd3MgPSBhd2FpdCB3ZGIodGFibGVOYW1lKVxuICAgICAgICAuc2VsZWN0KFwiaWRcIiwgd2RiLnJhdyhzZWxlY3RGaWVsZCkpXG4gICAgICAgIC53aGVyZUluKHdoZXJlSW5GaWVsZCBhcyBzdHJpbmcsIGl0ZW1zKTtcbiAgICAgIHJlc3VsdElkcyA9IHJlc3VsdElkcy5jb25jYXQoXG4gICAgICAgIGRiUm93cy5tYXAoKGRiUm93OiBVbmtub3duREJSZWNvcmQpID0+IHBhcnNlSW50KFN0cmluZyhkYlJvdy5pZCkpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdElkcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUg7ISc67iM7IWL7JeQIOuMgO2VnCDsv7zrpqwg67mM642UIO2ajeuTnVxuICAgKlxuICAgKiBAcmV0dXJucyBxYiAtIOy/vOumrCDruYzrjZQgKOyhsOqxtCDstpTqsIDsmqkpXG4gICAqIEByZXR1cm5zIG9uU3Vic2V0IC0g7Yq57KCVIOyEnOu4jOyFiyDsoITsmqkg7YOA7J6F7J20IO2VhOyalO2VoCDrlYwg7IKs7JqpXG4gICAqL1xuICBnZXRTdWJzZXRRdWVyaWVzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihzdWJzZXQ6IFQpIHtcbiAgICBpZiAoIXRoaXMuc3Vic2V0UXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3Vic2V0UXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXJpV3JhcHBlciA9IG5ldyBQdXJpV3JhcHBlcih0aGlzLmdldERCKFwiclwiKSwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gICAgY29uc3QgcWIgPSB0aGlzLnN1YnNldFF1ZXJpZXNbc3Vic2V0XT8uKHB1cmlXcmFwcGVyKTtcblxuICAgIC8vIE5vbkFsbG93ZWRBc1NpbmdsZVRhYmxlOiDri6jsnbwg7YWM7J2067iUIOy7rOufvCDsoJHqt7wg67Cp7KeA7JqpIOuniOy7pFxuICAgIHR5cGUgUUJUYWJsZXMgPSBVbmlvbkV4dHJhY3RlZFRUYWJsZXM8VFN1YnNldEtleSwgVFN1YnNldFF1ZXJpZXM+ICYge1xuICAgICAgTm9uQWxsb3dlZEFzU2luZ2xlVGFibGU6IHsgX19mdWxsdGV4dF9fOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBxYjogcWIgYXMgdW5rbm93biBhcyBQdXJpPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBRQlRhYmxlcywge30+LFxuICAgICAgb25TdWJzZXQ6ICgoX3N1YnNldDogVFN1YnNldEtleSB8IHJlYWRvbmx5IFRTdWJzZXRLZXlbXSkgPT4gcWIpIGFzIHtcbiAgICAgICAgLy8g64uo7J28IO2CpFxuICAgICAgICA8UyBleHRlbmRzIFRTdWJzZXRLZXk+KHN1YnNldDogUyk6IFJldHVyblR5cGU8VFN1YnNldFF1ZXJpZXNbU10+O1xuICAgICAgICAvLyDtgqQg67Cw7Je0IC0+IOq1kOynke2VqSDrsJjtmZhcbiAgICAgICAgPEFyciBleHRlbmRzIHJlYWRvbmx5IFRTdWJzZXRLZXlbXT4oXG4gICAgICAgICAgc3Vic2V0czogWy4uLkFycl0sXG4gICAgICAgICk6IFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248QXJyLCBUU3Vic2V0UXVlcmllcz47XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZXIg6rCd7LK0IOyDneyEsSDtl6ztjbxcbiAgICog7YOA7J6FIOqygOymnSDrsI8g7LaU66Gg7J2EIOuPhOyZgOykjFxuICAgKi9cbiAgY3JlYXRlRW5oYW5jZXJzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFQsIEluZmVyQWxsU3Vic2V0czxUU3Vic2V0UXVlcmllcywgVExvYWRlclF1ZXJpZXM+LCBUU3Vic2V0TWFwcGluZz4sXG4gICkge1xuICAgIHJldHVybiBlbmhhbmNlcnM7XG4gIH1cblxuICAvKipcbiAgICog7ISc67iM7IWLIOy/vOumrCDsi6TtlolcbiAgICpcbiAgICogMS4g7L+866asIOyLpO2WiSAocGFnaW5hdGlvbiDsoIHsmqkpXG4gICAqIDIuIOuhnOuNlCDsi6TtlokgKDE6TiwgTjpNIOq0gOqzhCDrjbDsnbTthLAg66Gc65SpKVxuICAgKiAzLiBIeWRyYXRlIChmbGF0IOKGkiDspJHssqkg6rCd7LK0KVxuICAgKiA0LiBFbmhhbmNlciDsoIHsmqkgKHZpcnR1YWwg7ZWE65OcIOqzhOyCsClcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJzZXRRdWVyeTxcbiAgICBUIGV4dGVuZHMgVFN1YnNldEtleSxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sXG4gID4oXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJzZXQ6IFQ7XG4gICAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PjtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBudW06IG51bWJlcjtcbiAgICAgICAgcGFnZTogbnVtYmVyO1xuICAgICAgICBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiO1xuICAgICAgfTtcbiAgICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICAgIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG4gICAgfSAmIEVuaGFuY2VyUGFyYW08VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+LFxuICApOiBQcm9taXNlPEV4ZWN1dGVTdWJzZXRRdWVyeVJlc3VsdDxUU3Vic2V0TWFwcGluZywgVD4+IHtcbiAgICBjb25zdCB7IHN1YnNldCwgcWIsIHBhcmFtczogcXVlcnlQYXJhbXMsIGRlYnVnID0gZmFsc2UsIG9wdGltaXplQ291bnRRdWVyeSA9IGZhbHNlIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMubG9hZGVyUXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibG9hZGVyUXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG51bSwgcGFnZSB9ID0gcXVlcnlQYXJhbXM7XG5cbiAgICAvLyBDT1VOVCDsv7zrpqwg7Iuk7ZaJXG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVDb3VudFF1ZXJ5KHFiLCBxdWVyeVBhcmFtcywgZGVidWcsIG9wdGltaXplQ291bnRRdWVyeSk7XG5cbiAgICAvLyBMSVNUIOy/vOumrCDsi6TtlolcbiAgICBjb25zdCBjb21wdXRlZFJvd3MgPSBhd2FpdCB0aGlzLmV4ZWN1dGVMaXN0UXVlcnkoc3Vic2V0LCBxYiwgcXVlcnlQYXJhbXMsIG51bSwgcGFnZSwgZGVidWcpO1xuXG4gICAgLy8gRW5oYW5jZXIg7KCB7JqpXG4gICAgY29uc3QgZW5oYW5jZXIgPSAocGFyYW1zIGFzIGFueSkuZW5oYW5jZXJzPy5bc3Vic2V0XTtcbiAgICBjb25zdCByb3dzID0gKGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29tcHV0ZWRSb3dzLm1hcCgocm93KSA9PiBlbmhhbmNlcj8uKHJvdykgPz8gcm93KSxcbiAgICApKSBhcyBUU3Vic2V0TWFwcGluZ1tUXVtdO1xuXG4gICAgcmV0dXJuIHsgcm93cywgdG90YWwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDT1VOVCDsv7zrpqwg7Iuk7ZaJICjrgrTrtoAg66mU7ISc65OcKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQ291bnRRdWVyeShcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIG9wdGltaXplQ291bnRRdWVyeTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJsaXN0XCIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50UHVyaSA9IHFiLmNsb25lKCkuY2xlYXIoXCJvcmRlclwiKS5jbGVhcihcImxpbWl0XCIpLmNsZWFyKFwib2Zmc2V0XCIpO1xuXG4gICAgaWYgKG9wdGltaXplQ291bnRRdWVyeSkge1xuICAgICAgY29uc3QgeyBkZWZhdWx0OiBTcWxQYXJzZXIgfSA9IGF3YWl0IGltcG9ydChcIm5vZGUtc3FsLXBhcnNlclwiKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBTcWxQYXJzZXIuUGFyc2VyKCk7XG4gICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHBhcnNlci5hc3RpZnkoY291bnRQdXJpLnRvUXVlcnkoKSwge1xuICAgICAgICBkYXRhYmFzZTogU29uYW11LmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBsZWZ0Sm9pblRhYmxlcyA9IGdldEpvaW5UYWJsZXMocGFyc2VkUXVlcnksIFtcIkxFRlQgSk9JTlwiXSk7XG4gICAgICBjb25zdCB3aGVyZVRhYmxlcyA9IGdldFRhYmxlTmFtZXNGcm9tV2hlcmUocGFyc2VkUXVlcnkpO1xuXG4gICAgICBjb25zdCB0YWJsZXNUb1JlbW92ZSA9IGxlZnRKb2luVGFibGVzLmZpbHRlcigoaikgPT4gIXdoZXJlVGFibGVzLmluY2x1ZGVzKGopKTtcbiAgICAgIHRhYmxlc1RvUmVtb3ZlLmZvckVhY2goKHRhYmxlKSA9PiB7XG4gICAgICAgIGNvdW50UHVyaS5jbGVhckpvaW4odGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ09VTlQoKinroZwg7KCE7LK0IOugiOy9lOuTnCDsiJjrpbwg6rOE7IKwXG4gICAgLy8gVE9ETzogcWLsnZggRElTVElOQ1TqsIAg7J6I64qUIOqyveyasCDsspjrpqztlbTslbwg7ZWoXG4gICAgY29uc3QgY291bnRSZXN1bHQ6IHsgdG90YWw/OiBudW1iZXIgfSA9IGF3YWl0IGNvdW50UHVyaVxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAuc2VsZWN0KHsgdG90YWw6IFB1cmkucmF3TnVtYmVyKGBDT1VOVCgqKTo6aW50ZWdlcmApIH0pXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY291bnRQdXJpLmRlYnVnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50UmVzdWx0Py50b3RhbCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIExJU1Qg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUxpc3RRdWVyeTxUIGV4dGVuZHMgVFN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIHBhcmFtczogeyBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiIH0sXG4gICAgbnVtOiBudW1iZXIsXG4gICAgcGFnZTogbnVtYmVyLFxuICAgIGRlYnVnOiBib29sZWFuLFxuICApOiBQcm9taXNlPGFueVtdPiB7XG4gICAgaWYgKHBhcmFtcy5xdWVyeU1vZGUgPT09IFwiY291bnRcIikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbWl0ZWRRYiA9ICgoKSA9PiB7XG4gICAgICBpZiAobnVtID09PSAwKSB7XG4gICAgICAgIHJldHVybiBxYjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxYi5saW1pdChudW0pLm9mZnNldChudW0gKiAocGFnZSAtIDEpKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGxldCB1bmxvYWRlZFJvd3MgPSAoYXdhaXQgbGltaXRlZFFiKSBhcyBhbnlbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgcWIuZGVidWcoKTtcbiAgICB9XG5cbiAgICAvLyDroZzrjZQg7LKY66asXG4gICAgY29uc3QgbG9hZGVycyA9ICh0aGlzLmxvYWRlclF1ZXJpZXMgYXMgYW55KVtzdWJzZXRdO1xuICAgIGlmIChsb2FkZXJzICYmIEFycmF5LmlzQXJyYXkobG9hZGVycykpIHtcbiAgICAgIHVubG9hZGVkUm93cyA9IGF3YWl0IHRoaXMucHJvY2Vzc0xvYWRlcnModW5sb2FkZWRSb3dzLCBsb2FkZXJzLCBkZWJ1Zyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKHJvd3M6IGFueVtdLCBsb2FkZXJzOiBhbnlbXSwgZGVidWc6IGJvb2xlYW4pOiBQcm9taXNlPGFueVtdPiB7XG4gICAgZm9yIChjb25zdCByZXNvbHZlTG9hZGVyIG9mIGxvYWRlcnMpIHtcbiAgICAgIGNvbnN0IHsgYXMsIHJlZklkLCBxYjogcmVzb2x2ZUxvYWRlclFiRm4sIGxvYWRlcnM6IG5lc3RlZExvYWRlcnMgfSA9IHJlc29sdmVMb2FkZXI7XG5cbiAgICAgIGNvbnN0IHJlc29sdmVMb2FkZXJRYiA9IHJlc29sdmVMb2FkZXJRYkZuKFxuICAgICAgICBuZXcgUHVyaVdyYXBwZXIodGhpcy5nZXREQihcInJcIiksIG5ldyBVcHNlcnRCdWlsZGVyKCkpLFxuICAgICAgICByb3dzLm1hcCgocm93KSA9PiByb3dbcmVmSWRdKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICByZXNvbHZlTG9hZGVyUWIuZGVidWcoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGxvYWRlZFJvd3MgPSAoYXdhaXQgcmVzb2x2ZUxvYWRlclFiKSBhcyBhbnlbXTtcblxuICAgICAgLy8g7KSR7LKpIGxvYWRlcnPqsIAg7J6I7Jy866m0IOyerOq3gCDsspjrpqxcbiAgICAgIGlmIChuZXN0ZWRMb2FkZXJzICYmIG5lc3RlZExvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyhsb2FkZWRSb3dzLCBuZXN0ZWRMb2FkZXJzLCBkZWJ1Zyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKGxvYWRlZFJvd3MsIChyb3cpID0+IHJvdy5yZWZJZCk7XG5cbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1thc10gPSAoc3ViUm93R3JvdXBzW3Jvd1tyZWZJZF1dID8/IFtdKS5tYXAoKHIpID0+IG9taXQociwgW1wicmVmSWRcIl0pKTtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXQg66CI7L2U65Oc66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmYXG4gICAqXG4gICAqIC0gYHVzZXJfX25hbWVgIOKGkiBgeyB1c2VyOiB7IG5hbWUgfSB9YFxuICAgKiAtIG51bGxhYmxlIHJlbGF0aW9u7J2YIOqyveyasCBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7J6Q7LK066W8IG51bGzroZxcbiAgICovXG4gIGh5ZHJhdGU8VCBleHRlbmRzIFVua25vd25EQlJlY29yZD4ocm93czogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgLy8gbnVsbGFibGUgcmVsYXRpb24g7LKY66asOiDqt7jro7nsnZggaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyghOyytOulvCBudWxs66GcXG4gICAgICBjb25zdCBuZXN0ZWRLZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoKGtleSkgPT4ga2V5LmluY2x1ZGVzKFwiX19cIikpO1xuICAgICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0Lmdyb3VwQnkobmVzdGVkS2V5cywgKGtleSkgPT4ga2V5LnNwbGl0KFwiX19cIilbMF0pO1xuXG4gICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOyduCDqt7jro7kg7LC+6riwICjsmIg6IHBhcmVudF9faWTqsIAgbnVsbOydtOuptCBwYXJlbnQg6re466O5IOyghOyytOqwgCBudWxsKVxuICAgICAgY29uc3QgbnVsbEtleXMgPSBPYmplY3QuZW50cmllcyhncm91cHMpXG4gICAgICAgIC5maWx0ZXIoKFtncm91cEtleSwgZmllbGRzXSkgPT4ge1xuICAgICAgICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgIC8vIOq3uOujueydmCBpZCDtlYTrk5wg7LC+6riwICjsmIg6IFwicGFyZW50X19pZFwiKVxuICAgICAgICAgIGNvbnN0IGlkRmllbGQgPSBgJHtncm91cEtleX1fX2lkYDtcbiAgICAgICAgICBpZiAoaWRGaWVsZCBpbiByb3cpIHtcbiAgICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTqsIAgbnVsbFxuICAgICAgICAgICAgcmV0dXJuIHJvd1tpZEZpZWxkXSA9PT0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAg7JeG7Jy866m0IOq4sOyhtCDroZzsp4E6IOuqqOuToCDtlYTrk5zqsIAgbnVsbOyduOyngCDtmZXsnbhcbiAgICAgICAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KFxuICAgICAgICAgICAgKGZpZWxkKSA9PlxuICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcblxuICAgICAgY29uc3QgaHlkcmF0ZWQgPSBPYmplY3Qua2V5cyhyb3cpLnJlZHVjZSgociwgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgICAgLy8g7J2867CYIO2VhOuTnDog67Cw7Je0IOuCtCDqsJ3ssrTrqbQg7J6s6reAIGh5ZHJhdGVcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKSkge1xuICAgICAgICAgICAgcltmaWVsZF0gPSB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gcm93W2ZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDspJHssqkg7ZWE65OcIOyymOumrDogdXNlcl9fbmFtZSDihpIgdXNlcltuYW1lXVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpZWxkLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGNvbnN0IG9ialBhdGggPVxuICAgICAgICAgIHBhcnRzWzBdICtcbiAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBgWyR7cGFydH1dYClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICAgIHIgPSBzZXQoXG4gICAgICAgICAgcixcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIHJvd1tmaWVsZF0gJiYgQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSlcbiAgICAgICAgICAgIDogcm93W2ZpZWxkXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sIHt9IGFzIFVua25vd25EQlJlY29yZCk7XG5cbiAgICAgIC8vIG51bGwgcmVsYXRpb24g7LKY66asXG4gICAgICBudWxsS2V5cy5mb3JFYWNoKChudWxsS2V5KSA9PiB7XG4gICAgICAgIGh5ZHJhdGVkW251bGxLZXldID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgfSkgYXMgVFtdO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgOiB7IGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibmFtZXMiOlsiZ3JvdXAiLCJpc09iamVjdCIsIm9taXQiLCJzZXQiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiZ2V0Sm9pblRhYmxlcyIsImdldFRhYmxlTmFtZXNGcm9tV2hlcmUiLCJjaHVuayIsIlZlY3RvclNlYXJjaCIsIkRCIiwiUHVyaSIsIlB1cmlXcmFwcGVyIiwiVXBzZXJ0QnVpbGRlciIsIkJhc2VNb2RlbENsYXNzIiwibW9kZWxOYW1lIiwic3Vic2V0UXVlcmllcyIsImxvYWRlclF1ZXJpZXMiLCJnZXREQiIsIndoaWNoIiwiZ2V0UHVyaSIsInRyeCIsImdldFRyYW5zYWN0aW9uQ29udGV4dCIsImdldFRyYW5zYWN0aW9uIiwiZGIiLCJfdmVjdG9yU2VhcmNoIiwiZ2V0VmVjdG9yIiwiZW50aXR5IiwiZ2V0IiwidGFibGUiLCJ2ZWN0b3JTZWFyY2giLCJxdWVyeSIsIm9wdGlvbnMiLCJ2ZWN0b3JQcm9wIiwiZ2V0VmVjdG9yQ29sdW1uIiwiRXJyb3IiLCJ2cyIsInNlYXJjaCIsInByb3ZpZGVyIiwiZW1iZWRkaW5nQ29sdW1uIiwibmFtZSIsImh5YnJpZFNlYXJjaCIsInNhdmVFbWJlZGRpbmciLCJpZCIsInRleHQiLCJzYXZlRW1iZWRkaW5nc0JhdGNoIiwiaXRlbXMiLCJvblByb2dyZXNzIiwiZGVzdHJveSIsImdldEluc2VydGVkSWRzIiwid2RiIiwicm93cyIsInRhYmxlTmFtZSIsInVucUtleUZpZWxkcyIsImNodW5rU2l6ZSIsInVucUtleXMiLCJ3aGVyZUluRmllbGQiLCJzZWxlY3RGaWVsZCIsImxlbmd0aCIsInJhdyIsImpvaW4iLCJtYXAiLCJyb3ciLCJmaWVsZCIsInJlc3VsdElkcyIsImRiUm93cyIsInNlbGVjdCIsIndoZXJlSW4iLCJjb25jYXQiLCJkYlJvdyIsInBhcnNlSW50IiwiU3RyaW5nIiwiZ2V0U3Vic2V0UXVlcmllcyIsInN1YnNldCIsInB1cmlXcmFwcGVyIiwicWIiLCJvblN1YnNldCIsIl9zdWJzZXQiLCJjcmVhdGVFbmhhbmNlcnMiLCJlbmhhbmNlcnMiLCJleGVjdXRlU3Vic2V0UXVlcnkiLCJwYXJhbXMiLCJxdWVyeVBhcmFtcyIsImRlYnVnIiwib3B0aW1pemVDb3VudFF1ZXJ5IiwibnVtIiwicGFnZSIsInRvdGFsIiwiZXhlY3V0ZUNvdW50UXVlcnkiLCJjb21wdXRlZFJvd3MiLCJleGVjdXRlTGlzdFF1ZXJ5IiwiZW5oYW5jZXIiLCJQcm9taXNlIiwiYWxsIiwicXVlcnlNb2RlIiwiY291bnRQdXJpIiwiY2xvbmUiLCJjbGVhciIsImRlZmF1bHQiLCJTcWxQYXJzZXIiLCJwYXJzZXIiLCJQYXJzZXIiLCJwYXJzZWRRdWVyeSIsImFzdGlmeSIsInRvUXVlcnkiLCJkYXRhYmFzZSIsImNvbmZpZyIsImxlZnRKb2luVGFibGVzIiwid2hlcmVUYWJsZXMiLCJ0YWJsZXNUb1JlbW92ZSIsImZpbHRlciIsImoiLCJpbmNsdWRlcyIsImZvckVhY2giLCJjbGVhckpvaW4iLCJjb3VudFJlc3VsdCIsInJhd051bWJlciIsImZpcnN0IiwibGltaXRlZFFiIiwibGltaXQiLCJvZmZzZXQiLCJ1bmxvYWRlZFJvd3MiLCJsb2FkZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJvY2Vzc0xvYWRlcnMiLCJoeWRyYXRlIiwicmVzb2x2ZUxvYWRlciIsImFzIiwicmVmSWQiLCJyZXNvbHZlTG9hZGVyUWJGbiIsIm5lc3RlZExvYWRlcnMiLCJyZXNvbHZlTG9hZGVyUWIiLCJsb2FkZWRSb3dzIiwic3ViUm93R3JvdXBzIiwiciIsIm5lc3RlZEtleXMiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiZ3JvdXBzIiwiZ3JvdXBCeSIsInNwbGl0IiwibnVsbEtleXMiLCJlbnRyaWVzIiwiZ3JvdXBLZXkiLCJmaWVsZHMiLCJpZEZpZWxkIiwiZXZlcnkiLCJoeWRyYXRlZCIsInJlZHVj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
@@ -17,7 +17,7 @@ declare class EntityManagerClass {
17
17
  title: string;
18
18
  table: string;
19
19
  props: ({
20
- type: "boolean" | "date" | "integer" | "integer[]" | "bigInteger" | "bigInteger[]" | "boolean[]" | "date[]" | "uuid" | "uuid[]";
20
+ type: "boolean" | "date" | "uuid" | "integer" | "integer[]" | "bigInteger" | "bigInteger[]" | "boolean[]" | "date[]" | "uuid[]" | "tsvector";
21
21
  name: string;
22
22
  desc?: string | undefined;
23
23
  nullable?: boolean | undefined;
@@ -79,7 +79,7 @@ declare class EntityManagerClass {
79
79
  } | {
80
80
  type: "number";
81
81
  name: string;
82
- numberType?: "numeric" | "real" | "double precision" | undefined;
82
+ numberType?: "real" | "double precision" | "numeric" | undefined;
83
83
  precision?: number | undefined;
84
84
  scale?: number | undefined;
85
85
  desc?: string | undefined;
@@ -93,7 +93,7 @@ declare class EntityManagerClass {
93
93
  } | {
94
94
  type: "number[]";
95
95
  name: string;
96
- numberType?: "numeric" | "real" | "double precision" | undefined;
96
+ numberType?: "real" | "double precision" | "numeric" | undefined;
97
97
  precision?: number | undefined;
98
98
  scale?: number | undefined;
99
99
  desc?: string | undefined;
@@ -246,7 +246,7 @@ declare class EntityManagerClass {
246
246
  } | undefined;
247
247
  })[];
248
248
  indexes: {
249
- type: "index" | "unique" | "fulltext" | "hnsw" | "ivfflat";
249
+ type: "index" | "unique" | "hnsw" | "ivfflat";
250
250
  columns: {
251
251
  name: string;
252
252
  nullsFirst?: boolean | undefined;
@@ -254,7 +254,7 @@ declare class EntityManagerClass {
254
254
  vectorOps?: "vector_cosine_ops" | "vector_ip_ops" | "vector_l2_ops" | undefined;
255
255
  }[];
256
256
  name: string;
257
- parser?: "built-in" | "ngram" | undefined;
257
+ using?: "btree" | "hash" | "gin" | "gist" | undefined;
258
258
  nullsNotDistinct?: boolean | undefined;
259
259
  m?: number | undefined;
260
260
  efConstruction?: number | undefined;
@@ -77,6 +77,15 @@ export declare class Entity {
77
77
  name: string;
78
78
  type: string;
79
79
  }[];
80
+ /**
81
+ * Entity에 정의된 모든 vector 타입 컬럼 반환
82
+ */
83
+ getVectorColumns(): EntityProp[];
84
+ /**
85
+ * 특정 vector 컬럼 반환
86
+ * @param columnName - 컬럼명 (생략 시 첫 번째 vector 컬럼)
87
+ */
88
+ getVectorColumn(columnName?: string): EntityProp | undefined;
80
89
  registerModulePaths(): Promise<void>;
81
90
  registerTableSpecs(): void;
82
91
  toJson(): EntityJson;
@@ -1 +1 @@
1
- {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"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"}