@uql/core 0.4.68 → 0.4.74

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 (53) hide show
  1. package/README.md +1 -1
  2. package/dialect/{baseSqlDialect.d.ts → abstractSqlDialect.d.ts} +1 -1
  3. package/dialect/abstractSqlDialect.js +367 -0
  4. package/dialect/index.d.ts +1 -1
  5. package/dialect/index.js +5 -5
  6. package/dialect/mysqlDialect.d.ts +2 -4
  7. package/dialect/mysqlDialect.js +3 -13
  8. package/dialect/postgresDialect.d.ts +2 -2
  9. package/dialect/postgresDialect.js +6 -6
  10. package/dialect/sqliteDialect.d.ts +4 -2
  11. package/dialect/sqliteDialect.js +12 -3
  12. package/entity/decorator/definition.js +21 -21
  13. package/entity/decorator/entity.js +2 -2
  14. package/entity/decorator/field.js +2 -2
  15. package/entity/decorator/id.js +2 -2
  16. package/entity/decorator/index.js +5 -5
  17. package/entity/decorator/relation.js +2 -2
  18. package/entity/index.js +2 -2
  19. package/index.js +2 -2
  20. package/options.js +3 -3
  21. package/package.json +6 -6
  22. package/querier/{baseQuerier.d.ts → abstractQuerier.d.ts} +4 -3
  23. package/querier/abstractQuerier.js +230 -0
  24. package/querier/abstractSqlQuerier.d.ts +27 -0
  25. package/querier/abstractSqlQuerier.js +88 -0
  26. package/querier/decorator/index.js +3 -3
  27. package/querier/decorator/transactional.js +4 -4
  28. package/querier/index.d.ts +2 -2
  29. package/querier/index.js +4 -4
  30. package/repository/{baseRepository.d.ts → genericRepository.d.ts} +1 -1
  31. package/repository/genericRepository.js +50 -0
  32. package/repository/index.d.ts +1 -1
  33. package/repository/index.js +2 -2
  34. package/type/entity.d.ts +14 -13
  35. package/type/entity.js +1 -7
  36. package/type/index.d.ts +1 -0
  37. package/type/index.js +9 -8
  38. package/type/options.d.ts +0 -4
  39. package/type/options.js +1 -1
  40. package/type/querier.d.ts +8 -91
  41. package/type/querier.js +1 -1
  42. package/type/querierPool.d.ts +2 -27
  43. package/type/querierPool.js +1 -1
  44. package/type/universalQuerier.d.ts +96 -0
  45. package/type/universalQuerier.js +3 -0
  46. package/util/dialect.util.js +5 -5
  47. package/util/index.js +6 -6
  48. package/util/sql.util.js +4 -4
  49. package/dialect/baseSqlDialect.js +0 -365
  50. package/querier/baseQuerier.js +0 -230
  51. package/querier/sqlQuerier.d.ts +0 -19
  52. package/querier/sqlQuerier.js +0 -91
  53. package/repository/baseRepository.js +0 -50
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # [uql](https://uql.io) · [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/impensables/uql/blob/main/LICENSE) [![tests](https://github.com/impensables/uql/actions/workflows/tests.yml/badge.svg)](https://github.com/impensables/uql) [![coverage status](https://coveralls.io/repos/impensables/uql/badge.svg?branch=main)](https://coveralls.io/r/impensables/uql?branch=main) [![npm version](https://badge.fury.io/js/%40uql%2Fcore.svg)](https://badge.fury.io/js/%40uql%2Fcore)
1
+ # [uql](https://uql.io) · [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/rogerpadilla/uql/blob/main/LICENSE) [![tests](https://github.com/rogerpadilla/uql/actions/workflows/tests.yml/badge.svg)](https://github.com/rogerpadilla/uql) [![coverage status](https://coveralls.io/repos/rogerpadilla/uql/badge.svg?branch=main)](https://coveralls.io/r/rogerpadilla/uql?branch=main) [![npm version](https://badge.fury.io/js/%40uql%2Fcore.svg)](https://badge.fury.io/js/%40uql%2Fcore)
2
2
 
3
3
  [Learn how to use uql in your own project](https://uql.io).
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { QueryFilter, Query, Scalar, QueryFilterFieldOperatorMap, QuerySort, QueryPager, FieldKey, QueryProject, Type, QueryCriteria, QueryOptions, QueryDialect, QueryFilterOptions, QueryComparisonOptions, QueryFilterMap, QuerySearch, QueryProjectOptions } from '@uql/core/type';
2
- export declare abstract class BaseSqlDialect implements QueryDialect {
2
+ export declare abstract class AbstractSqlDialect implements QueryDialect {
3
3
  readonly beginTransactionCommand: string;
4
4
  readonly escapeIdChar: '`' | '"';
5
5
  readonly escapeIdRegex: RegExp;
@@ -0,0 +1,367 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractSqlDialect = void 0;
4
+ const sqlstring_1 = require("sqlstring");
5
+ const entity_1 = require("@uql/core/entity");
6
+ const util_1 = require("@uql/core/util");
7
+ class AbstractSqlDialect {
8
+ constructor(beginTransactionCommand, escapeIdChar) {
9
+ this.beginTransactionCommand = beginTransactionCommand;
10
+ this.escapeIdChar = escapeIdChar;
11
+ this.escapeIdRegex = RegExp(escapeIdChar, 'g');
12
+ }
13
+ criteria(entity, qm, opts = {}) {
14
+ var _a;
15
+ const meta = (0, entity_1.getMeta)(entity);
16
+ const prefix = ((_a = opts.prefix) !== null && _a !== void 0 ? _a : (opts.autoPrefix || (0, util_1.isProjectingRelations)(meta, qm.$project))) ? meta.name : undefined;
17
+ const where = this.where(entity, qm.$filter, { ...opts, prefix });
18
+ const group = this.group(entity, qm.$group, { ...opts, prefix });
19
+ const having = this.where(entity, qm.$having, { ...opts, prefix, clause: 'HAVING' });
20
+ const sort = this.sort(entity, qm.$sort, { ...opts, prefix });
21
+ const pager = this.pager(qm);
22
+ return where + group + having + sort + pager;
23
+ }
24
+ projectFields(entity, project, opts = {}) {
25
+ const meta = (0, entity_1.getMeta)(entity);
26
+ const prefix = opts.prefix ? opts.prefix + '.' : '';
27
+ const escapedPrefix = this.escapeId(opts.prefix, true, true);
28
+ let fields;
29
+ if (project) {
30
+ if (Array.isArray(project)) {
31
+ fields = project;
32
+ }
33
+ else {
34
+ const positiveProjectKeys = (0, util_1.getKeys)(project).filter((key) => project[key]);
35
+ fields = positiveProjectKeys.length
36
+ ? positiveProjectKeys.map((key) => {
37
+ const val = project[key];
38
+ if (val instanceof util_1.Raw) {
39
+ return (0, util_1.raw)(val.value, key);
40
+ }
41
+ return key;
42
+ })
43
+ : (0, util_1.getKeys)(meta.fields).filter((key) => !(key in project));
44
+ }
45
+ fields = fields.filter((key) => key instanceof util_1.Raw || meta.fields[key]);
46
+ if (!fields.length || (opts.prefix && !fields.includes(meta.id))) {
47
+ fields = [meta.id, ...fields];
48
+ }
49
+ }
50
+ else {
51
+ fields = (0, util_1.getKeys)(meta.fields);
52
+ }
53
+ return fields
54
+ .map((key) => {
55
+ var _a;
56
+ if (key instanceof util_1.Raw) {
57
+ return (0, util_1.getRawValue)({
58
+ value: key,
59
+ dialect: this,
60
+ prefix,
61
+ escapedPrefix,
62
+ autoPrefixAlias: opts.autoPrefixAlias,
63
+ });
64
+ }
65
+ const field = meta.fields[key];
66
+ if (field.virtual) {
67
+ return (0, util_1.getRawValue)({
68
+ value: field.virtual,
69
+ alias: key,
70
+ dialect: this,
71
+ prefix,
72
+ escapedPrefix,
73
+ autoPrefixAlias: opts.autoPrefixAlias,
74
+ });
75
+ }
76
+ const name = (_a = field === null || field === void 0 ? void 0 : field.name) !== null && _a !== void 0 ? _a : key;
77
+ const fieldPath = `${escapedPrefix}${this.escapeId(name)}`;
78
+ return !opts.autoPrefixAlias && (name === key || !field) ? fieldPath : `${fieldPath} ${this.escapeId((prefix + key), true)}`;
79
+ })
80
+ .join(', ');
81
+ }
82
+ projectRelations(entity, project = {}, { prefix } = {}) {
83
+ const meta = (0, entity_1.getMeta)(entity);
84
+ const relations = (0, util_1.getProjectRelationKeys)(meta, project);
85
+ const isProjectArray = Array.isArray(project);
86
+ let fields = '';
87
+ let tables = '';
88
+ for (const key of relations) {
89
+ const relOpts = meta.relations[key];
90
+ if (relOpts.cardinality === '1m' || relOpts.cardinality === 'mm') {
91
+ // '1m' and 'mm' should be resolved in a higher layer because they will need multiple queries
92
+ continue;
93
+ }
94
+ const joinRelAlias = prefix ? prefix + '.' + key : key;
95
+ const relEntity = relOpts.entity();
96
+ const relProject = project[key];
97
+ const relQuery = isProjectArray ? {} : Array.isArray(relProject) ? { $project: relProject } : relProject;
98
+ const relColumns = this.projectFields(relEntity, relQuery.$project, {
99
+ prefix: joinRelAlias,
100
+ autoPrefixAlias: true,
101
+ });
102
+ fields += ', ' + relColumns;
103
+ const { fields: subColumns, tables: subTables } = this.projectRelations(relEntity, relQuery.$project, {
104
+ prefix: joinRelAlias,
105
+ });
106
+ fields += subColumns;
107
+ const relMeta = (0, entity_1.getMeta)(relEntity);
108
+ const relEntityName = this.escapeId(relMeta.name);
109
+ const relPath = prefix ? this.escapeId(prefix, true) : this.escapeId(meta.name);
110
+ const joinType = relQuery.$required ? 'INNER' : 'LEFT';
111
+ const joinAlias = this.escapeId(joinRelAlias, true);
112
+ tables += ` ${joinType} JOIN ${relEntityName} ${joinAlias} ON `;
113
+ tables += relOpts.references.map((it) => `${joinAlias}.${this.escapeId(it.foreign)} = ${relPath}.${this.escapeId(it.local)}`).join(' AND ');
114
+ if (relQuery.$filter) {
115
+ const filter = this.where(relEntity, relQuery.$filter, { prefix: key, clause: false });
116
+ tables += ` AND ${filter}`;
117
+ }
118
+ tables += subTables;
119
+ }
120
+ return { fields, tables };
121
+ }
122
+ select(entity, qm, opts = {}) {
123
+ var _a;
124
+ const meta = (0, entity_1.getMeta)(entity);
125
+ const prefix = ((_a = opts.prefix) !== null && _a !== void 0 ? _a : (opts.autoPrefix || (0, util_1.isProjectingRelations)(meta, qm.$project))) ? meta.name : undefined;
126
+ const fields = this.projectFields(entity, qm.$project, { prefix });
127
+ const { fields: relationFields, tables } = this.projectRelations(entity, qm.$project);
128
+ return `SELECT ${fields}${relationFields} FROM ${this.escapeId(meta.name)}${tables}`;
129
+ }
130
+ where(entity, filter = {}, opts = {}) {
131
+ const meta = (0, entity_1.getMeta)(entity);
132
+ const { usePrecedence, clause = 'WHERE', softDelete } = opts;
133
+ filter = (0, util_1.getQueryFilterAsMap)(meta, filter);
134
+ if (meta.softDelete && (softDelete || softDelete === undefined) && clause !== 'HAVING' && !filter[meta.softDelete]) {
135
+ filter[meta.softDelete] = null;
136
+ }
137
+ const entries = Object.entries(filter);
138
+ if (!entries.length) {
139
+ return '';
140
+ }
141
+ const options = { ...opts, usePrecedence: entries.length > 1 };
142
+ let sql = entries.map(([key, val]) => this.compare(entity, key, val, options)).join(` AND `);
143
+ if (usePrecedence) {
144
+ sql = `(${sql})`;
145
+ }
146
+ return clause ? ` ${clause} ${sql}` : sql;
147
+ }
148
+ compare(entity, key, val, opts) {
149
+ var _a;
150
+ const meta = (0, entity_1.getMeta)(entity);
151
+ if (val instanceof util_1.Raw) {
152
+ if (key === '$exists' || key === '$nexists') {
153
+ const value = val;
154
+ const query = (0, util_1.getRawValue)({
155
+ value,
156
+ dialect: this,
157
+ prefix: meta.name,
158
+ escapedPrefix: this.escapeId(meta.name, false, true),
159
+ });
160
+ return `${key === '$exists' ? 'EXISTS' : 'NOT EXISTS'} (${query})`;
161
+ }
162
+ const comparisonKey = this.getComparisonKey(entity, key, opts);
163
+ return `${comparisonKey} = ${val.value}`;
164
+ }
165
+ if (key === '$text') {
166
+ const meta = (0, entity_1.getMeta)(entity);
167
+ const search = val;
168
+ const fields = search.$fields.map((field) => { var _a, _b; return this.escapeId((_b = (_a = meta.fields[field]) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : field); });
169
+ return `MATCH(${fields.join(', ')}) AGAINST(${this.escape(search.$value)})`;
170
+ }
171
+ if (key === '$and' || key === '$or' || key === '$not' || key === '$nor') {
172
+ const negateOperatorMap = {
173
+ $not: '$and',
174
+ $nor: '$or',
175
+ };
176
+ const op = (_a = negateOperatorMap[key]) !== null && _a !== void 0 ? _a : key;
177
+ const negate = key in negateOperatorMap ? 'NOT ' : '';
178
+ const values = val;
179
+ const hasManyItems = values.length > 1;
180
+ const logicalComparison = values
181
+ .map((filterEntry) => {
182
+ if (filterEntry instanceof util_1.Raw) {
183
+ return (0, util_1.getRawValue)({
184
+ value: filterEntry,
185
+ dialect: this,
186
+ prefix: opts.prefix,
187
+ escapedPrefix: this.escapeId(opts.prefix, true, true),
188
+ });
189
+ }
190
+ return this.where(entity, filterEntry, {
191
+ prefix: opts.prefix,
192
+ usePrecedence: hasManyItems && !Array.isArray(filterEntry) && (0, util_1.getKeys)(filterEntry).length > 1,
193
+ clause: false,
194
+ });
195
+ })
196
+ .join(op === '$or' ? ' OR ' : ' AND ');
197
+ return (opts.usePrecedence || negate) && hasManyItems ? `${negate}(${logicalComparison})` : `${negate}${logicalComparison}`;
198
+ }
199
+ const value = Array.isArray(val) ? { $in: val } : typeof val === 'object' && val !== null ? val : { $eq: val };
200
+ const operators = (0, util_1.getKeys)(value);
201
+ const comparisons = operators.map((op) => this.compareFieldOperator(entity, key, op, value[op], opts)).join(' AND ');
202
+ return operators.length > 1 ? `(${comparisons})` : comparisons;
203
+ }
204
+ compareFieldOperator(entity, key, op, val, opts) {
205
+ const comparisonKey = this.getComparisonKey(entity, key, opts);
206
+ switch (op) {
207
+ case '$eq':
208
+ return val === null ? `${comparisonKey} IS NULL` : `${comparisonKey} = ${this.escape(val)}`;
209
+ case '$ne':
210
+ return val === null ? `${comparisonKey} IS NOT NULL` : `${comparisonKey} <> ${this.escape(val)}`;
211
+ case '$not':
212
+ return this.compare(entity, '$not', [{ [key]: val }], opts);
213
+ case '$gt':
214
+ return `${comparisonKey} > ${this.escape(val)}`;
215
+ case '$gte':
216
+ return `${comparisonKey} >= ${this.escape(val)}`;
217
+ case '$lt':
218
+ return `${comparisonKey} < ${this.escape(val)}`;
219
+ case '$lte':
220
+ return `${comparisonKey} <= ${this.escape(val)}`;
221
+ case '$startsWith':
222
+ return `${comparisonKey} LIKE ${this.escape(`${val}%`)}`;
223
+ case '$istartsWith':
224
+ return `LOWER(${comparisonKey}) LIKE ${this.escape(val.toLowerCase() + '%')}`;
225
+ case '$endsWith':
226
+ return `${comparisonKey} LIKE ${this.escape(`%${val}`)}`;
227
+ case '$iendsWith':
228
+ return `LOWER(${comparisonKey}) LIKE ${this.escape('%' + val.toLowerCase())}`;
229
+ case '$includes':
230
+ return `${comparisonKey} LIKE ${this.escape(`%${val}%`)}`;
231
+ case '$iincludes':
232
+ return `LOWER(${comparisonKey}) LIKE ${this.escape('%' + val.toLowerCase() + '%')}`;
233
+ case '$ilike':
234
+ return `LOWER(${comparisonKey}) LIKE ${this.escape(val.toLowerCase())}`;
235
+ case '$like':
236
+ return `${comparisonKey} LIKE ${this.escape(val)}`;
237
+ case '$in':
238
+ return `${comparisonKey} IN (${this.escape(val)})`;
239
+ case '$nin':
240
+ return `${comparisonKey} NOT IN (${this.escape(val)})`;
241
+ case '$regex':
242
+ return `${comparisonKey} REGEXP ${this.escape(val)}`;
243
+ default:
244
+ throw TypeError(`unknown operator: ${op}`);
245
+ }
246
+ }
247
+ getComparisonKey(entity, key, { prefix } = {}) {
248
+ var _a;
249
+ const meta = (0, entity_1.getMeta)(entity);
250
+ const escapedPrefix = this.escapeId(prefix, true, true);
251
+ const field = meta.fields[key];
252
+ if (field === null || field === void 0 ? void 0 : field.virtual) {
253
+ return (0, util_1.getRawValue)({
254
+ value: field.virtual,
255
+ dialect: this,
256
+ prefix,
257
+ escapedPrefix,
258
+ });
259
+ }
260
+ return escapedPrefix + this.escapeId((_a = field === null || field === void 0 ? void 0 : field.name) !== null && _a !== void 0 ? _a : key);
261
+ }
262
+ group(entity, fields, opts = {}) {
263
+ if (!(fields === null || fields === void 0 ? void 0 : fields.length)) {
264
+ return '';
265
+ }
266
+ const meta = (0, entity_1.getMeta)(entity);
267
+ const names = fields.map((key) => { var _a, _b; return this.escapeId((_b = (_a = meta.fields[key]) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : key); }).join(', ');
268
+ return ` GROUP BY ${names}`;
269
+ }
270
+ sort(entity, sort, { prefix } = {}) {
271
+ const sortMap = (0, util_1.buildSortMap)(sort);
272
+ if (!(0, util_1.hasKeys)(sortMap)) {
273
+ return '';
274
+ }
275
+ const meta = (0, entity_1.getMeta)(entity);
276
+ const flattenedSort = (0, util_1.flatObject)(sortMap, prefix);
277
+ const directionMap = { 1: '', asc: '', '-1': ' DESC', desc: ' DESC' };
278
+ const order = Object.entries(flattenedSort)
279
+ .map(([key, sort]) => {
280
+ var _a, _b;
281
+ const name = (_b = (_a = meta.fields[key]) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : key;
282
+ const direction = directionMap[sort];
283
+ return this.escapeId(name) + direction;
284
+ })
285
+ .join(', ');
286
+ return ` ORDER BY ${order}`;
287
+ }
288
+ pager(opts) {
289
+ let sql = '';
290
+ if (opts.$limit) {
291
+ sql += ` LIMIT ${Number(opts.$limit)}`;
292
+ }
293
+ if (opts.$skip !== undefined) {
294
+ sql += ` OFFSET ${Number(opts.$skip)}`;
295
+ }
296
+ return sql;
297
+ }
298
+ count(entity, qm, opts) {
299
+ const search = {
300
+ ...qm,
301
+ $project: [(0, util_1.raw)('COUNT(*)', 'count')],
302
+ };
303
+ delete search.$sort;
304
+ delete search.$skip;
305
+ delete search.$limit;
306
+ const select = this.select(entity, search);
307
+ const criteria = this.criteria(entity, search, opts);
308
+ return select + criteria;
309
+ }
310
+ find(entity, qm, opts) {
311
+ const select = this.select(entity, qm, opts);
312
+ const criteria = this.criteria(entity, qm, opts);
313
+ return select + criteria;
314
+ }
315
+ insert(entity, payload) {
316
+ const meta = (0, entity_1.getMeta)(entity);
317
+ payload = (0, util_1.getPersistables)(meta, payload, 'onInsert');
318
+ const keys = (0, util_1.getKeys)(payload[0]);
319
+ const columns = keys.map((key) => this.escapeId(meta.fields[key].name));
320
+ const values = payload.map((it) => keys.map((key) => this.escape(it[key])).join(', ')).join('), (');
321
+ return `INSERT INTO ${this.escapeId(meta.name)} (${columns.join(', ')}) VALUES (${values})`;
322
+ }
323
+ update(entity, qm, payload, opts) {
324
+ const meta = (0, entity_1.getMeta)(entity);
325
+ payload = (0, util_1.getPersistable)(meta, payload, 'onUpdate');
326
+ const values = (0, util_1.getKeys)(payload)
327
+ .map((key) => `${this.escapeId(key)} = ${this.escape(payload[key])}`)
328
+ .join(', ');
329
+ const criteria = this.criteria(entity, qm, opts);
330
+ return `UPDATE ${this.escapeId(meta.name)} SET ${values}${criteria}`;
331
+ }
332
+ delete(entity, qm, opts = {}) {
333
+ const meta = (0, entity_1.getMeta)(entity);
334
+ if (opts.softDelete || opts.softDelete === undefined) {
335
+ if (meta.softDelete) {
336
+ const criteria = this.criteria(entity, qm, opts);
337
+ const value = meta.fields[meta.softDelete].onDelete();
338
+ return `UPDATE ${this.escapeId(meta.name)} SET ${this.escapeId(meta.softDelete)} = ${this.escape(value)}${criteria}`;
339
+ }
340
+ else if (opts.softDelete) {
341
+ throw TypeError(`'${meta.name}' has not enabled 'softDelete'`);
342
+ }
343
+ }
344
+ const criteria = this.criteria(entity, qm, opts);
345
+ return `DELETE FROM ${this.escapeId(meta.name)}${criteria}`;
346
+ }
347
+ escapeId(val, forbidQualified, addDot) {
348
+ if (!val) {
349
+ return '';
350
+ }
351
+ if (!forbidQualified && val.includes('.')) {
352
+ return val
353
+ .split('.')
354
+ .map((it) => this.escapeId(it))
355
+ .join('.');
356
+ }
357
+ // sourced from 'escapeId' function here https://github.com/mysqljs/sqlstring/blob/master/lib/SqlString.js
358
+ const escaped = this.escapeIdChar + val.replace(this.escapeIdRegex, this.escapeIdChar + this.escapeIdChar) + this.escapeIdChar;
359
+ const suffix = addDot ? '.' : '';
360
+ return escaped + suffix;
361
+ }
362
+ escape(value) {
363
+ return (0, sqlstring_1.escape)(value);
364
+ }
365
+ }
366
+ exports.AbstractSqlDialect = AbstractSqlDialect;
367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RTcWxEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvYWJzdHJhY3RTcWxEaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFtQztBQUNuQyw2Q0FBMkM7QUFDM0MseUNBYXdCO0FBMEJ4QixNQUFzQixrQkFBa0I7SUFHdEMsWUFBcUIsdUJBQStCLEVBQVcsWUFBdUI7UUFBakUsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUFRO1FBQVcsaUJBQVksR0FBWixZQUFZLENBQVc7UUFDcEYsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxRQUFRLENBQUksTUFBZSxFQUFFLEVBQVksRUFBRSxPQUFxQixFQUFFOztRQUNoRSxNQUFNLElBQUksR0FBRyxJQUFBLGdCQUFPLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsQ0FBQSxNQUFBLElBQUksQ0FBQyxNQUFNLG1DQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFBLDRCQUFxQixFQUFDLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3BILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENB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QUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFFL0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVqQyxPQUFPLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFVO1FBQ2YsT0FBTyxJQUFBLGtCQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBdGFELGdEQXNhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVzY2FwZSB9IGZyb20gJ3NxbHN0cmluZyc7XG5pbXBvcnQgeyBnZXRNZXRhIH0gZnJvbSAnQHVxbC9jb3JlL2VudGl0eSc7XG5pbXBvcnQge1xuICBnZXRQZXJzaXN0YWJsZSxcbiAgZ2V0UHJvamVjdFJlbGF0aW9uS2V5cyxcbiAgZ2V0UGVyc2lzdGFibGVzLFxuICBpc1Byb2plY3RpbmdSZWxhdGlvbnMsXG4gIGdldEtleXMsXG4gIGhhc0tleXMsXG4gIGJ1aWxkU29ydE1hcCxcbiAgZmxhdE9iamVjdCxcbiAgZ2V0UmF3VmFsdWUsXG4gIHJhdyxcbiAgUmF3LFxuICBnZXRRdWVyeUZpbHRlckFzTWFwLFxufSBmcm9tICdAdXFsL2NvcmUvdXRpbCc7XG5cbmltcG9ydCB7XG4gIFF1ZXJ5RmlsdGVyLFxuICBRdWVyeSxcbiAgU2NhbGFyLFxuICBRdWVyeUZpbHRlckZpZWxkT3BlcmF0b3JNYXAsXG4gIFF1ZXJ5U29ydCxcbiAgUXVlcnlQYWdlcixcbiAgUXVlcnlUZXh0U2VhcmNoT3B0aW9ucyxcbiAgRmllbGRLZXksXG4gIFF1ZXJ5UHJvamVjdCxcbiAgVHlwZSxcbiAgUXVlcnlDcml0ZXJpYSxcbiAgUXVlcnlQcm9qZWN0QXJyYXksXG4gIFF1ZXJ5T3B0aW9ucyxcbiAgUXVlcnlEaWFsZWN0LFxuICBRdWVyeUZpbHRlck9wdGlvbnMsXG4gIFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMsXG4gIFF1ZXJ5RmlsdGVyTWFwLFxuICBRdWVyeVNlYXJjaCxcbiAgUXVlcnlQcm9qZWN0T3B0aW9ucyxcbiAgUXVlcnlTb3J0RGlyZWN0aW9uLFxuICBRdWVyeUZpbHRlckxvZ2ljYWwsXG59IGZyb20gJ0B1cWwvY29yZS90eXBlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3FsRGlhbGVjdCBpbXBsZW1lbnRzIFF1ZXJ5RGlhbGVjdCB7XG4gIHJlYWRvbmx5IGVzY2FwZUlkUmVnZXg6IFJlZ0V4cDtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBiZWdpblRyYW5zYWN0aW9uQ29tbWFuZDogc3RyaW5nLCByZWFkb25seSBlc2NhcGVJZENoYXI6ICdgJyB8ICdcIicpIHtcbiAgICB0aGlzLmVzY2FwZUlkUmVnZXggPSBSZWdFeHAoZXNjYXBlSWRDaGFyLCAnZycpO1xuICB9XG5cbiAgY3JpdGVyaWE8RT4oZW50aXR5OiBUeXBlPEU+LCBxbTogUXVlcnk8RT4sIG9wdHM6IFF1ZXJ5T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IHByZWZpeCA9IG9wdHMucHJlZml4ID8/IChvcHRzLmF1dG9QcmVmaXggfHwgaXNQcm9qZWN0aW5nUmVsYXRpb25zKG1ldGEsIHFtLiRwcm9qZWN0KSkgPyBtZXRhLm5hbWUgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2hlcmUgPSB0aGlzLndoZXJlPEU+KGVudGl0eSwgcW0uJGZpbHRlciwgeyAuLi5vcHRzLCBwcmVmaXggfSk7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3VwPEU+KGVudGl0eSwgcW0uJGdyb3VwLCB7IC4uLm9wdHMsIHByZWZpeCB9KTtcbiAgICBjb25zdCBoYXZpbmcgPSB0aGlzLndoZXJlPEU+KGVudGl0eSwgcW0uJGhhdmluZywgeyAuLi5vcHRzLCBwcmVmaXgsIGNsYXVzZTogJ0hBVklORycgfSk7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMuc29ydDxFPihlbnRpdHksIHFtLiRzb3J0LCB7IC4uLm9wdHMsIHByZWZpeCB9KTtcbiAgICBjb25zdCBwYWdlciA9IHRoaXMucGFnZXIocW0pO1xuICAgIHJldHVybiB3aGVyZSArIGdyb3VwICsgaGF2aW5nICsgc29ydCArIHBhZ2VyO1xuICB9XG5cbiAgcHJvamVjdEZpZWxkczxFPihlbnRpdHk6IFR5cGU8RT4sIHByb2plY3Q6IFF1ZXJ5UHJvamVjdDxFPiwgb3B0czogUXVlcnlQcm9qZWN0T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IHByZWZpeCA9IG9wdHMucHJlZml4ID8gb3B0cy5wcmVmaXggKyAnLicgOiAnJztcbiAgICBjb25zdCBlc2NhcGVkUHJlZml4ID0gdGhpcy5lc2NhcGVJZChvcHRzLnByZWZpeCwgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICBsZXQgZmllbGRzOiBRdWVyeVByb2plY3RBcnJheTxFPjtcblxuICAgIGlmIChwcm9qZWN0KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9qZWN0KSkge1xuICAgICAgICBmaWVsZHMgPSBwcm9qZWN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVQcm9qZWN0S2V5cyA9IGdldEtleXMocHJvamVjdCkuZmlsdGVyKChrZXkpID0+IHByb2plY3Rba2V5XSk7XG4gICAgICAgIGZpZWxkcyA9IHBvc2l0aXZlUHJvamVjdEtleXMubGVuZ3RoXG4gICAgICAgICAgPyBwb3NpdGl2ZVByb2plY3RLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHByb2plY3Rba2V5XTtcbiAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybiByYXcodmFsLnZhbHVlLCBrZXkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBrZXkgYXMgRmllbGRLZXk8RT47XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogKGdldEtleXMobWV0YS5maWVsZHMpLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBwcm9qZWN0KSkgYXMgRmllbGRLZXk8RT5bXSk7XG4gICAgICB9XG4gICAgICBmaWVsZHMgPSBmaWVsZHMuZmlsdGVyKChrZXkpID0+IGtleSBpbnN0YW5jZW9mIFJhdyB8fCBtZXRhLmZpZWxkc1trZXkgYXMgRmllbGRLZXk8RT5dKTtcbiAgICAgIGlmICghZmllbGRzLmxlbmd0aCB8fCAob3B0cy5wcmVmaXggJiYgIWZpZWxkcy5pbmNsdWRlcyhtZXRhLmlkKSkpIHtcbiAgICAgICAgZmllbGRzID0gW21ldGEuaWQsIC4uLmZpZWxkc107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkcyA9IGdldEtleXMobWV0YS5maWVsZHMpIGFzIEZpZWxkS2V5PEU+W107XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkc1xuICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBSYXcpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0UmF3VmFsdWUoe1xuICAgICAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgICAgIGRpYWxlY3Q6IHRoaXMsXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICBlc2NhcGVkUHJlZml4LFxuICAgICAgICAgICAgYXV0b1ByZWZpeEFsaWFzOiBvcHRzLmF1dG9QcmVmaXhBbGlhcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkID0gbWV0YS5maWVsZHNba2V5IGFzIEZpZWxkS2V5PEU+XTtcblxuICAgICAgICBpZiAoZmllbGQudmlydHVhbCkge1xuICAgICAgICAgIHJldHVybiBnZXRSYXdWYWx1ZSh7XG4gICAgICAgICAgICB2YWx1ZTogZmllbGQudmlydHVhbCxcbiAgICAgICAgICAgIGFsaWFzOiBrZXkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgZGlhbGVjdDogdGhpcyxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIGVzY2FwZWRQcmVmaXgsXG4gICAgICAgICAgICBhdXRvUHJlZml4QWxpYXM6IG9wdHMuYXV0b1ByZWZpeEFsaWFzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGZpZWxkPy5uYW1lID8/IChrZXkgYXMgRmllbGRLZXk8RT4pO1xuICAgICAgICBjb25zdCBmaWVsZFBhdGggPSBgJHtlc2NhcGVkUHJlZml4fSR7dGhpcy5lc2NhcGVJZChuYW1lKX1gO1xuXG4gICAgICAgIHJldHVybiAhb3B0cy5hdXRvUHJlZml4QWxpYXMgJiYgKG5hbWUgPT09IGtleSB8fCAhZmllbGQpID8gZmllbGRQYXRoIDogYCR7ZmllbGRQYXRofSAke3RoaXMuZXNjYXBlSWQoKHByZWZpeCArIGtleSkgYXMgRmllbGRLZXk8RT4sIHRydWUpfWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcm9qZWN0UmVsYXRpb25zPEU+KGVudGl0eTogVHlwZTxFPiwgcHJvamVjdDogUXVlcnlQcm9qZWN0PEU+ID0ge30sIHsgcHJlZml4IH06IHsgcHJlZml4Pzogc3RyaW5nIH0gPSB7fSk6IHsgZmllbGRzOiBzdHJpbmc7IHRhYmxlczogc3RyaW5nIH0ge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgcmVsYXRpb25zID0gZ2V0UHJvamVjdFJlbGF0aW9uS2V5cyhtZXRhLCBwcm9qZWN0KTtcbiAgICBjb25zdCBpc1Byb2plY3RBcnJheSA9IEFycmF5LmlzQXJyYXkocHJvamVjdCk7XG4gICAgbGV0IGZpZWxkcyA9ICcnO1xuICAgIGxldCB0YWJsZXMgPSAnJztcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbGF0aW9ucykge1xuICAgICAgY29uc3QgcmVsT3B0cyA9IG1ldGEucmVsYXRpb25zW2tleV07XG5cbiAgICAgIGlmIChyZWxPcHRzLmNhcmRpbmFsaXR5ID09PSAnMW0nIHx8IHJlbE9wdHMuY2FyZGluYWxpdHkgPT09ICdtbScpIHtcbiAgICAgICAgLy8gJzFtJyBhbmQgJ21tJyBzaG91bGQgYmUgcmVzb2x2ZWQgaW4gYSBoaWdoZXIgbGF5ZXIgYmVjYXVzZSB0aGV5IHdpbGwgbmVlZCBtdWx0aXBsZSBxdWVyaWVzXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBqb2luUmVsQWxpYXMgPSBwcmVmaXggPyBwcmVmaXggKyAnLicgKyBrZXkgOiBrZXk7XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSByZWxPcHRzLmVudGl0eSgpO1xuICAgICAgY29uc3QgcmVsUHJvamVjdCA9IHByb2plY3Rba2V5IGFzIHN0cmluZ107XG4gICAgICBjb25zdCByZWxRdWVyeSA9IGlzUHJvamVjdEFycmF5ID8ge30gOiBBcnJheS5pc0FycmF5KHJlbFByb2plY3QpID8geyAkcHJvamVjdDogcmVsUHJvamVjdCB9IDogcmVsUHJvamVjdDtcblxuICAgICAgY29uc3QgcmVsQ29sdW1ucyA9IHRoaXMucHJvamVjdEZpZWxkcyhyZWxFbnRpdHksIHJlbFF1ZXJ5LiRwcm9qZWN0LCB7XG4gICAgICAgIHByZWZpeDogam9pblJlbEFsaWFzLFxuICAgICAgICBhdXRvUHJlZml4QWxpYXM6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZmllbGRzICs9ICcsICcgKyByZWxDb2x1bW5zO1xuXG4gICAgICBjb25zdCB7IGZpZWxkczogc3ViQ29sdW1ucywgdGFibGVzOiBzdWJUYWJsZXMgfSA9IHRoaXMucHJvamVjdFJlbGF0aW9ucyhyZWxFbnRpdHksIHJlbFF1ZXJ5LiRwcm9qZWN0LCB7XG4gICAgICAgIHByZWZpeDogam9pblJlbEFsaWFzLFxuICAgICAgfSk7XG5cbiAgICAgIGZpZWxkcyArPSBzdWJDb2x1bW5zO1xuXG4gICAgICBjb25zdCByZWxNZXRhID0gZ2V0TWV0YShyZWxFbnRpdHkpO1xuICAgICAgY29uc3QgcmVsRW50aXR5TmFtZSA9IHRoaXMuZXNjYXBlSWQocmVsTWV0YS5uYW1lKTtcbiAgICAgIGNvbnN0IHJlbFBhdGggPSBwcmVmaXggPyB0aGlzLmVzY2FwZUlkKHByZWZpeCwgdHJ1ZSkgOiB0aGlzLmVzY2FwZUlkKG1ldGEubmFtZSk7XG4gICAgICBjb25zdCBqb2luVHlwZSA9IHJlbFF1ZXJ5LiRyZXF1aXJlZCA/ICdJTk5FUicgOiAnTEVGVCc7XG4gICAgICBjb25zdCBqb2luQWxpYXMgPSB0aGlzLmVzY2FwZUlkKGpvaW5SZWxBbGlhcywgdHJ1ZSk7XG5cbiAgICAgIHRhYmxlcyArPSBgICR7am9pblR5cGV9IEpPSU4gJHtyZWxFbnRpdHlOYW1lfSAke2pvaW5BbGlhc30gT04gYDtcbiAgICAgIHRhYmxlcyArPSByZWxPcHRzLnJlZmVyZW5jZXMubWFwKChpdCkgPT4gYCR7am9pbkFsaWFzfS4ke3RoaXMuZXNjYXBlSWQoaXQuZm9yZWlnbil9ID0gJHtyZWxQYXRofS4ke3RoaXMuZXNjYXBlSWQoaXQubG9jYWwpfWApLmpvaW4oJyBBTkQgJyk7XG5cbiAgICAgIGlmIChyZWxRdWVyeS4kZmlsdGVyKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMud2hlcmUocmVsRW50aXR5LCByZWxRdWVyeS4kZmlsdGVyLCB7IHByZWZpeDoga2V5LCBjbGF1c2U6IGZhbHNlIH0pO1xuICAgICAgICB0YWJsZXMgKz0gYCBBTkQgJHtmaWx0ZXJ9YDtcbiAgICAgIH1cblxuICAgICAgdGFibGVzICs9IHN1YlRhYmxlcztcbiAgICB9XG5cbiAgICByZXR1cm4geyBmaWVsZHMsIHRhYmxlcyB9O1xuICB9XG5cbiAgc2VsZWN0PEU+KGVudGl0eTogVHlwZTxFPiwgcW06IFF1ZXJ5PEU+LCBvcHRzOiBRdWVyeU9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCBwcmVmaXggPSBvcHRzLnByZWZpeCA/PyAob3B0cy5hdXRvUHJlZml4IHx8IGlzUHJvamVjdGluZ1JlbGF0aW9ucyhtZXRhLCBxbS4kcHJvamVjdCkpID8gbWV0YS5uYW1lIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5wcm9qZWN0RmllbGRzKGVudGl0eSwgcW0uJHByb2plY3QsIHsgcHJlZml4IH0pO1xuICAgIGNvbnN0IHsgZmllbGRzOiByZWxhdGlvbkZpZWxkcywgdGFibGVzIH0gPSB0aGlzLnByb2plY3RSZWxhdGlvbnMoZW50aXR5LCBxbS4kcHJvamVjdCk7XG5cbiAgICByZXR1cm4gYFNFTEVDVCAke2ZpZWxkc30ke3JlbGF0aW9uRmllbGRzfSBGUk9NICR7dGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpfSR7dGFibGVzfWA7XG4gIH1cblxuICB3aGVyZTxFPihlbnRpdHk6IFR5cGU8RT4sIGZpbHRlcjogUXVlcnlGaWx0ZXI8RT4gPSB7fSwgb3B0czogUXVlcnlGaWx0ZXJPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgeyB1c2VQcmVjZWRlbmNlLCBjbGF1c2UgPSAnV0hFUkUnLCBzb2Z0RGVsZXRlIH0gPSBvcHRzO1xuXG4gICAgZmlsdGVyID0gZ2V0UXVlcnlGaWx0ZXJBc01hcChtZXRhLCBmaWx0ZXIpO1xuXG4gICAgaWYgKG1ldGEuc29mdERlbGV0ZSAmJiAoc29mdERlbGV0ZSB8fCBzb2Z0RGVsZXRlID09PSB1bmRlZmluZWQpICYmIGNsYXVzZSAhPT0gJ0hBVklORycgJiYgIWZpbHRlclttZXRhLnNvZnREZWxldGUgYXMgc3RyaW5nXSkge1xuICAgICAgZmlsdGVyW21ldGEuc29mdERlbGV0ZSBhcyBzdHJpbmddID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZmlsdGVyKTtcblxuICAgIGlmICghZW50cmllcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0geyAuLi5vcHRzLCB1c2VQcmVjZWRlbmNlOiBlbnRyaWVzLmxlbmd0aCA+IDEgfTtcblxuICAgIGxldCBzcWwgPSBlbnRyaWVzLm1hcCgoW2tleSwgdmFsXSkgPT4gdGhpcy5jb21wYXJlKGVudGl0eSwga2V5IGFzIGtleW9mIFF1ZXJ5RmlsdGVyTWFwPEU+LCB2YWwgYXMgYW55LCBvcHRpb25zKSkuam9pbihgIEFORCBgKTtcblxuICAgIGlmICh1c2VQcmVjZWRlbmNlKSB7XG4gICAgICBzcWwgPSBgKCR7c3FsfSlgO1xuICAgIH1cblxuICAgIHJldHVybiBjbGF1c2UgPyBgICR7Y2xhdXNlfSAke3NxbH1gIDogc3FsO1xuICB9XG5cbiAgY29tcGFyZTxFLCBLIGV4dGVuZHMga2V5b2YgUXVlcnlGaWx0ZXJNYXA8RT4+KGVudGl0eTogVHlwZTxFPiwga2V5OiBLLCB2YWw6IFF1ZXJ5RmlsdGVyTWFwPEU+W0tdLCBvcHRzPzogUXVlcnlDb21wYXJpc29uT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcblxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBSYXcpIHtcbiAgICAgIGlmIChrZXkgPT09ICckZXhpc3RzJyB8fCBrZXkgPT09ICckbmV4aXN0cycpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWwgYXMgUmF3O1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldFJhd1ZhbHVlKHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBkaWFsZWN0OiB0aGlzLFxuICAgICAgICAgIHByZWZpeDogbWV0YS5uYW1lLFxuICAgICAgICAgIGVzY2FwZWRQcmVmaXg6IHRoaXMuZXNjYXBlSWQobWV0YS5uYW1lLCBmYWxzZSwgdHJ1ZSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYCR7a2V5ID09PSAnJGV4aXN0cycgPyAnRVhJU1RTJyA6ICdOT1QgRVhJU1RTJ30gKCR7cXVlcnl9KWA7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21wYXJpc29uS2V5ID0gdGhpcy5nZXRDb21wYXJpc29uS2V5KGVudGl0eSwga2V5IGFzIEZpZWxkS2V5PEU+LCBvcHRzKTtcbiAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSA9ICR7dmFsLnZhbHVlfWA7XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJyR0ZXh0Jykge1xuICAgICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHZhbCBhcyBRdWVyeVRleHRTZWFyY2hPcHRpb25zPEU+O1xuICAgICAgY29uc3QgZmllbGRzID0gc2VhcmNoLiRmaWVsZHMubWFwKChmaWVsZCkgPT4gdGhpcy5lc2NhcGVJZChtZXRhLmZpZWxkc1tmaWVsZF0/Lm5hbWUgPz8gZmllbGQpKTtcbiAgICAgIHJldHVybiBgTUFUQ0goJHtmaWVsZHMuam9pbignLCAnKX0pIEFHQUlOU1QoJHt0aGlzLmVzY2FwZShzZWFyY2guJHZhbHVlKX0pYDtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnJGFuZCcgfHwga2V5ID09PSAnJG9yJyB8fCBrZXkgPT09ICckbm90JyB8fCBrZXkgPT09ICckbm9yJykge1xuICAgICAgY29uc3QgbmVnYXRlT3BlcmF0b3JNYXAgPSB7XG4gICAgICAgICRub3Q6ICckYW5kJyxcbiAgICAgICAgJG5vcjogJyRvcicsXG4gICAgICB9IGFzIGNvbnN0O1xuXG4gICAgICBjb25zdCBvcDogJyRhbmQnIHwgJyRvcicgPSBuZWdhdGVPcGVyYXRvck1hcFtrZXkgYXMgc3RyaW5nXSA/PyBrZXk7XG4gICAgICBjb25zdCBuZWdhdGUgPSBrZXkgaW4gbmVnYXRlT3BlcmF0b3JNYXAgPyAnTk9UICcgOiAnJztcblxuICAgICAgY29uc3QgdmFsdWVzID0gdmFsIGFzIFF1ZXJ5RmlsdGVyTG9naWNhbDxFPjtcbiAgICAgIGNvbnN0IGhhc01hbnlJdGVtcyA9IHZhbHVlcy5sZW5ndGggPiAxO1xuICAgICAgY29uc3QgbG9naWNhbENvbXBhcmlzb24gPSB2YWx1ZXNcbiAgICAgICAgLm1hcCgoZmlsdGVyRW50cnkpID0+IHtcbiAgICAgICAgICBpZiAoZmlsdGVyRW50cnkgaW5zdGFuY2VvZiBSYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRSYXdWYWx1ZSh7XG4gICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJFbnRyeSxcbiAgICAgICAgICAgICAgZGlhbGVjdDogdGhpcyxcbiAgICAgICAgICAgICAgcHJlZml4OiBvcHRzLnByZWZpeCxcbiAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeDogdGhpcy5lc2NhcGVJZChvcHRzLnByZWZpeCwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMud2hlcmUoZW50aXR5LCBmaWx0ZXJFbnRyeSwge1xuICAgICAgICAgICAgcHJlZml4OiBvcHRzLnByZWZpeCxcbiAgICAgICAgICAgIHVzZVByZWNlZGVuY2U6IGhhc01hbnlJdGVtcyAmJiAhQXJyYXkuaXNBcnJheShmaWx0ZXJFbnRyeSkgJiYgZ2V0S2V5cyhmaWx0ZXJFbnRyeSkubGVuZ3RoID4gMSxcbiAgICAgICAgICAgIGNsYXVzZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKG9wID09PSAnJG9yJyA/ICcgT1IgJyA6ICcgQU5EICcpO1xuXG4gICAgICByZXR1cm4gKG9wdHMudXNlUHJlY2VkZW5jZSB8fCBuZWdhdGUpICYmIGhhc01hbnlJdGVtcyA/IGAke25lZ2F0ZX0oJHtsb2dpY2FsQ29tcGFyaXNvbn0pYCA6IGAke25lZ2F0ZX0ke2xvZ2ljYWxDb21wYXJpc29ufWA7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB7ICRpbjogdmFsIH0gOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgPyB2YWwgOiB7ICRlcTogdmFsIH07XG4gICAgY29uc3Qgb3BlcmF0b3JzID0gZ2V0S2V5cyh2YWx1ZSkgYXMgKGtleW9mIFF1ZXJ5RmlsdGVyRmllbGRPcGVyYXRvck1hcDxFPilbXTtcbiAgICBjb25zdCBjb21wYXJpc29ucyA9IG9wZXJhdG9ycy5tYXAoKG9wKSA9PiB0aGlzLmNvbXBhcmVGaWVsZE9wZXJhdG9yKGVudGl0eSwga2V5IGFzIEZpZWxkS2V5PEU+LCBvcCwgdmFsdWVbb3BdLCBvcHRzKSkuam9pbignIEFORCAnKTtcblxuICAgIHJldHVybiBvcGVyYXRvcnMubGVuZ3RoID4gMSA/IGAoJHtjb21wYXJpc29uc30pYCA6IGNvbXBhcmlzb25zO1xuICB9XG5cbiAgY29tcGFyZUZpZWxkT3BlcmF0b3I8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5RmlsdGVyRmllbGRPcGVyYXRvck1hcDxFPj4oXG4gICAgZW50aXR5OiBUeXBlPEU+LFxuICAgIGtleTogRmllbGRLZXk8RT4sXG4gICAgb3A6IEssXG4gICAgdmFsOiBRdWVyeUZpbHRlckZpZWxkT3BlcmF0b3JNYXA8RT5bS10sXG4gICAgb3B0cz86IFF1ZXJ5T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBhcmlzb25LZXkgPSB0aGlzLmdldENvbXBhcmlzb25LZXkoZW50aXR5LCBrZXksIG9wdHMpO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJyRlcSc6XG4gICAgICAgIHJldHVybiB2YWwgPT09IG51bGwgPyBgJHtjb21wYXJpc29uS2V5fSBJUyBOVUxMYCA6IGAke2NvbXBhcmlzb25LZXl9ID0gJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckbmUnOlxuICAgICAgICByZXR1cm4gdmFsID09PSBudWxsID8gYCR7Y29tcGFyaXNvbktleX0gSVMgTk9UIE5VTExgIDogYCR7Y29tcGFyaXNvbktleX0gPD4gJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckbm90JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShlbnRpdHksICckbm90JywgW3sgW2tleV06IHZhbCB9XSBhcyBhbnksIG9wdHMpO1xuICAgICAgY2FzZSAnJGd0JzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9ID4gJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckZ3RlJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9ID49ICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgY2FzZSAnJGx0JzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IDwgJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckbHRlJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IDw9ICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgY2FzZSAnJHN0YXJ0c1dpdGgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gTElLRSAke3RoaXMuZXNjYXBlKGAke3ZhbH0lYCl9YDtcbiAgICAgIGNhc2UgJyRpc3RhcnRzV2l0aCc6XG4gICAgICAgIHJldHVybiBgTE9XRVIoJHtjb21wYXJpc29uS2V5fSkgTElLRSAke3RoaXMuZXNjYXBlKCh2YWwgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpICsgJyUnKX1gO1xuICAgICAgY2FzZSAnJGVuZHNXaXRoJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IExJS0UgJHt0aGlzLmVzY2FwZShgJSR7dmFsfWApfWA7XG4gICAgICBjYXNlICckaWVuZHNXaXRoJzpcbiAgICAgICAgcmV0dXJuIGBMT1dFUigke2NvbXBhcmlzb25LZXl9KSBMSUtFICR7dGhpcy5lc2NhcGUoJyUnICsgKHZhbCBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkpfWA7XG4gICAgICBjYXNlICckaW5jbHVkZXMnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gTElLRSAke3RoaXMuZXNjYXBlKGAlJHt2YWx9JWApfWA7XG4gICAgICBjYXNlICckaWluY2x1ZGVzJzpcbiAgICAgICAgcmV0dXJuIGBMT1dFUigke2NvbXBhcmlzb25LZXl9KSBMSUtFICR7dGhpcy5lc2NhcGUoJyUnICsgKHZhbCBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkgKyAnJScpfWA7XG4gICAgICBjYXNlICckaWxpa2UnOlxuICAgICAgICByZXR1cm4gYExPV0VSKCR7Y29tcGFyaXNvbktleX0pIExJS0UgJHt0aGlzLmVzY2FwZSgodmFsIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSl9YDtcbiAgICAgIGNhc2UgJyRsaWtlJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IExJS0UgJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckaW4nOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gSU4gKCR7dGhpcy5lc2NhcGUodmFsKX0pYDtcbiAgICAgIGNhc2UgJyRuaW4nOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gTk9UIElOICgke3RoaXMuZXNjYXBlKHZhbCl9KWA7XG4gICAgICBjYXNlICckcmVnZXgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gUkVHRVhQICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAke29wfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBhcmlzb25LZXk8RT4oZW50aXR5OiBUeXBlPEU+LCBrZXk6IEZpZWxkS2V5PEU+LCB7IHByZWZpeCB9OiBRdWVyeU9wdGlvbnMgPSB7fSk6IFNjYWxhciB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCBlc2NhcGVkUHJlZml4ID0gdGhpcy5lc2NhcGVJZChwcmVmaXgsIHRydWUsIHRydWUpO1xuICAgIGNvbnN0IGZpZWxkID0gbWV0YS5maWVsZHNba2V5XTtcblxuICAgIGlmIChmaWVsZD8udmlydHVhbCkge1xuICAgICAgcmV0dXJuIGdldFJhd1ZhbHVlKHtcbiAgICAgICAgdmFsdWU6IGZpZWxkLnZpcnR1YWwsXG4gICAgICAgIGRpYWxlY3Q6IHRoaXMsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGVkUHJlZml4ICsgdGhpcy5lc2NhcGVJZChmaWVsZD8ubmFtZSA/PyBrZXkpO1xuICB9XG5cbiAgZ3JvdXA8RT4oZW50aXR5OiBUeXBlPEU+LCBmaWVsZHM6IHJlYWRvbmx5IEZpZWxkS2V5PEU+W10sIG9wdHM6IFF1ZXJ5T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBpZiAoIWZpZWxkcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgbmFtZXMgPSBmaWVsZHMubWFwKChrZXkpID0+IHRoaXMuZXNjYXBlSWQobWV0YS5maWVsZHNba2V5XT8ubmFtZSA/PyBrZXkpKS5qb2luKCcsICcpO1xuICAgIHJldHVybiBgIEdST1VQIEJZICR7bmFtZXN9YDtcbiAgfVxuXG4gIHNvcnQ8RT4oZW50aXR5OiBUeXBlPEU+LCBzb3J0OiBRdWVyeVNvcnQ8RT4sIHsgcHJlZml4IH06IFF1ZXJ5T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBzb3J0TWFwID0gYnVpbGRTb3J0TWFwKHNvcnQpO1xuICAgIGlmICghaGFzS2V5cyhzb3J0TWFwKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IGZsYXR0ZW5lZFNvcnQgPSBmbGF0T2JqZWN0KHNvcnRNYXAsIHByZWZpeCk7XG4gICAgY29uc3QgZGlyZWN0aW9uTWFwID0geyAxOiAnJywgYXNjOiAnJywgJy0xJzogJyBERVNDJywgZGVzYzogJyBERVNDJyB9IGFzIGNvbnN0O1xuICAgIGNvbnN0IG9yZGVyID0gT2JqZWN0LmVudHJpZXMoZmxhdHRlbmVkU29ydClcbiAgICAgIC5tYXAoKFtrZXksIHNvcnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhLmZpZWxkc1trZXldPy5uYW1lID8/IGtleTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW3NvcnQgYXMgUXVlcnlTb3J0RGlyZWN0aW9uXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSWQobmFtZSkgKyBkaXJlY3Rpb247XG4gICAgICB9KVxuICAgICAgLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIGAgT1JERVIgQlkgJHtvcmRlcn1gO1xuICB9XG5cbiAgcGFnZXIob3B0czogUXVlcnlQYWdlcik6IHN0cmluZyB7XG4gICAgbGV0IHNxbCA9ICcnO1xuICAgIGlmIChvcHRzLiRsaW1pdCkge1xuICAgICAgc3FsICs9IGAgTElNSVQgJHtOdW1iZXIob3B0cy4kbGltaXQpfWA7XG4gICAgfVxuICAgIGlmIChvcHRzLiRza2lwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNxbCArPSBgIE9GRlNFVCAke051bWJlcihvcHRzLiRza2lwKX1gO1xuICAgIH1cbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgY291bnQ8RT4oZW50aXR5OiBUeXBlPEU+LCBxbTogUXVlcnlTZWFyY2g8RT4sIG9wdHM/OiBRdWVyeU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlYXJjaDogUXVlcnk8RT4gPSB7XG4gICAgICAuLi5xbSxcbiAgICAgICRwcm9qZWN0OiBbcmF3KCdDT1VOVCgqKScsICdjb3VudCcpXSxcbiAgICB9O1xuXG4gICAgZGVsZXRlIHNlYXJjaC4kc29ydDtcbiAgICBkZWxldGUgc2VhcmNoLiRza2lwO1xuICAgIGRlbGV0ZSBzZWFyY2guJGxpbWl0O1xuXG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy5zZWxlY3Q8RT4oZW50aXR5LCBzZWFyY2gpO1xuICAgIGNvbnN0IGNyaXRlcmlhID0gdGhpcy5jcml0ZXJpYShlbnRpdHksIHNlYXJjaCwgb3B0cyk7XG5cbiAgICByZXR1cm4gc2VsZWN0ICsgY3JpdGVyaWE7XG4gIH1cblxuICBmaW5kPEU+KGVudGl0eTogVHlwZTxFPiwgcW06IFF1ZXJ5PEU+LCBvcHRzPzogUXVlcnlPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLnNlbGVjdDxFPihlbnRpdHksIHFtLCBvcHRzKTtcbiAgICBjb25zdCBjcml0ZXJpYSA9IHRoaXMuY3JpdGVyaWEoZW50aXR5LCBxbSwgb3B0cyk7XG4gICAgcmV0dXJuIHNlbGVjdCArIGNyaXRlcmlhO1xuICB9XG5cbiAgaW5zZXJ0PEU+KGVudGl0eTogVHlwZTxFPiwgcGF5bG9hZDogRSB8IEVbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBwYXlsb2FkID0gZ2V0UGVyc2lzdGFibGVzKG1ldGEsIHBheWxvYWQsICdvbkluc2VydCcpO1xuICAgIGNvbnN0IGtleXMgPSBnZXRLZXlzKHBheWxvYWRbMF0pO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBrZXlzLm1hcCgoa2V5KSA9PiB0aGlzLmVzY2FwZUlkKG1ldGEuZmllbGRzW2tleV0ubmFtZSkpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHBheWxvYWQubWFwKChpdCkgPT4ga2V5cy5tYXAoKGtleSkgPT4gdGhpcy5lc2NhcGUoaXRba2V5XSkpLmpvaW4oJywgJykpLmpvaW4oJyksICgnKTtcbiAgICByZXR1cm4gYElOU0VSVCBJTlRPICR7dGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpfSAoJHtjb2x1bW5zLmpvaW4oJywgJyl9KSBWQUxVRVMgKCR7dmFsdWVzfSlgO1xuICB9XG5cbiAgdXBkYXRlPEU+KGVudGl0eTogVHlwZTxFPiwgcW06IFF1ZXJ5Q3JpdGVyaWE8RT4sIHBheWxvYWQ6IEUsIG9wdHM/OiBRdWVyeU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgcGF5bG9hZCA9IGdldFBlcnNpc3RhYmxlKG1ldGEsIHBheWxvYWQsICdvblVwZGF0ZScpO1xuICAgIGNvbnN0IHZhbHVlcyA9IGdldEtleXMocGF5bG9hZClcbiAgICAgIC5tYXAoKGtleSkgPT4gYCR7dGhpcy5lc2NhcGVJZChrZXkpfSA9ICR7dGhpcy5lc2NhcGUocGF5bG9hZFtrZXldKX1gKVxuICAgICAgLmpvaW4oJywgJyk7XG4gICAgY29uc3QgY3JpdGVyaWEgPSB0aGlzLmNyaXRlcmlhKGVudGl0eSwgcW0sIG9wdHMpO1xuICAgIHJldHVybiBgVVBEQVRFICR7dGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpfSBTRVQgJHt2YWx1ZXN9JHtjcml0ZXJpYX1gO1xuICB9XG5cbiAgZGVsZXRlPEU+KGVudGl0eTogVHlwZTxFPiwgcW06IFF1ZXJ5Q3JpdGVyaWE8RT4sIG9wdHM6IFF1ZXJ5T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuXG4gICAgaWYgKG9wdHMuc29mdERlbGV0ZSB8fCBvcHRzLnNvZnREZWxldGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG1ldGEuc29mdERlbGV0ZSkge1xuICAgICAgICBjb25zdCBjcml0ZXJpYSA9IHRoaXMuY3JpdGVyaWEoZW50aXR5LCBxbSwgb3B0cyk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWV0YS5maWVsZHNbbWV0YS5zb2Z0RGVsZXRlXS5vbkRlbGV0ZSgpO1xuICAgICAgICByZXR1cm4gYFVQREFURSAke3RoaXMuZXNjYXBlSWQobWV0YS5uYW1lKX0gU0VUICR7dGhpcy5lc2NhcGVJZChtZXRhLnNvZnREZWxldGUpfSA9ICR7dGhpcy5lc2NhcGUodmFsdWUpfSR7Y3JpdGVyaWF9YDtcbiAgICAgIH0gZWxzZSBpZiAob3B0cy5zb2Z0RGVsZXRlKSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcihgJyR7bWV0YS5uYW1lfScgaGFzIG5vdCBlbmFibGVkICdzb2Z0RGVsZXRlJ2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNyaXRlcmlhID0gdGhpcy5jcml0ZXJpYShlbnRpdHksIHFtLCBvcHRzKTtcblxuICAgIHJldHVybiBgREVMRVRFIEZST00gJHt0aGlzLmVzY2FwZUlkKG1ldGEubmFtZSl9JHtjcml0ZXJpYX1gO1xuICB9XG5cbiAgZXNjYXBlSWQodmFsOiBzdHJpbmcsIGZvcmJpZFF1YWxpZmllZD86IGJvb2xlYW4sIGFkZERvdD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmICghdmFsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JiaWRRdWFsaWZpZWQgJiYgdmFsLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgIHJldHVybiB2YWxcbiAgICAgICAgLnNwbGl0KCcuJylcbiAgICAgICAgLm1hcCgoaXQpID0+IHRoaXMuZXNjYXBlSWQoaXQpKVxuICAgICAgICAuam9pbignLicpO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZWQgZnJvbSAnZXNjYXBlSWQnIGZ1bmN0aW9uIGhlcmUgaHR0cHM6Ly9naXRodWIuY29tL215c3FsanMvc3Fsc3RyaW5nL2Jsb2IvbWFzdGVyL2xpYi9TcWxTdHJpbmcuanNcbiAgICBjb25zdCBlc2NhcGVkID0gdGhpcy5lc2NhcGVJZENoYXIgKyB2YWwucmVwbGFjZSh0aGlzLmVzY2FwZUlkUmVnZXgsIHRoaXMuZXNjYXBlSWRDaGFyICsgdGhpcy5lc2NhcGVJZENoYXIpICsgdGhpcy5lc2NhcGVJZENoYXI7XG5cbiAgICBjb25zdCBzdWZmaXggPSBhZGREb3QgPyAnLicgOiAnJztcblxuICAgIHJldHVybiBlc2NhcGVkICsgc3VmZml4O1xuICB9XG5cbiAgZXNjYXBlKHZhbHVlOiBhbnkpOiBTY2FsYXIge1xuICAgIHJldHVybiBlc2NhcGUodmFsdWUpO1xuICB9XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- export * from './baseSqlDialect';
1
+ export * from './abstractSqlDialect';
2
2
  export * from './mysqlDialect';
3
3
  export * from './postgresDialect';
4
4
  export * from './sqliteDialect';
package/dialect/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./baseSqlDialect"), exports);
5
- tslib_1.__exportStar(require("./mysqlDialect"), exports);
6
- tslib_1.__exportStar(require("./postgresDialect"), exports);
7
- tslib_1.__exportStar(require("./sqliteDialect"), exports);
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlhbGVjdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBaUM7QUFDakMseURBQStCO0FBQy9CLDREQUFrQztBQUNsQywwREFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Jhc2VTcWxEaWFsZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbXlzcWxEaWFsZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vcG9zdGdyZXNEaWFsZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vc3FsaXRlRGlhbGVjdCc7XG4iXX0=
4
+ (0, tslib_1.__exportStar)(require("./abstractSqlDialect"), exports);
5
+ (0, tslib_1.__exportStar)(require("./mysqlDialect"), exports);
6
+ (0, tslib_1.__exportStar)(require("./postgresDialect"), exports);
7
+ (0, tslib_1.__exportStar)(require("./sqliteDialect"), exports);
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlhbGVjdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvRUFBcUM7QUFDckMsOERBQStCO0FBQy9CLGlFQUFrQztBQUNsQywrREFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Fic3RyYWN0U3FsRGlhbGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL215c3FsRGlhbGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL3Bvc3RncmVzRGlhbGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL3NxbGl0ZURpYWxlY3QnO1xuIl19
@@ -1,6 +1,4 @@
1
- import { QueryComparisonOptions, QueryFilterMap, Type } from '@uql/core/type';
2
- import { BaseSqlDialect } from './baseSqlDialect';
3
- export declare class MySqlDialect extends BaseSqlDialect {
1
+ import { AbstractSqlDialect } from './abstractSqlDialect';
2
+ export declare class MySqlDialect extends AbstractSqlDialect {
4
3
  constructor();
5
- compare<E, K extends keyof QueryFilterMap<E>>(entity: Type<E>, key: K, val: QueryFilterMap<E>[K], opts?: QueryComparisonOptions): string;
6
4
  }
@@ -1,21 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MySqlDialect = void 0;
4
- const entity_1 = require("@uql/core/entity");
5
- const baseSqlDialect_1 = require("./baseSqlDialect");
6
- class MySqlDialect extends baseSqlDialect_1.BaseSqlDialect {
4
+ const abstractSqlDialect_1 = require("./abstractSqlDialect");
5
+ class MySqlDialect extends abstractSqlDialect_1.AbstractSqlDialect {
7
6
  constructor() {
8
7
  super('START TRANSACTION', '`');
9
8
  }
10
- compare(entity, key, val, opts) {
11
- if (key === '$text') {
12
- const meta = entity_1.getMeta(entity);
13
- const search = val;
14
- const fields = search.$fields.map((field) => { var _a, _b; return this.escapeId((_b = (_a = meta.fields[field]) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : field); });
15
- return `MATCH(${fields.join(', ')}) AGAINST(${this.escape(search.$value)})`;
16
- }
17
- return super.compare(entity, key, val, opts);
18
- }
19
9
  }
20
10
  exports.MySqlDialect = MySqlDialect;
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXlzcWxEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvbXlzcWxEaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyQztBQUUzQyxxREFBa0Q7QUFFbEQsTUFBYSxZQUFhLFNBQVEsK0JBQWM7SUFDOUM7UUFDRSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVRLE9BQU8sQ0FBdUMsTUFBZSxFQUFFLEdBQU0sRUFBRSxHQUF5QixFQUFFLElBQTZCO1FBQ3RJLElBQUksR0FBRyxLQUFLLE9BQU8sRUFBRTtZQUNuQixNQUFNLElBQUksR0FBRyxnQkFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE1BQU0sTUFBTSxHQUFHLEdBQWdDLENBQUM7WUFDaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxlQUFDLE9BQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMENBQUUsSUFBSSxtQ0FBSSxLQUFLLENBQUMsQ0FBQSxFQUFBLENBQUMsQ0FBQztZQUMvRixPQUFPLFNBQVMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQzdFO1FBRUQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQWZELG9DQWVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TWV0YSB9IGZyb20gJ0B1cWwvY29yZS9lbnRpdHknO1xuaW1wb3J0IHsgUXVlcnlDb21wYXJpc29uT3B0aW9ucywgUXVlcnlGaWx0ZXJNYXAsIFF1ZXJ5VGV4dFNlYXJjaE9wdGlvbnMsIFR5cGUgfSBmcm9tICdAdXFsL2NvcmUvdHlwZSc7XG5pbXBvcnQgeyBCYXNlU3FsRGlhbGVjdCB9IGZyb20gJy4vYmFzZVNxbERpYWxlY3QnO1xuXG5leHBvcnQgY2xhc3MgTXlTcWxEaWFsZWN0IGV4dGVuZHMgQmFzZVNxbERpYWxlY3Qge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignU1RBUlQgVFJBTlNBQ1RJT04nLCAnYCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcGFyZTxFLCBLIGV4dGVuZHMga2V5b2YgUXVlcnlGaWx0ZXJNYXA8RT4+KGVudGl0eTogVHlwZTxFPiwga2V5OiBLLCB2YWw6IFF1ZXJ5RmlsdGVyTWFwPEU+W0tdLCBvcHRzPzogUXVlcnlDb21wYXJpc29uT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKGtleSA9PT0gJyR0ZXh0Jykge1xuICAgICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHZhbCBhcyBRdWVyeVRleHRTZWFyY2hPcHRpb25zPEU+O1xuICAgICAgY29uc3QgZmllbGRzID0gc2VhcmNoLiRmaWVsZHMubWFwKChmaWVsZCkgPT4gdGhpcy5lc2NhcGVJZChtZXRhLmZpZWxkc1tmaWVsZF0/Lm5hbWUgPz8gZmllbGQpKTtcbiAgICAgIHJldHVybiBgTUFUQ0goJHtmaWVsZHMuam9pbignLCAnKX0pIEFHQUlOU1QoJHt0aGlzLmVzY2FwZShzZWFyY2guJHZhbHVlKX0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuY29tcGFyZShlbnRpdHksIGtleSwgdmFsLCBvcHRzKTtcbiAgfVxufVxuIl19
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXlzcWxEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvbXlzcWxEaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZEQUEwRDtBQUUxRCxNQUFhLFlBQWEsU0FBUSx1Q0FBa0I7SUFDbEQ7UUFDRSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBSkQsb0NBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdFNxbERpYWxlY3QgfSBmcm9tICcuL2Fic3RyYWN0U3FsRGlhbGVjdCc7XG5cbmV4cG9ydCBjbGFzcyBNeVNxbERpYWxlY3QgZXh0ZW5kcyBBYnN0cmFjdFNxbERpYWxlY3Qge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignU1RBUlQgVFJBTlNBQ1RJT04nLCAnYCcpO1xuICB9XG59XG4iXX0=
@@ -1,6 +1,6 @@
1
1
  import { QueryComparisonOptions, QueryFilterMap, QueryOptions, QueryFilterFieldOperatorMap, Type, FieldKey } from '@uql/core/type';
2
- import { BaseSqlDialect } from './baseSqlDialect';
3
- export declare class PostgresDialect extends BaseSqlDialect {
2
+ import { AbstractSqlDialect } from './abstractSqlDialect';
3
+ export declare class PostgresDialect extends AbstractSqlDialect {
4
4
  constructor();
5
5
  insert<E>(entity: Type<E>, payload: E | E[]): string;
6
6
  compare<E, K extends keyof QueryFilterMap<E>>(entity: Type<E>, key: K, val: QueryFilterMap<E>[K], opts?: QueryComparisonOptions): string;
@@ -2,20 +2,20 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PostgresDialect = void 0;
4
4
  const entity_1 = require("@uql/core/entity");
5
- const baseSqlDialect_1 = require("./baseSqlDialect");
6
- class PostgresDialect extends baseSqlDialect_1.BaseSqlDialect {
5
+ const abstractSqlDialect_1 = require("./abstractSqlDialect");
6
+ class PostgresDialect extends abstractSqlDialect_1.AbstractSqlDialect {
7
7
  constructor() {
8
- super('BEGIN', '"');
8
+ super('BEGIN TRANSACTION', '"');
9
9
  }
10
10
  insert(entity, payload) {
11
11
  const sql = super.insert(entity, payload);
12
- const meta = entity_1.getMeta(entity);
12
+ const meta = (0, entity_1.getMeta)(entity);
13
13
  const idName = meta.fields[meta.id].name;
14
14
  return `${sql} RETURNING ${this.escapeId(idName)} ${this.escapeId('id')}`;
15
15
  }
16
16
  compare(entity, key, val, opts) {
17
17
  if (key === '$text') {
18
- const meta = entity_1.getMeta(entity);
18
+ const meta = (0, entity_1.getMeta)(entity);
19
19
  const search = val;
20
20
  const fields = search.$fields.map((field) => { var _a, _b; return this.escapeId((_b = (_a = meta.fields[field]) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : field); }).join(` || ' ' || `);
21
21
  return `to_tsvector(${fields}) @@ to_tsquery(${this.escape(search.$value)})`;
@@ -41,4 +41,4 @@ class PostgresDialect extends baseSqlDialect_1.BaseSqlDialect {
41
41
  }
42
42
  }
43
43
  exports.PostgresDialect = PostgresDialect;
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvcG9zdGdyZXNEaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyQztBQVUzQyxxREFBa0Q7QUFFbEQsTUFBYSxlQUFnQixTQUFRLCtCQUFjO0lBQ2pEO1FBQ0UsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRVEsTUFBTSxDQUFJLE1BQWUsRUFBRSxPQUFnQjtRQUNsRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxnQkFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6QyxPQUFPLEdBQUcsR0FBRyxjQUFjLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFUSxPQUFPLENBQXVDLE1BQWUsRUFBRSxHQUFNLEVBQUUsR0FBeUIsRUFBRSxJQUE2QjtRQUN0SSxJQUFJLEdBQUcsS0FBSyxPQUFPLEVBQUU7WUFDbkIsTUFBTSxJQUFJLEdBQUcsZ0JBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixNQUFNLE1BQU0sR0FBRyxHQUFnQyxDQUFDO1lBQ2hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsZUFBQyxPQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDBDQUFFLElBQUksbUNBQUksS0FBSyxDQUFDLENBQUEsRUFBQSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ25ILE9BQU8sZUFBZSxNQUFNLG1CQUFtQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQzlFO1FBRUQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFUSxvQkFBb0IsQ0FDM0IsTUFBZSxFQUNmLEdBQWdCLEVBQ2hCLEVBQUssRUFDTCxHQUFzQyxFQUN0QyxJQUFtQjtRQUVuQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvRCxRQUFRLEVBQUUsRUFBRTtZQUNWLEtBQUssY0FBYztnQkFDakIsT0FBTyxHQUFHLGFBQWEsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVELEtBQUssWUFBWTtnQkFDZixPQUFPLEdBQUcsYUFBYSxVQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDNUQsS0FBSyxZQUFZO2dCQUNmLE9BQU8sR0FBRyxhQUFhLFVBQVUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3RCxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxHQUFHLGFBQWEsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsS0FBSyxRQUFRO2dCQUNYLE9BQU8sR0FBRyxhQUFhLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xEO2dCQUNFLE9BQU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7Q0FDRjtBQTlDRCwwQ0E4Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRNZXRhIH0gZnJvbSAnQHVxbC9jb3JlL2VudGl0eSc7XG5pbXBvcnQge1xuICBRdWVyeUNvbXBhcmlzb25PcHRpb25zLFxuICBRdWVyeUZpbHRlck1hcCxcbiAgUXVlcnlPcHRpb25zLFxuICBRdWVyeUZpbHRlckZpZWxkT3BlcmF0b3JNYXAsXG4gIFF1ZXJ5VGV4dFNlYXJjaE9wdGlvbnMsXG4gIFR5cGUsXG4gIEZpZWxkS2V5LFxufSBmcm9tICdAdXFsL2NvcmUvdHlwZSc7XG5pbXBvcnQgeyBCYXNlU3FsRGlhbGVjdCB9IGZyb20gJy4vYmFzZVNxbERpYWxlY3QnO1xuXG5leHBvcnQgY2xhc3MgUG9zdGdyZXNEaWFsZWN0IGV4dGVuZHMgQmFzZVNxbERpYWxlY3Qge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignQkVHSU4nLCAnXCInKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGluc2VydDxFPihlbnRpdHk6IFR5cGU8RT4sIHBheWxvYWQ6IEUgfCBFW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNxbCA9IHN1cGVyLmluc2VydChlbnRpdHksIHBheWxvYWQpO1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgaWROYW1lID0gbWV0YS5maWVsZHNbbWV0YS5pZF0ubmFtZTtcbiAgICByZXR1cm4gYCR7c3FsfSBSRVRVUk5JTkcgJHt0aGlzLmVzY2FwZUlkKGlkTmFtZSl9ICR7dGhpcy5lc2NhcGVJZCgnaWQnKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcGFyZTxFLCBLIGV4dGVuZHMga2V5b2YgUXVlcnlGaWx0ZXJNYXA8RT4+KGVudGl0eTogVHlwZTxFPiwga2V5OiBLLCB2YWw6IFF1ZXJ5RmlsdGVyTWFwPEU+W0tdLCBvcHRzPzogUXVlcnlDb21wYXJpc29uT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKGtleSA9PT0gJyR0ZXh0Jykge1xuICAgICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHZhbCBhcyBRdWVyeVRleHRTZWFyY2hPcHRpb25zPEU+O1xuICAgICAgY29uc3QgZmllbGRzID0gc2VhcmNoLiRmaWVsZHMubWFwKChmaWVsZCkgPT4gdGhpcy5lc2NhcGVJZChtZXRhLmZpZWxkc1tmaWVsZF0/Lm5hbWUgPz8gZmllbGQpKS5qb2luKGAgfHwgJyAnIHx8IGApO1xuICAgICAgcmV0dXJuIGB0b190c3ZlY3Rvcigke2ZpZWxkc30pIEBAIHRvX3RzcXVlcnkoJHt0aGlzLmVzY2FwZShzZWFyY2guJHZhbHVlKX0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuY29tcGFyZShlbnRpdHksIGtleSwgdmFsLCBvcHRzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbXBhcmVGaWVsZE9wZXJhdG9yPEUsIEsgZXh0ZW5kcyBrZXlvZiBRdWVyeUZpbHRlckZpZWxkT3BlcmF0b3JNYXA8RT4+KFxuICAgIGVudGl0eTogVHlwZTxFPixcbiAgICBrZXk6IEZpZWxkS2V5PEU+LFxuICAgIG9wOiBLLFxuICAgIHZhbDogUXVlcnlGaWx0ZXJGaWVsZE9wZXJhdG9yTWFwPEU+W0tdLFxuICAgIG9wdHM/OiBRdWVyeU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21wYXJpc29uS2V5ID0gdGhpcy5nZXRDb21wYXJpc29uS2V5KGVudGl0eSwga2V5LCBvcHRzKTtcbiAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICBjYXNlICckaXN0YXJ0c1dpdGgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gSUxJS0UgJHt0aGlzLmVzY2FwZShgJHt2YWx9JWApfWA7XG4gICAgICBjYXNlICckaWVuZHNXaXRoJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IElMSUtFICR7dGhpcy5lc2NhcGUoYCUke3ZhbH1gKX1gO1xuICAgICAgY2FzZSAnJGlpbmNsdWRlcyc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSBJTElLRSAke3RoaXMuZXNjYXBlKGAlJHt2YWx9JWApfWA7XG4gICAgICBjYXNlICckaWxpa2UnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gSUxJS0UgJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckcmVnZXgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gfiAke3RoaXMuZXNjYXBlKHZhbCl9YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBzdXBlci5jb21wYXJlRmllbGRPcGVyYXRvcihlbnRpdHksIGtleSwgb3AsIHZhbCwgb3B0cyk7XG4gICAgfVxuICB9XG59XG4iXX0=
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvcG9zdGdyZXNEaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyQztBQVUzQyw2REFBMEQ7QUFFMUQsTUFBYSxlQUFnQixTQUFRLHVDQUFrQjtJQUNyRDtRQUNFLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVEsTUFBTSxDQUFJLE1BQWUsRUFBRSxPQUFnQjtRQUNsRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFBLGdCQUFPLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3pDLE9BQU8sR0FBRyxHQUFHLGNBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVRLE9BQU8sQ0FBdUMsTUFBZSxFQUFFLEdBQU0sRUFBRSxHQUF5QixFQUFFLElBQTZCO1FBQ3RJLElBQUksR0FBRyxLQUFLLE9BQU8sRUFBRTtZQUNuQixNQUFNLElBQUksR0FBRyxJQUFBLGdCQUFPLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsR0FBZ0MsQ0FBQztZQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLGVBQUMsT0FBQSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQ0FBRSxJQUFJLG1DQUFJLEtBQUssQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuSCxPQUFPLGVBQWUsTUFBTSxtQkFBbUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUM5RTtRQUNELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRVEsb0JBQW9CLENBQzNCLE1BQWUsRUFDZixHQUFnQixFQUNoQixFQUFLLEVBQ0wsR0FBc0MsRUFDdEMsSUFBbUI7UUFFbkIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0QsUUFBUSxFQUFFLEVBQUU7WUFDVixLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8sR0FBRyxhQUFhLFVBQVUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxHQUFHLGFBQWEsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzVELEtBQUssWUFBWTtnQkFDZixPQUFPLEdBQUcsYUFBYSxVQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0QsS0FBSyxRQUFRO2dCQUNYLE9BQU8sR0FBRyxhQUFhLFVBQVUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELEtBQUssUUFBUTtnQkFDWCxPQUFPLEdBQUcsYUFBYSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsRDtnQkFDRSxPQUFPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDO0NBQ0Y7QUE3Q0QsMENBNkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TWV0YSB9IGZyb20gJ0B1cWwvY29yZS9lbnRpdHknO1xuaW1wb3J0IHtcbiAgUXVlcnlDb21wYXJpc29uT3B0aW9ucyxcbiAgUXVlcnlGaWx0ZXJNYXAsXG4gIFF1ZXJ5T3B0aW9ucyxcbiAgUXVlcnlGaWx0ZXJGaWVsZE9wZXJhdG9yTWFwLFxuICBRdWVyeVRleHRTZWFyY2hPcHRpb25zLFxuICBUeXBlLFxuICBGaWVsZEtleSxcbn0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxEaWFsZWN0IH0gZnJvbSAnLi9hYnN0cmFjdFNxbERpYWxlY3QnO1xuXG5leHBvcnQgY2xhc3MgUG9zdGdyZXNEaWFsZWN0IGV4dGVuZHMgQWJzdHJhY3RTcWxEaWFsZWN0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ0JFR0lOIFRSQU5TQUNUSU9OJywgJ1wiJyk7XG4gIH1cblxuICBvdmVycmlkZSBpbnNlcnQ8RT4oZW50aXR5OiBUeXBlPEU+LCBwYXlsb2FkOiBFIHwgRVtdKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcWwgPSBzdXBlci5pbnNlcnQoZW50aXR5LCBwYXlsb2FkKTtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IGlkTmFtZSA9IG1ldGEuZmllbGRzW21ldGEuaWRdLm5hbWU7XG4gICAgcmV0dXJuIGAke3NxbH0gUkVUVVJOSU5HICR7dGhpcy5lc2NhcGVJZChpZE5hbWUpfSAke3RoaXMuZXNjYXBlSWQoJ2lkJyl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbXBhcmU8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5RmlsdGVyTWFwPEU+PihlbnRpdHk6IFR5cGU8RT4sIGtleTogSywgdmFsOiBRdWVyeUZpbHRlck1hcDxFPltLXSwgb3B0cz86IFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmIChrZXkgPT09ICckdGV4dCcpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgICBjb25zdCBzZWFyY2ggPSB2YWwgYXMgUXVlcnlUZXh0U2VhcmNoT3B0aW9uczxFPjtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHNlYXJjaC4kZmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZXNjYXBlSWQobWV0YS5maWVsZHNbZmllbGRdPy5uYW1lID8/IGZpZWxkKSkuam9pbihgIHx8ICcgJyB8fCBgKTtcbiAgICAgIHJldHVybiBgdG9fdHN2ZWN0b3IoJHtmaWVsZHN9KSBAQCB0b190c3F1ZXJ5KCR7dGhpcy5lc2NhcGUoc2VhcmNoLiR2YWx1ZSl9KWA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5jb21wYXJlKGVudGl0eSwga2V5LCB2YWwsIG9wdHMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcGFyZUZpZWxkT3BlcmF0b3I8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5RmlsdGVyRmllbGRPcGVyYXRvck1hcDxFPj4oXG4gICAgZW50aXR5OiBUeXBlPEU+LFxuICAgIGtleTogRmllbGRLZXk8RT4sXG4gICAgb3A6IEssXG4gICAgdmFsOiBRdWVyeUZpbHRlckZpZWxkT3BlcmF0b3JNYXA8RT5bS10sXG4gICAgb3B0cz86IFF1ZXJ5T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBhcmlzb25LZXkgPSB0aGlzLmdldENvbXBhcmlzb25LZXkoZW50aXR5LCBrZXksIG9wdHMpO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJyRpc3RhcnRzV2l0aCc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSBJTElLRSAke3RoaXMuZXNjYXBlKGAke3ZhbH0lYCl9YDtcbiAgICAgIGNhc2UgJyRpZW5kc1dpdGgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gSUxJS0UgJHt0aGlzLmVzY2FwZShgJSR7dmFsfWApfWA7XG4gICAgICBjYXNlICckaWluY2x1ZGVzJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IElMSUtFICR7dGhpcy5lc2NhcGUoYCUke3ZhbH0lYCl9YDtcbiAgICAgIGNhc2UgJyRpbGlrZSc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSBJTElLRSAke3RoaXMuZXNjYXBlKHZhbCl9YDtcbiAgICAgIGNhc2UgJyRyZWdleCc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSB+ICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmVGaWVsZE9wZXJhdG9yKGVudGl0eSwga2V5LCBvcCwgdmFsLCBvcHRzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,4 +1,6 @@
1
- import { BaseSqlDialect } from './baseSqlDialect';
2
- export declare class SqliteDialect extends BaseSqlDialect {
1
+ import { QueryComparisonOptions, QueryFilterMap, Type } from '../type';
2
+ import { AbstractSqlDialect } from './abstractSqlDialect';
3
+ export declare class SqliteDialect extends AbstractSqlDialect {
3
4
  constructor();
5
+ compare<E, K extends keyof QueryFilterMap<E>>(entity: Type<E>, key: K, val: QueryFilterMap<E>[K], opts?: QueryComparisonOptions): string;
4
6
  }