@shaxpir/squilt 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +289 -1
  2. package/dist/ast/AlterTableQuery.d.ts +32 -0
  3. package/dist/ast/AlterTableQuery.js +60 -0
  4. package/dist/ast/BetweenExpression.d.ts +10 -0
  5. package/dist/ast/BetweenExpression.js +18 -0
  6. package/dist/ast/CastExpression.d.ts +13 -0
  7. package/dist/ast/CastExpression.js +25 -0
  8. package/dist/ast/CollateExpression.d.ts +18 -0
  9. package/dist/ast/CollateExpression.js +30 -0
  10. package/dist/ast/CreateIndexQuery.d.ts +25 -0
  11. package/dist/ast/CreateIndexQuery.js +64 -0
  12. package/dist/ast/CreateTableQuery.d.ts +57 -0
  13. package/dist/ast/CreateTableQuery.js +79 -0
  14. package/dist/ast/CreateViewQuery.d.ts +34 -0
  15. package/dist/ast/CreateViewQuery.js +61 -0
  16. package/dist/ast/CreateVirtualTableQuery.d.ts +32 -0
  17. package/dist/ast/CreateVirtualTableQuery.js +74 -0
  18. package/dist/ast/DeleteQuery.d.ts +17 -0
  19. package/dist/ast/DeleteQuery.js +43 -0
  20. package/dist/ast/DropIndexQuery.d.ts +14 -0
  21. package/dist/ast/DropIndexQuery.js +35 -0
  22. package/dist/ast/DropTableQuery.d.ts +14 -0
  23. package/dist/ast/DropTableQuery.js +35 -0
  24. package/dist/ast/DropViewQuery.d.ts +11 -0
  25. package/dist/ast/DropViewQuery.js +24 -0
  26. package/dist/ast/FunctionExpression.d.ts +21 -0
  27. package/dist/ast/FunctionExpression.js +40 -1
  28. package/dist/ast/FunctionName.d.ts +1 -1
  29. package/dist/ast/FunctionName.js +1 -1
  30. package/dist/ast/InsertQuery.d.ts +24 -1
  31. package/dist/ast/InsertQuery.js +49 -1
  32. package/dist/ast/Operator.d.ts +2 -0
  33. package/dist/ast/Operator.js +3 -1
  34. package/dist/ast/SelectQuery.d.ts +4 -0
  35. package/dist/ast/SelectQuery.js +11 -1
  36. package/dist/ast/SubqueryExpression.d.ts +18 -0
  37. package/dist/ast/SubqueryExpression.js +27 -0
  38. package/dist/ast/UpdateQuery.d.ts +24 -0
  39. package/dist/ast/UpdateQuery.js +51 -0
  40. package/dist/ast/WindowExpression.d.ts +51 -0
  41. package/dist/ast/WindowExpression.js +61 -0
  42. package/dist/ast/WindowSpecification.d.ts +46 -0
  43. package/dist/ast/WindowSpecification.js +60 -0
  44. package/dist/builder/QueryBuilder.d.ts +20 -0
  45. package/dist/builder/QueryBuilder.js +41 -1
  46. package/dist/builder/Shorthand.d.ts +51 -0
  47. package/dist/builder/Shorthand.js +125 -1
  48. package/dist/index.d.ts +17 -1
  49. package/dist/index.js +59 -3
  50. package/dist/renderer/CompactQueryRenderer.d.ts +34 -2
  51. package/dist/renderer/CompactQueryRenderer.js +272 -2
  52. package/dist/renderer/IndentedQueryRenderer.d.ts +34 -2
  53. package/dist/renderer/IndentedQueryRenderer.js +289 -3
  54. package/dist/renderer/QueryRenderer.d.ts +11 -1
  55. package/dist/renderer/QueryRenderer.js +1 -1
  56. package/dist/validate/CommonQueryValidator.d.ts +31 -1
  57. package/dist/validate/CommonQueryValidator.js +253 -4
  58. package/dist/validate/QueryValidator.d.ts +10 -1
  59. package/dist/validate/QueryValidator.js +1 -1
  60. package/dist/validate/SQLiteQueryValidator.d.ts +16 -1
  61. package/dist/validate/SQLiteQueryValidator.js +32 -3
  62. package/dist/visitor/ParamCollector.d.ts +30 -0
  63. package/dist/visitor/ParamCollector.js +109 -2
  64. package/dist/visitor/QueryIdentityTransformer.d.ts +30 -0
  65. package/dist/visitor/QueryIdentityTransformer.js +217 -2
  66. package/dist/visitor/SqlTreeNodeVisitor.d.ts +30 -0
  67. package/dist/visitor/SqlTreeNodeVisitor.js +1 -1
  68. package/package.json +4 -1
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WindowSpecification = void 0;
4
+ /**
5
+ * Represents a window specification for window functions.
6
+ *
7
+ * Currently supports:
8
+ * - PARTITION BY clause
9
+ * - ORDER BY clause
10
+ *
11
+ * Not yet implemented:
12
+ * - Frame specifications (ROWS/RANGE/GROUPS BETWEEN ... AND ...)
13
+ * - Named windows (WINDOW clause at query level)
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Used via FunctionExpression.over()
18
+ * FN('ROW_NUMBER').over(ORDER_BY('created_at'))
19
+ * FN('RANK').over(PARTITION_BY('category'), ORDER_BY('price', DESC))
20
+ * SUM(COLUMN('amount')).over(PARTITION_BY('user_id'))
21
+ * ```
22
+ */
23
+ class WindowSpecification {
24
+ constructor() {
25
+ this._partitionBy = [];
26
+ this._orderBy = [];
27
+ }
28
+ /**
29
+ * Set the PARTITION BY columns
30
+ */
31
+ setPartitionBy(columns) {
32
+ this._partitionBy = columns;
33
+ }
34
+ /**
35
+ * Add ORDER BY clauses
36
+ */
37
+ setOrderBy(orderBy) {
38
+ this._orderBy = orderBy;
39
+ }
40
+ /**
41
+ * Get the PARTITION BY columns
42
+ */
43
+ get partitionByColumns() {
44
+ return this._partitionBy;
45
+ }
46
+ /**
47
+ * Get the ORDER BY clauses
48
+ */
49
+ get orderByColumns() {
50
+ return this._orderBy;
51
+ }
52
+ /**
53
+ * Check if this window specification is empty (no PARTITION BY or ORDER BY)
54
+ */
55
+ get isEmpty() {
56
+ return this._partitionBy.length === 0 && this._orderBy.length === 0;
57
+ }
58
+ }
59
+ exports.WindowSpecification = WindowSpecification;
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2luZG93U3BlY2lmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hc3QvV2luZG93U3BlY2lmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBYSxtQkFBbUI7SUFJOUI7UUFIUSxpQkFBWSxHQUFpQixFQUFFLENBQUM7UUFDaEMsYUFBUSxHQUFjLEVBQUUsQ0FBQztJQUVsQixDQUFDO0lBRWhCOztPQUVHO0lBQ0ksY0FBYyxDQUFDLE9BQXFCO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxPQUFrQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLENBQUM7Q0FDRjtBQXhDRCxrREF3Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFeHByZXNzaW9uIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBPcmRlckJ5IH0gZnJvbSBcIi4vT3JkZXJCeVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB3aW5kb3cgc3BlY2lmaWNhdGlvbiBmb3Igd2luZG93IGZ1bmN0aW9ucy5cbiAqXG4gKiBDdXJyZW50bHkgc3VwcG9ydHM6XG4gKiAtIFBBUlRJVElPTiBCWSBjbGF1c2VcbiAqIC0gT1JERVIgQlkgY2xhdXNlXG4gKlxuICogTm90IHlldCBpbXBsZW1lbnRlZDpcbiAqIC0gRnJhbWUgc3BlY2lmaWNhdGlvbnMgKFJPV1MvUkFOR0UvR1JPVVBTIEJFVFdFRU4gLi4uIEFORCAuLi4pXG4gKiAtIE5hbWVkIHdpbmRvd3MgKFdJTkRPVyBjbGF1c2UgYXQgcXVlcnkgbGV2ZWwpXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFVzZWQgdmlhIEZ1bmN0aW9uRXhwcmVzc2lvbi5vdmVyKClcbiAqIEZOKCdST1dfTlVNQkVSJykub3ZlcihPUkRFUl9CWSgnY3JlYXRlZF9hdCcpKVxuICogRk4oJ1JBTksnKS5vdmVyKFBBUlRJVElPTl9CWSgnY2F0ZWdvcnknKSwgT1JERVJfQlkoJ3ByaWNlJywgREVTQykpXG4gKiBTVU0oQ09MVU1OKCdhbW91bnQnKSkub3ZlcihQQVJUSVRJT05fQlkoJ3VzZXJfaWQnKSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV2luZG93U3BlY2lmaWNhdGlvbiB7XG4gIHByaXZhdGUgX3BhcnRpdGlvbkJ5OiBFeHByZXNzaW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfb3JkZXJCeTogT3JkZXJCeVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIFBBUlRJVElPTiBCWSBjb2x1bW5zXG4gICAqL1xuICBwdWJsaWMgc2V0UGFydGl0aW9uQnkoY29sdW1uczogRXhwcmVzc2lvbltdKTogdm9pZCB7XG4gICAgdGhpcy5fcGFydGl0aW9uQnkgPSBjb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBPUkRFUiBCWSBjbGF1c2VzXG4gICAqL1xuICBwdWJsaWMgc2V0T3JkZXJCeShvcmRlckJ5OiBPcmRlckJ5W10pOiB2b2lkIHtcbiAgICB0aGlzLl9vcmRlckJ5ID0gb3JkZXJCeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFBBUlRJVElPTiBCWSBjb2x1bW5zXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhcnRpdGlvbkJ5Q29sdW1ucygpOiBFeHByZXNzaW9uW10ge1xuICAgIHJldHVybiB0aGlzLl9wYXJ0aXRpb25CeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIE9SREVSIEJZIGNsYXVzZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgb3JkZXJCeUNvbHVtbnMoKTogT3JkZXJCeVtdIHtcbiAgICByZXR1cm4gdGhpcy5fb3JkZXJCeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHdpbmRvdyBzcGVjaWZpY2F0aW9uIGlzIGVtcHR5IChubyBQQVJUSVRJT04gQlkgb3IgT1JERVIgQlkpXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcnRpdGlvbkJ5Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9vcmRlckJ5Lmxlbmd0aCA9PT0gMDtcbiAgfVxufVxuIl19
@@ -1,8 +1,28 @@
1
1
  import { SelectQuery } from "../ast/SelectQuery";
2
2
  import { InsertQuery } from "../ast/InsertQuery";
3
+ import { UpdateQuery } from "../ast/UpdateQuery";
4
+ import { DeleteQuery } from "../ast/DeleteQuery";
5
+ import { CreateTableQuery } from "../ast/CreateTableQuery";
6
+ import { CreateVirtualTableQuery, VirtualTableModule } from "../ast/CreateVirtualTableQuery";
7
+ import { CreateIndexQuery } from "../ast/CreateIndexQuery";
8
+ import { CreateViewQuery } from "../ast/CreateViewQuery";
9
+ import { AlterTableQuery } from "../ast/AlterTableQuery";
10
+ import { DropTableQuery } from "../ast/DropTableQuery";
11
+ import { DropIndexQuery } from "../ast/DropIndexQuery";
12
+ import { DropViewQuery } from "../ast/DropViewQuery";
3
13
  import { SqlTreeNode } from "../ast/Abstractions";
4
14
  export declare class QueryBuilder {
5
15
  static select(): SelectQuery;
6
16
  static insertInto(tableName: string): InsertQuery;
17
+ static update(tableName: string): UpdateQuery;
18
+ static deleteFrom(tableName: string): DeleteQuery;
19
+ static createTable(tableName: string): CreateTableQuery;
20
+ static createVirtualTable(tableName: string, module: VirtualTableModule): CreateVirtualTableQuery;
21
+ static createIndex(indexName: string): CreateIndexQuery;
22
+ static alterTable(tableName: string): AlterTableQuery;
23
+ static dropTable(tableName: string): DropTableQuery;
24
+ static dropIndex(indexName: string): DropIndexQuery;
25
+ static createView(viewName: string): CreateViewQuery;
26
+ static dropView(viewName: string): DropViewQuery;
7
27
  static clone(node: SqlTreeNode): SqlTreeNode;
8
28
  }
@@ -3,6 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.QueryBuilder = void 0;
4
4
  const SelectQuery_1 = require("../ast/SelectQuery");
5
5
  const InsertQuery_1 = require("../ast/InsertQuery");
6
+ const UpdateQuery_1 = require("../ast/UpdateQuery");
7
+ const DeleteQuery_1 = require("../ast/DeleteQuery");
8
+ const CreateTableQuery_1 = require("../ast/CreateTableQuery");
9
+ const CreateVirtualTableQuery_1 = require("../ast/CreateVirtualTableQuery");
10
+ const CreateIndexQuery_1 = require("../ast/CreateIndexQuery");
11
+ const CreateViewQuery_1 = require("../ast/CreateViewQuery");
12
+ const AlterTableQuery_1 = require("../ast/AlterTableQuery");
13
+ const DropTableQuery_1 = require("../ast/DropTableQuery");
14
+ const DropIndexQuery_1 = require("../ast/DropIndexQuery");
15
+ const DropViewQuery_1 = require("../ast/DropViewQuery");
6
16
  const QueryIdentityTransformer_1 = require("../visitor/QueryIdentityTransformer");
7
17
  class QueryBuilder {
8
18
  static select() {
@@ -11,10 +21,40 @@ class QueryBuilder {
11
21
  static insertInto(tableName) {
12
22
  return new InsertQuery_1.InsertQuery(tableName);
13
23
  }
24
+ static update(tableName) {
25
+ return new UpdateQuery_1.UpdateQuery(tableName);
26
+ }
27
+ static deleteFrom(tableName) {
28
+ return new DeleteQuery_1.DeleteQuery(tableName);
29
+ }
30
+ static createTable(tableName) {
31
+ return new CreateTableQuery_1.CreateTableQuery(tableName);
32
+ }
33
+ static createVirtualTable(tableName, module) {
34
+ return new CreateVirtualTableQuery_1.CreateVirtualTableQuery(tableName, module);
35
+ }
36
+ static createIndex(indexName) {
37
+ return new CreateIndexQuery_1.CreateIndexQuery(indexName);
38
+ }
39
+ static alterTable(tableName) {
40
+ return new AlterTableQuery_1.AlterTableQuery(tableName);
41
+ }
42
+ static dropTable(tableName) {
43
+ return new DropTableQuery_1.DropTableQuery(tableName);
44
+ }
45
+ static dropIndex(indexName) {
46
+ return new DropIndexQuery_1.DropIndexQuery(indexName);
47
+ }
48
+ static createView(viewName) {
49
+ return new CreateViewQuery_1.CreateViewQuery(viewName);
50
+ }
51
+ static dropView(viewName) {
52
+ return new DropViewQuery_1.DropViewQuery(viewName);
53
+ }
14
54
  static clone(node) {
15
55
  const transformer = new QueryIdentityTransformer_1.QueryIdentityTransformer();
16
56
  return transformer.transform(node);
17
57
  }
18
58
  }
19
59
  exports.QueryBuilder = QueryBuilder;
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXIvUXVlcnlCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9EQUFpRDtBQUNqRCxvREFBaUQ7QUFFakQsa0ZBQStFO0FBRS9FLE1BQWEsWUFBWTtJQUVoQixNQUFNLENBQUMsTUFBTTtRQUNsQixPQUFPLElBQUkseUJBQVcsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQWlCO1FBQ3hDLE9BQU8sSUFBSSx5QkFBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQWdCO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksbURBQXdCLEVBQUUsQ0FBQztRQUNuRCxPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBZEQsb0NBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3RRdWVyeSB9IGZyb20gXCIuLi9hc3QvU2VsZWN0UXVlcnlcIjtcbmltcG9ydCB7IEluc2VydFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9JbnNlcnRRdWVyeVwiO1xuaW1wb3J0IHsgU3FsVHJlZU5vZGUgfSBmcm9tIFwiLi4vYXN0L0Fic3RyYWN0aW9uc1wiO1xuaW1wb3J0IHsgUXVlcnlJZGVudGl0eVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4uL3Zpc2l0b3IvUXVlcnlJZGVudGl0eVRyYW5zZm9ybWVyXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUJ1aWxkZXIge1xuXG4gIHB1YmxpYyBzdGF0aWMgc2VsZWN0KCk6IFNlbGVjdFF1ZXJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5KCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGluc2VydEludG8odGFibGVOYW1lOiBzdHJpbmcpOiBJbnNlcnRRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeSh0YWJsZU5hbWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjbG9uZShub2RlOlNxbFRyZWVOb2RlKTpTcWxUcmVlTm9kZSB7XG4gICAgY29uc3QgdHJhbnNmb3JtZXIgPSBuZXcgUXVlcnlJZGVudGl0eVRyYW5zZm9ybWVyKCk7XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShub2RlKTtcbiAgfVxufVxuIl19
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXIvUXVlcnlCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9EQUFpRDtBQUNqRCxvREFBaUQ7QUFDakQsb0RBQWlEO0FBQ2pELG9EQUFpRDtBQUNqRCw4REFBMkQ7QUFDM0QsNEVBQTZGO0FBQzdGLDhEQUEyRDtBQUMzRCw0REFBeUQ7QUFDekQsNERBQXlEO0FBQ3pELDBEQUF1RDtBQUN2RCwwREFBdUQ7QUFDdkQsd0RBQXFEO0FBRXJELGtGQUErRTtBQUUvRSxNQUFhLFlBQVk7SUFFaEIsTUFBTSxDQUFDLE1BQU07UUFDbEIsT0FBTyxJQUFJLHlCQUFXLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFpQjtRQUN4QyxPQUFPLElBQUkseUJBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFpQjtRQUNwQyxPQUFPLElBQUkseUJBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFpQjtRQUN4QyxPQUFPLElBQUkseUJBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFpQjtRQUN6QyxPQUFPLElBQUksbUNBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLE1BQTBCO1FBQzVFLE9BQU8sSUFBSSxpREFBdUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBaUI7UUFDekMsT0FBTyxJQUFJLG1DQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQWlCO1FBQ3hDLE9BQU8sSUFBSSxpQ0FBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQWlCO1FBQ3ZDLE9BQU8sSUFBSSwrQkFBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQWlCO1FBQ3ZDLE9BQU8sSUFBSSwrQkFBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQWdCO1FBQ3ZDLE9BQU8sSUFBSSxpQ0FBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQ3JDLE9BQU8sSUFBSSw2QkFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQWdCO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksbURBQXdCLEVBQUUsQ0FBQztRQUNuRCxPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBdERELG9DQXNEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9TZWxlY3RRdWVyeVwiO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0luc2VydFF1ZXJ5XCI7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvVXBkYXRlUXVlcnlcIjtcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9EZWxldGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVGFibGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnksIFZpcnR1YWxUYWJsZU1vZHVsZSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZUluZGV4UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0NyZWF0ZUluZGV4UXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZVZpZXdRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBBbHRlclRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0FsdGVyVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgRHJvcFRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BUYWJsZVF1ZXJ5XCI7XG5pbXBvcnQgeyBEcm9wSW5kZXhRdWVyeSB9IGZyb20gXCIuLi9hc3QvRHJvcEluZGV4UXVlcnlcIjtcbmltcG9ydCB7IERyb3BWaWV3UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BWaWV3UXVlcnlcIjtcbmltcG9ydCB7IFNxbFRyZWVOb2RlIH0gZnJvbSBcIi4uL2FzdC9BYnN0cmFjdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXJ5SWRlbnRpdHlUcmFuc2Zvcm1lciB9IGZyb20gXCIuLi92aXNpdG9yL1F1ZXJ5SWRlbnRpdHlUcmFuc2Zvcm1lclwiO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlCdWlsZGVyIHtcblxuICBwdWJsaWMgc3RhdGljIHNlbGVjdCgpOiBTZWxlY3RRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeSgpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbnNlcnRJbnRvKHRhYmxlTmFtZTogc3RyaW5nKTogSW5zZXJ0UXVlcnkge1xuICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnkodGFibGVOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlKHRhYmxlTmFtZTogc3RyaW5nKTogVXBkYXRlUXVlcnkge1xuICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnkodGFibGVOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVsZXRlRnJvbSh0YWJsZU5hbWU6IHN0cmluZyk6IERlbGV0ZVF1ZXJ5IHtcbiAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogQ3JlYXRlVGFibGVRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVZpcnR1YWxUYWJsZSh0YWJsZU5hbWU6IHN0cmluZywgbW9kdWxlOiBWaXJ0dWFsVGFibGVNb2R1bGUpOiBDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeSh0YWJsZU5hbWUsIG1vZHVsZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUluZGV4KGluZGV4TmFtZTogc3RyaW5nKTogQ3JlYXRlSW5kZXhRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleFF1ZXJ5KGluZGV4TmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFsdGVyVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBBbHRlclRhYmxlUXVlcnkge1xuICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRyb3BUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IERyb3BUYWJsZVF1ZXJ5IHtcbiAgICByZXR1cm4gbmV3IERyb3BUYWJsZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRyb3BJbmRleChpbmRleE5hbWU6IHN0cmluZyk6IERyb3BJbmRleFF1ZXJ5IHtcbiAgICByZXR1cm4gbmV3IERyb3BJbmRleFF1ZXJ5KGluZGV4TmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVZpZXcodmlld05hbWU6IHN0cmluZyk6IENyZWF0ZVZpZXdRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3UXVlcnkodmlld05hbWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkcm9wVmlldyh2aWV3TmFtZTogc3RyaW5nKTogRHJvcFZpZXdRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBEcm9wVmlld1F1ZXJ5KHZpZXdOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2xvbmUobm9kZTpTcWxUcmVlTm9kZSk6U3FsVHJlZU5vZGUge1xuICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gbmV3IFF1ZXJ5SWRlbnRpdHlUcmFuc2Zvcm1lcigpO1xuICAgIHJldHVybiB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obm9kZSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,9 +1,23 @@
1
1
  import { AliasableExpression, Expression } from "../ast/Abstractions";
2
2
  import { Alias } from "../ast/Alias";
3
+ import { BetweenExpression } from "../ast/BetweenExpression";
3
4
  import { BinaryExpression } from "../ast/BinaryExpression";
4
5
  import { CaseExpression } from "../ast/CaseExpression";
6
+ import { CastExpression } from "../ast/CastExpression";
7
+ import { CollateExpression } from "../ast/CollateExpression";
8
+ import { SubqueryExpression } from "../ast/SubqueryExpression";
5
9
  import { Column, ColumnLike } from "../ast/Column";
6
10
  import { Concat } from "../ast/Concat";
11
+ import { AlterTableQuery } from "../ast/AlterTableQuery";
12
+ import { CreateIndexQuery } from "../ast/CreateIndexQuery";
13
+ import { CreateTableQuery } from "../ast/CreateTableQuery";
14
+ import { CreateVirtualTableQuery, VirtualTableModule } from "../ast/CreateVirtualTableQuery";
15
+ import { CreateViewQuery } from "../ast/CreateViewQuery";
16
+ import { DeleteQuery } from "../ast/DeleteQuery";
17
+ import { DropIndexQuery } from "../ast/DropIndexQuery";
18
+ import { DropTableQuery } from "../ast/DropTableQuery";
19
+ import { DropViewQuery } from "../ast/DropViewQuery";
20
+ import { UpdateQuery } from "../ast/UpdateQuery";
7
21
  import { ExistsExpression } from "../ast/ExistsExpression";
8
22
  import { From, FromLike } from "../ast/From";
9
23
  import { FunctionExpression } from "../ast/FunctionExpression";
@@ -34,6 +48,10 @@ export declare function LT(left: LazyExpression, right: LazyExpression): BinaryE
34
48
  export declare function GTE(left: LazyExpression, right: LazyExpression): BinaryExpression;
35
49
  export declare function LTE(left: LazyExpression, right: LazyExpression): BinaryExpression;
36
50
  export declare function LIKE(left: LazyExpression, right: LazyExpression): BinaryExpression;
51
+ export declare function GLOB(left: LazyExpression, right: LazyExpression): BinaryExpression;
52
+ export declare function MATCH(left: LazyExpression, right: LazyExpression): BinaryExpression;
53
+ export declare function BETWEEN(operand: LazyExpression, low: LazyExpression, high: LazyExpression): BetweenExpression;
54
+ export declare function NOT_BETWEEN(operand: LazyExpression, low: LazyExpression, high: LazyExpression): BetweenExpression;
37
55
  export declare function IS_NULL(expr: LazyExpression): UnaryExpression;
38
56
  export declare function IS_NOT_NULL(expr: LazyExpression): UnaryExpression;
39
57
  export declare function PLUS(left: LazyExpression, right?: LazyExpression): AliasableExpression;
@@ -48,6 +66,8 @@ export declare function SELECT(...args: (FromLike | Join | LazyColumn)[]): Selec
48
66
  export declare function SELECT_DISTINCT(...args: (FromLike | Join | LazyColumn)[]): SelectQuery;
49
67
  export declare function FROM(arg1: LazyFrom, arg2?: string): From | Alias<From>;
50
68
  export declare function UNION(...queries: SelectQuery[]): SelectQuery;
69
+ export declare function INTERSECT(...queries: SelectQuery[]): SelectQuery;
70
+ export declare function EXCEPT(...queries: SelectQuery[]): SelectQuery;
51
71
  export declare function JOIN(tableName: string, alias: string, on: LazyExpression): Join;
52
72
  export declare function LEFT_JOIN(tableName: string, alias: string, on: LazyExpression): Join;
53
73
  export declare function CROSS_JOIN(tableName: string, alias: string): Join;
@@ -59,6 +79,7 @@ export declare function FN_DISTINCT(name: FunctionName, ...args: LazyExpression[
59
79
  export declare function CONCAT(...args: LazyExpression[]): Concat;
60
80
  export declare function PARAM(name?: string): Param;
61
81
  export declare function INSERT(tableName: string, columns: string[], values: LazyExpression[]): InsertQuery;
82
+ export declare function INSERT_INTO(tableName: string): InsertQuery;
62
83
  export declare function INSERT_OR_REPLACE(database: string, table: string, columns: string[], values: LazyExpression[]): InsertQuery;
63
84
  export declare function INSERT_OR_REPLACE(tableName: string, columns: string[], values: LazyExpression[]): InsertQuery;
64
85
  export declare function IN(left: LazyExpression, ...values: LazyExpression[]): InExpression;
@@ -72,6 +93,36 @@ export declare function NOT_IN(left: LazyExpression[], values: SelectQuery): InE
72
93
  export declare function GROUP_BY(...columns: (Column | string)[]): Column[];
73
94
  export declare function HAVING(expr: LazyExpression): Expression;
74
95
  export declare function ORDER_BY(column: Column | string, direction?: OrderByDirection): OrderBy;
96
+ /**
97
+ * Creates a PARTITION BY clause for window functions.
98
+ *
99
+ * Returns an Expression[] that can be passed to FunctionExpression.over()
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * FN('RANK').over(PARTITION_BY('category'), ORDER_BY('price', DESC))
104
+ * // RANK() OVER (PARTITION BY category ORDER BY price DESC)
105
+ *
106
+ * FN('ROW_NUMBER').over(PARTITION_BY('department', 'location'), ORDER_BY('salary'))
107
+ * // ROW_NUMBER() OVER (PARTITION BY department, location ORDER BY salary)
108
+ * ```
109
+ */
110
+ export declare function PARTITION_BY(...columns: (Column | string)[]): Expression[];
75
111
  export declare function CASE(lazyCases: LazyCaseItem[]): CaseExpression;
76
112
  export declare function WITH(name: string, query: SelectQuery): With;
113
+ export declare function DELETE_FROM(tableName: string): DeleteQuery;
114
+ export declare function UPDATE(tableName: string): UpdateQuery;
115
+ export declare function CREATE_TABLE(tableName: string): CreateTableQuery;
116
+ export declare function CREATE_VIRTUAL_TABLE(tableName: string, module: VirtualTableModule): CreateVirtualTableQuery;
117
+ export declare function CREATE_INDEX(indexName: string): CreateIndexQuery;
118
+ export declare function ALTER_TABLE(tableName: string): AlterTableQuery;
119
+ export declare function DROP_TABLE(tableName: string): DropTableQuery;
120
+ export declare function DROP_INDEX(indexName: string): DropIndexQuery;
121
+ export declare function CREATE_VIEW(viewName: string): CreateViewQuery;
122
+ export declare function DROP_VIEW(viewName: string): DropViewQuery;
123
+ export declare function ALIAS(referent: AliasableExpression, alias: string): Alias<AliasableExpression>;
124
+ export declare function ALIAS(referent: From, alias: string): Alias<From>;
125
+ export declare function CAST(expr: LazyExpression, targetType: string): CastExpression;
126
+ export declare function COLLATE(expr: LazyExpression, collation: string): CollateExpression;
127
+ export declare function SUBQUERY(query: SelectQuery): SubqueryExpression;
77
128
  export {};
@@ -9,6 +9,10 @@ exports.LT = LT;
9
9
  exports.GTE = GTE;
10
10
  exports.LTE = LTE;
11
11
  exports.LIKE = LIKE;
12
+ exports.GLOB = GLOB;
13
+ exports.MATCH = MATCH;
14
+ exports.BETWEEN = BETWEEN;
15
+ exports.NOT_BETWEEN = NOT_BETWEEN;
12
16
  exports.IS_NULL = IS_NULL;
13
17
  exports.IS_NOT_NULL = IS_NOT_NULL;
14
18
  exports.PLUS = PLUS;
@@ -23,6 +27,8 @@ exports.SELECT = SELECT;
23
27
  exports.SELECT_DISTINCT = SELECT_DISTINCT;
24
28
  exports.FROM = FROM;
25
29
  exports.UNION = UNION;
30
+ exports.INTERSECT = INTERSECT;
31
+ exports.EXCEPT = EXCEPT;
26
32
  exports.JOIN = JOIN;
27
33
  exports.LEFT_JOIN = LEFT_JOIN;
28
34
  exports.CROSS_JOIN = CROSS_JOIN;
@@ -34,18 +40,38 @@ exports.FN_DISTINCT = FN_DISTINCT;
34
40
  exports.CONCAT = CONCAT;
35
41
  exports.PARAM = PARAM;
36
42
  exports.INSERT = INSERT;
43
+ exports.INSERT_INTO = INSERT_INTO;
37
44
  exports.INSERT_OR_REPLACE = INSERT_OR_REPLACE;
38
45
  exports.IN = IN;
39
46
  exports.NOT_IN = NOT_IN;
40
47
  exports.GROUP_BY = GROUP_BY;
41
48
  exports.HAVING = HAVING;
42
49
  exports.ORDER_BY = ORDER_BY;
50
+ exports.PARTITION_BY = PARTITION_BY;
43
51
  exports.CASE = CASE;
44
52
  exports.WITH = WITH;
53
+ exports.DELETE_FROM = DELETE_FROM;
54
+ exports.UPDATE = UPDATE;
55
+ exports.CREATE_TABLE = CREATE_TABLE;
56
+ exports.CREATE_VIRTUAL_TABLE = CREATE_VIRTUAL_TABLE;
57
+ exports.CREATE_INDEX = CREATE_INDEX;
58
+ exports.ALTER_TABLE = ALTER_TABLE;
59
+ exports.DROP_TABLE = DROP_TABLE;
60
+ exports.DROP_INDEX = DROP_INDEX;
61
+ exports.CREATE_VIEW = CREATE_VIEW;
62
+ exports.DROP_VIEW = DROP_VIEW;
63
+ exports.ALIAS = ALIAS;
64
+ exports.CAST = CAST;
65
+ exports.COLLATE = COLLATE;
66
+ exports.SUBQUERY = SUBQUERY;
45
67
  const Abstractions_1 = require("../ast/Abstractions");
46
68
  const Alias_1 = require("../ast/Alias");
69
+ const BetweenExpression_1 = require("../ast/BetweenExpression");
47
70
  const BinaryExpression_1 = require("../ast/BinaryExpression");
48
71
  const CaseExpression_1 = require("../ast/CaseExpression");
72
+ const CastExpression_1 = require("../ast/CastExpression");
73
+ const CollateExpression_1 = require("../ast/CollateExpression");
74
+ const SubqueryExpression_1 = require("../ast/SubqueryExpression");
49
75
  const Column_1 = require("../ast/Column");
50
76
  const Concat_1 = require("../ast/Concat");
51
77
  const ExistsExpression_1 = require("../ast/ExistsExpression");
@@ -88,6 +114,18 @@ function LTE(left, right) {
88
114
  function LIKE(left, right) {
89
115
  return new BinaryExpression_1.BinaryExpression(LAZY(left), Operator_1.Operator.LIKE, LAZY(right));
90
116
  }
117
+ function GLOB(left, right) {
118
+ return new BinaryExpression_1.BinaryExpression(LAZY(left), Operator_1.Operator.GLOB, LAZY(right));
119
+ }
120
+ function MATCH(left, right) {
121
+ return new BinaryExpression_1.BinaryExpression(LAZY(left), Operator_1.Operator.MATCH, LAZY(right));
122
+ }
123
+ function BETWEEN(operand, low, high) {
124
+ return new BetweenExpression_1.BetweenExpression(LAZY(operand), LAZY(low), LAZY(high), false);
125
+ }
126
+ function NOT_BETWEEN(operand, low, high) {
127
+ return new BetweenExpression_1.BetweenExpression(LAZY(operand), LAZY(low), LAZY(high), true);
128
+ }
91
129
  function IS_NULL(expr) {
92
130
  return new UnaryExpression_1.UnaryExpression(Operator_1.Operator.IS_NULL, LAZY(expr));
93
131
  }
@@ -208,6 +246,16 @@ function UNION(...queries) {
208
246
  queries.forEach(q => query.union(q));
209
247
  return query;
210
248
  }
249
+ function INTERSECT(...queries) {
250
+ const query = QueryBuilder_1.QueryBuilder.select();
251
+ queries.forEach(q => query.intersect(q));
252
+ return query;
253
+ }
254
+ function EXCEPT(...queries) {
255
+ const query = QueryBuilder_1.QueryBuilder.select();
256
+ queries.forEach(q => query.except(q));
257
+ return query;
258
+ }
211
259
  // --- Joins ---
212
260
  function JOIN(tableName, alias, on) {
213
261
  return new Join_1.Join(Join_1.JoinType.INNER, tableName, alias, LAZY(on));
@@ -248,6 +296,9 @@ function INSERT(tableName, columns, values) {
248
296
  .columns(...columns)
249
297
  .values(...values.map(LAZY));
250
298
  }
299
+ function INSERT_INTO(tableName) {
300
+ return QueryBuilder_1.QueryBuilder.insertInto(tableName);
301
+ }
251
302
  function INSERT_OR_REPLACE(arg1, arg2, arg3, arg4) {
252
303
  // Four-argument form: INSERT_OR_REPLACE(database, table, columns, values)
253
304
  if (typeof arg2 === 'string' && Array.isArray(arg3) && Array.isArray(arg4)) {
@@ -327,6 +378,23 @@ function HAVING(expr) {
327
378
  function ORDER_BY(column, direction = OrderBy_1.OrderByDirection.ASC) {
328
379
  return new OrderBy_1.OrderBy(typeof column === 'string' ? COLUMN(column) : column, direction);
329
380
  }
381
+ /**
382
+ * Creates a PARTITION BY clause for window functions.
383
+ *
384
+ * Returns an Expression[] that can be passed to FunctionExpression.over()
385
+ *
386
+ * @example
387
+ * ```typescript
388
+ * FN('RANK').over(PARTITION_BY('category'), ORDER_BY('price', DESC))
389
+ * // RANK() OVER (PARTITION BY category ORDER BY price DESC)
390
+ *
391
+ * FN('ROW_NUMBER').over(PARTITION_BY('department', 'location'), ORDER_BY('salary'))
392
+ * // ROW_NUMBER() OVER (PARTITION BY department, location ORDER BY salary)
393
+ * ```
394
+ */
395
+ function PARTITION_BY(...columns) {
396
+ return columns.map(col => (typeof col === 'string' ? COLUMN(col) : col));
397
+ }
330
398
  // --- CASE Expressions ---
331
399
  function CASE(lazyCases) {
332
400
  let elseExpr = undefined;
@@ -351,6 +419,62 @@ function CASE(lazyCases) {
351
419
  function WITH(name, query) {
352
420
  return new With_1.With(name, query);
353
421
  }
422
+ // --- Delete Queries ---
423
+ function DELETE_FROM(tableName) {
424
+ return QueryBuilder_1.QueryBuilder.deleteFrom(tableName);
425
+ }
426
+ // --- Update Queries ---
427
+ function UPDATE(tableName) {
428
+ return QueryBuilder_1.QueryBuilder.update(tableName);
429
+ }
430
+ // --- Create Table Queries ---
431
+ function CREATE_TABLE(tableName) {
432
+ return QueryBuilder_1.QueryBuilder.createTable(tableName);
433
+ }
434
+ // --- Create Virtual Table Queries ---
435
+ function CREATE_VIRTUAL_TABLE(tableName, module) {
436
+ return QueryBuilder_1.QueryBuilder.createVirtualTable(tableName, module);
437
+ }
438
+ // --- Create Index Queries ---
439
+ function CREATE_INDEX(indexName) {
440
+ return QueryBuilder_1.QueryBuilder.createIndex(indexName);
441
+ }
442
+ // --- Alter Table Queries ---
443
+ function ALTER_TABLE(tableName) {
444
+ return QueryBuilder_1.QueryBuilder.alterTable(tableName);
445
+ }
446
+ // --- Drop Queries ---
447
+ function DROP_TABLE(tableName) {
448
+ return QueryBuilder_1.QueryBuilder.dropTable(tableName);
449
+ }
450
+ function DROP_INDEX(indexName) {
451
+ return QueryBuilder_1.QueryBuilder.dropIndex(indexName);
452
+ }
453
+ // --- View Queries ---
454
+ function CREATE_VIEW(viewName) {
455
+ return QueryBuilder_1.QueryBuilder.createView(viewName);
456
+ }
457
+ function DROP_VIEW(viewName) {
458
+ return QueryBuilder_1.QueryBuilder.dropView(viewName);
459
+ }
460
+ function ALIAS(referent, alias) {
461
+ if (referent instanceof From_1.From) {
462
+ return new Alias_1.Alias(referent, alias);
463
+ }
464
+ return new Alias_1.Alias(referent, alias);
465
+ }
466
+ // --- CAST Expressions ---
467
+ function CAST(expr, targetType) {
468
+ return new CastExpression_1.CastExpression(LAZY(expr), targetType);
469
+ }
470
+ // --- COLLATE Expressions ---
471
+ function COLLATE(expr, collation) {
472
+ return new CollateExpression_1.CollateExpression(LAZY(expr), collation);
473
+ }
474
+ // --- Subquery Expressions ---
475
+ function SUBQUERY(query) {
476
+ return new SubqueryExpression_1.SubqueryExpression(query);
477
+ }
354
478
  // --- Literal Conversion ---
355
479
  function LAZY(value) {
356
480
  if (value === null) {
@@ -372,4 +496,4 @@ function LAZY(value) {
372
496
  throw new Error(`Unsupported value type: ${typeof value}`);
373
497
  }
374
498
  }
375
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvcnRoYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXIvU2hvcnRoYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBK0JBLGtCQUVDO0FBSUQsZ0JBRUM7QUFFRCx3QkFFQztBQUVELGtCQUVDO0FBRUQsZ0JBRUM7QUFFRCxnQkFFQztBQUVELGtCQUVDO0FBRUQsa0JBRUM7QUFFRCxvQkFFQztBQUVELDBCQUVDO0FBRUQsa0NBRUM7QUFFRCxvQkFNQztBQUVELHNCQU1DO0FBRUQsNEJBRUM7QUFFRCx3QkFFQztBQUVELGtCQU9DO0FBRUQsZ0JBT0M7QUFJRCx3QkFFQztBQUlELHdCQUVDO0FBSUQsd0JBRUM7QUFFRCwwQ0FFQztBQTJCRCxvQkFzQkM7QUFFRCxzQkFJQztBQUlELG9CQUVDO0FBRUQsOEJBRUM7QUFFRCxnQ0FFQztBQUlELGtCQUVDO0FBRUQsc0JBRUM7QUFFRCxrQkFFQztBQUVELGdCQUVDO0FBRUQsa0NBRUM7QUFJRCx3QkFFQztBQUlELHNCQUVDO0FBSUQsd0JBSUM7QUFJRCw4Q0FtQkM7QUFXRCxnQkFxQkM7QUFTRCx3QkFxQkM7QUFFRCw0QkFFQztBQUVELHdCQUVDO0FBRUQsNEJBRUM7QUFJRCxvQkFpQkM7QUFJRCxvQkFFQztBQXRYRCxzREFBc0U7QUFDdEUsd0NBQXFDO0FBQ3JDLDhEQUEyRDtBQUMzRCwwREFBaUU7QUFDakUsMENBQW1EO0FBQ25ELDBDQUF1QztBQUN2Qyw4REFBMkQ7QUFDM0Qsc0NBQW9GO0FBQ3BGLGtFQUErRDtBQUUvRCxzREFBbUQ7QUFFbkQsc0NBQTZDO0FBQzdDLDhDQUFtRjtBQUNuRiw4Q0FBMkM7QUFDM0MsNENBQTJEO0FBQzNELG9EQUFpRDtBQUNqRCw0REFBeUQ7QUFDekQsc0NBQW1DO0FBQ25DLGlEQUE4QztBQVk5QyxTQUFnQixHQUFHLENBQUMsR0FBbUI7SUFDckMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsQ0FBQztB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RUQsNkJBQTZCO0FBRTdCLFNBQVMsSUFBSSxDQUFDLEtBQXFCO0lBQ2pDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25CLE9BQU8sc0JBQVcsQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztTQUFNLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsT0FBTyxJQUFJLHdCQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7U0FBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sSUFBSSx3QkFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sSUFBSSx3QkFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxJQUFJLEtBQUssWUFBWSxrQ0FBbUIsRUFBRSxDQUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixPQUFPLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbGlhc2FibGVFeHByZXNzaW9uLCBFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9BYnN0cmFjdGlvbnNcIjtcbmltcG9ydCB7IEFsaWFzIH0gZnJvbSBcIi4uL2FzdC9BbGlhc1wiO1xuaW1wb3J0IHsgQmluYXJ5RXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQmluYXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ2FzZUV4cHJlc3Npb24sIENhc2VJdGVtIH0gZnJvbSBcIi4uL2FzdC9DYXNlRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sdW1uLCBDb2x1bW5MaWtlIH0gZnJvbSBcIi4uL2FzdC9Db2x1bW5cIjtcbmltcG9ydCB7IENvbmNhdCB9IGZyb20gXCIuLi9hc3QvQ29uY2F0XCI7XG5pbXBvcnQgeyBFeGlzdHNFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9FeGlzdHNFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBGcm9tLCBGcm9tTGlrZSwgSnNvbkVhY2hGcm9tLCBTdWJxdWVyeUZyb20sIFRhYmxlRnJvbSB9IGZyb20gXCIuLi9hc3QvRnJvbVwiO1xuaW1wb3J0IHsgRnVuY3Rpb25FeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9GdW5jdGlvbkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IEZ1bmN0aW9uTmFtZSB9IGZyb20gXCIuLi9hc3QvRnVuY3Rpb25OYW1lXCI7XG5pbXBvcnQgeyBJbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0luRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0luc2VydFF1ZXJ5XCI7XG5pbXBvcnQgeyBKb2luLCBKb2luVHlwZSB9IGZyb20gXCIuLi9hc3QvSm9pblwiO1xuaW1wb3J0IHsgTnVsbExpdGVyYWwsIE51bWJlckxpdGVyYWwsIFBhcmFtLCBTdHJpbmdMaXRlcmFsIH0gZnJvbSBcIi4uL2FzdC9MaXRlcmFsc1wiO1xuaW1wb3J0IHsgT3BlcmF0b3IgfSBmcm9tIFwiLi4vYXN0L09wZXJhdG9yXCI7XG5pbXBvcnQgeyBPcmRlckJ5LCBPcmRlckJ5RGlyZWN0aW9uIH0gZnJvbSBcIi4uL2FzdC9PcmRlckJ5XCI7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeSB9IGZyb20gXCIuLi9hc3QvU2VsZWN0UXVlcnlcIjtcbmltcG9ydCB7IFVuYXJ5RXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvVW5hcnlFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBXaXRoIH0gZnJvbSBcIi4uL2FzdC9XaXRoXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWVyeUJ1aWxkZXJcIjtcblxudHlwZSBQcmltaXRpdmVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuXG50eXBlIExhenlFeHByZXNzaW9uID0gRXhwcmVzc2lvbiB8IFByaW1pdGl2ZVZhbHVlO1xuXG50eXBlIExhenlDYXNlSXRlbSA9IHsgV0hFTj86IExhenlFeHByZXNzaW9uOyBUSEVOPzogTGF6eUV4cHJlc3Npb247IEVMU0U/OiBMYXp5RXhwcmVzc2lvbiB9O1xuXG50eXBlIExhenlGcm9tID0gc3RyaW5nIHwgRnJvbSB8IEFsaWFzPEZyb20+IHwgU2VsZWN0UXVlcnk7XG5cbnR5cGUgTGF6eUNvbHVtbiA9IENvbHVtbkxpa2UgfCBQcmltaXRpdmVWYWx1ZTtcblxuZXhwb3J0IGZ1bmN0aW9uIFZBTCh2YWw6IFByaW1pdGl2ZVZhbHVlKTogQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIHJldHVybiBMQVpZKHZhbCk7XG59XG5cbi8vIC0tLSBPcGVyYXRvcnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBFUShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5FUVVBTFMsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5PVF9FUShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5OT1RfRVFVQUxTLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBOT1QoZXhwcjogTGF6eUV4cHJlc3Npb24pOiBVbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5OT1QsIExBWlkoZXhwcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR1QobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0OiBMYXp5RXhwcmVzc2lvbik6IEJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEJpbmFyeUV4cHJlc3Npb24oTEFaWShsZWZ0KSwgT3BlcmF0b3IuR1JFQVRFUl9USEFOLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMVChsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5MRVNTX1RIQU4sIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEdURShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUwsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExURShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExJS0UobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0OiBMYXp5RXhwcmVzc2lvbik6IEJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEJpbmFyeUV4cHJlc3Npb24oTEFaWShsZWZ0KSwgT3BlcmF0b3IuTElLRSwgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSVNfTlVMTChleHByOiBMYXp5RXhwcmVzc2lvbik6IFVuYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yLklTX05VTEwsIExBWlkoZXhwcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSVNfTk9UX05VTEwoZXhwcjogTGF6eUV4cHJlc3Npb24pOiBVbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5JU19OT1RfTlVMTCwgTEFaWShleHByKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQTFVTKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodD86IExhenlFeHByZXNzaW9uKTogQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIGlmIChyaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3IuUExVUywgTEFaWShsZWZ0KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLlBMVVMsIExBWlkocmlnaHQpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gTUlOVVMobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0PzogTGF6eUV4cHJlc3Npb24pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKHJpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5NSU5VUywgTEFaWShsZWZ0KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1JTlVTLCBMQVpZKHJpZ2h0KSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1VTFRJUExZKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1VTFRJUExZLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBESVZJREUobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0OiBMYXp5RXhwcmVzc2lvbik6IEJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEJpbmFyeUV4cHJlc3Npb24oTEFaWShsZWZ0KSwgT3BlcmF0b3IuRElWSURFLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBTkQoLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IEFsaWFzYWJsZUV4cHJlc3Npb24ge1xuICBpZiAoYXJncy5sZW5ndGggPT0gMSkge1xuICAgIHJldHVybiBMQVpZKGFyZ3NbMF0pXG4gIH0gaWYgKGFyZ3MubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQU5EIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudHMnKTtcbiAgfVxuICByZXR1cm4gYXJncy5yZWR1Y2UoKGxlZnQsIHJpZ2h0KSA9PiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5BTkQsIExBWlkocmlnaHQpKSkgYXMgQWxpYXNhYmxlRXhwcmVzc2lvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE9SKC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09IDEpIHtcbiAgICByZXR1cm4gTEFaWShhcmdzWzBdKVxuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT1IgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50cycpO1xuICB9XG4gIHJldHVybiBhcmdzLnJlZHVjZSgobGVmdCwgcmlnaHQpID0+IG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk9SLCBMQVpZKHJpZ2h0KSkpIGFzIEFsaWFzYWJsZUV4cHJlc3Npb247XG59XG5cbi8vIC0tLSBFWElTVFMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBFWElTVFMoc3VicXVlcnk6IFNlbGVjdFF1ZXJ5KTogRXhpc3RzRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRXhpc3RzRXhwcmVzc2lvbihzdWJxdWVyeSk7XG59XG5cbi8vIC0tLSBDb2x1bW5zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQ09MVU1OKGFyZzE6IHN0cmluZywgYXJnMj86IHN0cmluZyk6IENvbHVtbiB7XG4gIHJldHVybiBuZXcgQ29sdW1uKGFyZzEsIGFyZzIpO1xufVxuXG4vLyAtLS0gU2VsZWN0IFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBTRUxFQ1QoLi4uYXJnczogKEZyb21MaWtlIHwgSm9pbiB8IExhenlDb2x1bW4pW10pOiBTZWxlY3RRdWVyeSB7XG4gIHJldHVybiBhZGRDbGF1c2VzVG9TZWxlY3QoUXVlcnlCdWlsZGVyLnNlbGVjdCgpLCBhcmdzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNFTEVDVF9ESVNUSU5DVCguLi5hcmdzOiAoRnJvbUxpa2UgfCBKb2luIHwgTGF6eUNvbHVtbilbXSk6IFNlbGVjdFF1ZXJ5IHtcbiAgcmV0dXJuIGFkZENsYXVzZXNUb1NlbGVjdChRdWVyeUJ1aWxkZXIuc2VsZWN0KCkuZGlzdGluY3QoKSwgYXJncyk7XG59XG5cbmZ1bmN0aW9uIGFkZENsYXVzZXNUb1NlbGVjdChxdWVyeTogU2VsZWN0UXVlcnksIGFyZ3M6IChGcm9tTGlrZSB8IEpvaW4gfCBMYXp5Q29sdW1uKVtdKTogU2VsZWN0UXVlcnkge1xuICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBKb2luKSB7XG4gICAgICBxdWVyeS5qb2luKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBGcm9tKSB7XG4gICAgICBxdWVyeS5mcm9tKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBDb2x1bW4pIHtcbiAgICAgIHF1ZXJ5LmNvbHVtbihhcmcpO1xuICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQWxpYXMpIHtcbiAgICAgIGNvbnN0IHJlZmVyZW50ID0gYXJnLnJlZmVyZW50IGFzIGFueTtcbiAgICAgIGlmIChyZWZlcmVudCBpbnN0YW5jZW9mIEZyb20pIHtcbiAgICAgICAgcXVlcnkuZnJvbShhcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkuY29sdW1uKGFyZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgJ3JlZmVyZW50JyBpbiAoYXJnIGFzIGFueSkgJiYgJ2FsaWFzJyBpbiAoYXJnIGFzIGFueSkpIHtcbiAgICAgIC8vIEhhbmRsZSBDb2x1bW5MaWtlIG9iamVjdCBmb3JtXG4gICAgICBxdWVyeS5jb2x1bW4obmV3IEFsaWFzKChhcmcgYXMgYW55KS5yZWZlcmVudCwgKGFyZyBhcyBhbnkpLmFsaWFzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5LmNvbHVtbihMQVpZKGFyZyBhcyBMYXp5RXhwcmVzc2lvbikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcXVlcnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGUk9NKGFyZzE6IExhenlGcm9tLCBhcmcyPzogc3RyaW5nKTogRnJvbXxBbGlhczxGcm9tPiB7XG4gIC8vIFR3by1hcmd1bWVudCBmb3JtOiBGUk9NKGRhdGFiYXNlLCB0YWJsZSlcbiAgaWYgKHR5cGVvZiBhcmcxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYXJnMiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlRnJvbShgJHthcmcxfS4ke2FyZzJ9YCk7XG4gIH1cblxuICAvLyBTaW5nbGUtYXJndW1lbnQgZm9ybSAoZXhpc3RpbmcgYmVoYXZpb3IpXG4gIGlmICh0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlRnJvbShhcmcxKTtcbiAgfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgQWxpYXMpIHtcbiAgICByZXR1cm4gYXJnMTtcbiAgfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICByZXR1cm4gbmV3IFN1YnF1ZXJ5RnJvbShhcmcxKTtcbiAgfSBlbHNlIGlmIChcbiAgICBhcmcxIGluc3RhbmNlb2YgVGFibGVGcm9tIHx8XG4gICAgYXJnMSBpbnN0YW5jZW9mIFN1YnF1ZXJ5RnJvbSB8fFxuICAgIGFyZzEgaW5zdGFuY2VvZiBKc29uRWFjaEZyb21cbiAgKSB7XG4gICAgcmV0dXJuIGFyZzE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGFyZ3VtZW50IHR5cGUgZm9yIEZST006ICcgKyBKU09OLnN0cmluZ2lmeShhcmcxKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVOSU9OKC4uLnF1ZXJpZXM6IFNlbGVjdFF1ZXJ5W10pOiBTZWxlY3RRdWVyeSB7XG4gIGNvbnN0IHF1ZXJ5ID0gUXVlcnlCdWlsZGVyLnNlbGVjdCgpO1xuICBxdWVyaWVzLmZvckVhY2gocSA9PiBxdWVyeS51bmlvbihxKSk7XG4gIHJldHVybiBxdWVyeTtcbn1cblxuLy8gLS0tIEpvaW5zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gSk9JTih0YWJsZU5hbWU6IHN0cmluZywgYWxpYXM6IHN0cmluZywgb246IExhenlFeHByZXNzaW9uKTogSm9pbiB7XG4gIHJldHVybiBuZXcgSm9pbihKb2luVHlwZS5JTk5FUiwgdGFibGVOYW1lLCBhbGlhcywgTEFaWShvbikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTEVGVF9KT0lOKHRhYmxlTmFtZTogc3RyaW5nLCBhbGlhczogc3RyaW5nLCBvbjogTGF6eUV4cHJlc3Npb24pOiBKb2luIHtcbiAgcmV0dXJuIG5ldyBKb2luKEpvaW5UeXBlLkxFRlQsIHRhYmxlTmFtZSwgYWxpYXMsIExBWlkob24pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENST1NTX0pPSU4odGFibGVOYW1lOiBzdHJpbmcsIGFsaWFzOiBzdHJpbmcpOiBKb2luIHtcbiAgcmV0dXJuIG5ldyBKb2luKEpvaW5UeXBlLkNST1NTLCB0YWJsZU5hbWUsIGFsaWFzLCBuZXcgU3RyaW5nTGl0ZXJhbCgnVFJVRScpKTtcbn1cblxuLy8gLS0tIFNRTCBGdW5jdGlvbnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBBQlMoY29sdW1uOkV4cHJlc3Npb24pOiBGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbignQUJTJywgWyBjb2x1bW4gXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDT1VOVChjb2x1bW46Q29sdW1ufEZ1bmN0aW9uRXhwcmVzc2lvbnxBbGlhc2FibGVFeHByZXNzaW9uKTogRnVuY3Rpb25FeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oJ0NPVU5UJywgWyBjb2x1bW4gXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTVU0oY29sdW1uOkNvbHVtbnxGdW5jdGlvbkV4cHJlc3Npb258QWxpYXNhYmxlRXhwcmVzc2lvbik6IEZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKCdTVU0nLCBbIGNvbHVtbiBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZOKG5hbWU6IEZ1bmN0aW9uTmFtZSwgLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IEZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKG5hbWUsIGFyZ3MubWFwKExBWlkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZOX0RJU1RJTkNUKG5hbWU6IEZ1bmN0aW9uTmFtZSwgLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IEZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKG5hbWUsIGFyZ3MubWFwKExBWlkpLCB0cnVlKTtcbn1cblxuLy8gLS0tIENvbmNhdGVuYXRpb24gLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDT05DQVQoLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IENvbmNhdCB7XG4gIHJldHVybiBuZXcgQ29uY2F0KC4uLmFyZ3MubWFwKExBWlkpKTtcbn1cblxuLy8gLS0tIFBhcmFtZXRlcnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBQQVJBTShuYW1lPzogc3RyaW5nKTogUGFyYW0ge1xuICByZXR1cm4gbmV3IFBhcmFtKG5hbWUpO1xufVxuXG4vLyAtLS0gSW5zZXJ0IFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBJTlNFUlQodGFibGVOYW1lOiBzdHJpbmcsIGNvbHVtbnM6IHN0cmluZ1tdLCB2YWx1ZXM6IExhenlFeHByZXNzaW9uW10pOiBJbnNlcnRRdWVyeSB7XG4gIHJldHVybiBRdWVyeUJ1aWxkZXIuaW5zZXJ0SW50byh0YWJsZU5hbWUpXG4gICAgLmNvbHVtbnMoLi4uY29sdW1ucylcbiAgICAudmFsdWVzKC4uLnZhbHVlcy5tYXAoTEFaWSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSU5TRVJUX09SX1JFUExBQ0UoZGF0YWJhc2U6IHN0cmluZywgdGFibGU6IHN0cmluZywgY29sdW1uczogc3RyaW5nW10sIHZhbHVlczogTGF6eUV4cHJlc3Npb25bXSk6IEluc2VydFF1ZXJ5O1xuZXhwb3J0IGZ1bmN0aW9uIElOU0VSVF9PUl9SRVBMQUNFKHRhYmxlTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBzdHJpbmdbXSwgdmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdKTogSW5zZXJ0UXVlcnk7XG5leHBvcnQgZnVuY3Rpb24gSU5TRVJUX09SX1JFUExBQ0UoYXJnMTogc3RyaW5nLCBhcmcyOiBzdHJpbmcgfCBzdHJpbmdbXSwgYXJnMz86IHN0cmluZ1tdIHwgTGF6eUV4cHJlc3Npb25bXSwgYXJnND86IExhenlFeHByZXNzaW9uW10pOiBJbnNlcnRRdWVyeSB7XG4gIC8vIEZvdXItYXJndW1lbnQgZm9ybTogSU5TRVJUX09SX1JFUExBQ0UoZGF0YWJhc2UsIHRhYmxlLCBjb2x1bW5zLCB2YWx1ZXMpXG4gIGlmICh0eXBlb2YgYXJnMiA9PT0gJ3N0cmluZycgJiYgQXJyYXkuaXNBcnJheShhcmczKSAmJiBBcnJheS5pc0FycmF5KGFyZzQpKSB7XG4gICAgY29uc3QgcXVhbGlmaWVkVGFibGVOYW1lID0gYCR7YXJnMX0uJHthcmcyfWA7XG4gICAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5pbnNlcnRJbnRvKHF1YWxpZmllZFRhYmxlTmFtZSlcbiAgICAgIC5vclJlcGxhY2UoKVxuICAgICAgLmNvbHVtbnMoLi4uKGFyZzMgYXMgc3RyaW5nW10pKVxuICAgICAgLnZhbHVlcyguLi5hcmc0Lm1hcChMQVpZKSk7XG4gIH1cblxuICAvLyBUaHJlZS1hcmd1bWVudCBmb3JtOiBJTlNFUlRfT1JfUkVQTEFDRSh0YWJsZU5hbWUsIGNvbHVtbnMsIHZhbHVlcylcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJnMikgJiYgQXJyYXkuaXNBcnJheShhcmczKSkge1xuICAgIHJldHVybiBRdWVyeUJ1aWxkZXIuaW5zZXJ0SW50byhhcmcxKVxuICAgICAgLm9yUmVwbGFjZSgpXG4gICAgICAuY29sdW1ucyguLi5hcmcyKVxuICAgICAgLnZhbHVlcyguLi4oYXJnMyBhcyBMYXp5RXhwcmVzc2lvbltdKS5tYXAoTEFaWSkpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBmb3IgSU5TRVJUX09SX1JFUExBQ0UnKTtcbn1cblxuLy8gLS0tIE90aGVyIENsYXVzZXMgLS0tXG5cbi8vIE92ZXJsb2FkcyBmb3IgSU5cbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgLi4udmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdKTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIElOKGxlZnQ6IExhenlFeHByZXNzaW9uLCB2YWx1ZXM6IFNlbGVjdFF1ZXJ5KTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIElOKGxlZnQ6IExhenlFeHByZXNzaW9uW10sIHZhbHVlczogTGF6eUV4cHJlc3Npb25bXVtdKTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIElOKGxlZnQ6IExhenlFeHByZXNzaW9uW10sIHZhbHVlczogU2VsZWN0UXVlcnkpOiBJbkV4cHJlc3Npb247XG5cbi8vIEltcGxlbWVudGF0aW9uIGZvciBJTlxuZXhwb3J0IGZ1bmN0aW9uIElOKGxlZnQ6IExhenlFeHByZXNzaW9uIHwgTGF6eUV4cHJlc3Npb25bXSwgLi4uYXJnczogYW55W10pOiBJbkV4cHJlc3Npb24ge1xuICBjb25zdCBub3QgPSBmYWxzZTtcbiAgY29uc3QgcmVzb2x2ZWRMZWZ0ID0gQXJyYXkuaXNBcnJheShsZWZ0KSA/IGxlZnQubWFwKExBWlkpIDogTEFaWShsZWZ0KTtcbiAgbGV0IHJlc29sdmVkVmFsdWVzOiBFeHByZXNzaW9uW11bXSB8IFNlbGVjdFF1ZXJ5O1xuICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSkge1xuICAgIC8vIE11bHRpLWNvbHVtbiBjYXNlXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBTZWxlY3RRdWVyeSkge1xuICAgICAgcmVzb2x2ZWRWYWx1ZXMgPSBhcmdzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZXNBcmcgPSBhcmdzWzBdIGFzIExhenlFeHByZXNzaW9uW11bXTtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gdmFsdWVzQXJnLm1hcChzZXQgPT4gc2V0Lm1hcChMQVpZKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNpbmdsZS1jb2x1bW4gY2FzZVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJnc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZWRWYWx1ZXMgPSBhcmdzLm1hcChMQVpZKS5tYXAodiA9PiBbdl0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IEluRXhwcmVzc2lvbihyZXNvbHZlZExlZnQsIHJlc29sdmVkVmFsdWVzLCBub3QpO1xufVxuXG4vLyBPdmVybG9hZHMgZm9yIE5PVF9JTlxuZXhwb3J0IGZ1bmN0aW9uIE5PVF9JTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgLi4udmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdKTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIE5PVF9JTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgdmFsdWVzOiBTZWxlY3RRdWVyeSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBOT1RfSU4obGVmdDogTGF6eUV4cHJlc3Npb25bXSwgdmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdW10pOiBJbkV4cHJlc3Npb247XG5leHBvcnQgZnVuY3Rpb24gTk9UX0lOKGxlZnQ6IExhenlFeHByZXNzaW9uW10sIHZhbHVlczogU2VsZWN0UXVlcnkpOiBJbkV4cHJlc3Npb247XG5cbi8vIEltcGxlbWVudGF0aW9uIGZvciBOT1RfSU5cbmV4cG9ydCBmdW5jdGlvbiBOT1RfSU4obGVmdDogTGF6eUV4cHJlc3Npb24gfCBMYXp5RXhwcmVzc2lvbltdLCAuLi5hcmdzOiBhbnlbXSk6IEluRXhwcmVzc2lvbiB7XG4gIGNvbnN0IG5vdCA9IHRydWU7XG4gIGNvbnN0IHJlc29sdmVkTGVmdCA9IEFycmF5LmlzQXJyYXkobGVmdCkgPyBsZWZ0Lm1hcChMQVpZKSA6IExBWlkobGVmdCk7XG4gIGxldCByZXNvbHZlZFZhbHVlczogRXhwcmVzc2lvbltdW10gfCBTZWxlY3RRdWVyeTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobGVmdCkpIHtcbiAgICAvLyBNdWx0aS1jb2x1bW4gY2FzZVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJnc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmFsdWVzQXJnID0gYXJnc1swXSBhcyBMYXp5RXhwcmVzc2lvbltdW107XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IHZhbHVlc0FyZy5tYXAoc2V0ID0+IHNldC5tYXAoTEFaWSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTaW5nbGUtY29sdW1uIGNhc2VcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgYXJnc1swXSBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5KSB7XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJncy5tYXAoTEFaWSkubWFwKHYgPT4gW3ZdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBJbkV4cHJlc3Npb24ocmVzb2x2ZWRMZWZ0LCByZXNvbHZlZFZhbHVlcywgbm90KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEdST1VQX0JZKC4uLmNvbHVtbnM6IChDb2x1bW4gfCBzdHJpbmcpW10pOiBDb2x1bW5bXSB7XG4gIHJldHVybiBjb2x1bW5zLm1hcChjb2wgPT4gKHR5cGVvZiBjb2wgPT09ICdzdHJpbmcnID8gQ09MVU1OKGNvbCkgOiBjb2wpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhBVklORyhleHByOiBMYXp5RXhwcmVzc2lvbik6IEV4cHJlc3Npb24ge1xuICByZXR1cm4gTEFaWShleHByKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE9SREVSX0JZKGNvbHVtbjogQ29sdW1uIHwgc3RyaW5nLCBkaXJlY3Rpb246IE9yZGVyQnlEaXJlY3Rpb24gPSBPcmRlckJ5RGlyZWN0aW9uLkFTQyk6IE9yZGVyQnkge1xuICByZXR1cm4gbmV3IE9yZGVyQnkodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycgPyBDT0xVTU4oY29sdW1uKSA6IGNvbHVtbiwgZGlyZWN0aW9uKTtcbn1cblxuLy8gLS0tIENBU0UgRXhwcmVzc2lvbnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDQVNFKGxhenlDYXNlczogTGF6eUNhc2VJdGVtW10pOiBDYXNlRXhwcmVzc2lvbiB7XG4gIGxldCBlbHNlRXhwcjogRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgY29uc3QgY2FzZUl0ZW1zOiBDYXNlSXRlbVtdID0gW107XG4gIGZvciAoY29uc3QgYyBvZiBsYXp5Q2FzZXMpIHtcbiAgICBpZiAoYy5XSEVOICE9PSB1bmRlZmluZWQgJiYgYy5USEVOICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbHNlRXhwcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VMU0UgbXVzdCBiZSB0aGUgbGFzdCBjbGF1c2UgaW4gYSBDQVNFIGV4cHJlc3Npb24nKTtcbiAgICAgIH1cbiAgICAgIGNhc2VJdGVtcy5wdXNoKHsgd2hlbjogTEFaWShjLldIRU4pLCB0aGVuOiBMQVpZKGMuVEhFTikgfSk7XG4gICAgfSBlbHNlIGlmIChjLkVMU0UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVsc2VFeHByKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ0FTRSBleHByZXNzaW9uIGNhbiBvbmx5IGhhdmUgb25lIEVMU0UgY2xhdXNlJyk7XG4gICAgICB9XG4gICAgICBlbHNlRXhwciA9IExBWlkoYy5FTFNFKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBDYXNlRXhwcmVzc2lvbihjYXNlSXRlbXMsIGVsc2VFeHByKTtcbn1cblxuLy8gLS0tIFN1YnF1ZXJpZXMgYW5kIFdJVEggQ2xhdXNlcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIFdJVEgobmFtZTogc3RyaW5nLCBxdWVyeTogU2VsZWN0UXVlcnkpOiBXaXRoIHtcbiAgcmV0dXJuIG5ldyBXaXRoKG5hbWUsIHF1ZXJ5KTtcbn1cblxuLy8gLS0tIExpdGVyYWwgQ29udmVyc2lvbiAtLS1cblxuZnVuY3Rpb24gTEFaWSh2YWx1ZTogTGF6eUV4cHJlc3Npb24pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIE51bGxMaXRlcmFsLklOU1RBTkNFO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIG5ldyBOdW1iZXJMaXRlcmFsKHZhbHVlID8gMSA6IDApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFN0cmluZ0xpdGVyYWwodmFsdWUpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbmV3IE51bWJlckxpdGVyYWwodmFsdWUpO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQWxpYXNhYmxlRXhwcmVzc2lvbikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dHlwZW9mIHZhbHVlfWApO1xuICB9XG59XG4iXX0=
499
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvcnRoYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXIvU2hvcnRoYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNkNBLGtCQUVDO0FBSUQsZ0JBRUM7QUFFRCx3QkFFQztBQUVELGtCQUVDO0FBRUQsZ0JBRUM7QUFFRCxnQkFFQztBQUVELGtCQUVDO0FBRUQsa0JBRUM7QUFFRCxvQkFFQztBQUVELG9CQUVDO0FBRUQsc0JBRUM7QUFFRCwwQkFFQztBQUVELGtDQUVDO0FBRUQsMEJBRUM7QUFFRCxrQ0FFQztBQUVELG9CQU1DO0FBRUQsc0JBTUM7QUFFRCw0QkFFQztBQUVELHdCQUVDO0FBRUQsa0JBT0M7QUFFRCxnQkFPQztBQUlELHdCQUVDO0FBSUQsd0JBRUM7QUFJRCx3QkFFQztBQUVELDBDQUVDO0FBMkJELG9CQXNCQztBQUVELHNCQUlDO0FBRUQsOEJBSUM7QUFFRCx3QkFJQztBQUlELG9CQUVDO0FBRUQsOEJBRUM7QUFFRCxnQ0FFQztBQUlELGtCQUVDO0FBRUQsc0JBRUM7QUFFRCxrQkFFQztBQUVELGdCQUVDO0FBRUQsa0NBRUM7QUFJRCx3QkFFQztBQUlELHNCQUVDO0FBSUQsd0JBSUM7QUFFRCxrQ0FFQztBQUlELDhDQW1CQztBQVdELGdCQXFCQztBQVNELHdCQXFCQztBQUVELDRCQUVDO0FBRUQsd0JBRUM7QUFFRCw0QkFFQztBQWdCRCxvQ0FFQztBQUlELG9CQWlCQztBQUlELG9CQUVDO0FBSUQsa0NBRUM7QUFJRCx3QkFFQztBQUlELG9DQUVDO0FBSUQsb0RBRUM7QUFJRCxvQ0FFQztBQUlELGtDQUVDO0FBSUQsZ0NBRUM7QUFFRCxnQ0FFQztBQUlELGtDQUVDO0FBRUQsOEJBRUM7QUFNRCxzQkFLQztBQUlELG9CQUVDO0FBSUQsMEJBRUM7QUFJRCw0QkFFQztBQTNnQkQsc0RBQXNFO0FBQ3RFLHdDQUFxQztBQUNyQyxnRUFBNkQ7QUFDN0QsOERBQTJEO0FBQzNELDBEQUFpRTtB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SUFDbEMsQ0FBQztTQUFNLElBQUksS0FBSyxZQUFZLGtDQUFtQixFQUFFLENBQUM7UUFDaEQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFsaWFzYWJsZUV4cHJlc3Npb24sIEV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Fic3RyYWN0aW9uc1wiO1xuaW1wb3J0IHsgQWxpYXMgfSBmcm9tIFwiLi4vYXN0L0FsaWFzXCI7XG5pbXBvcnQgeyBCZXR3ZWVuRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQmV0d2VlbkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IEJpbmFyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0JpbmFyeUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENhc2VFeHByZXNzaW9uLCBDYXNlSXRlbSB9IGZyb20gXCIuLi9hc3QvQ2FzZUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENhc3RFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9DYXN0RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sbGF0ZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0NvbGxhdGVFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBTdWJxdWVyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L1N1YnF1ZXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sdW1uLCBDb2x1bW5MaWtlIH0gZnJvbSBcIi4uL2FzdC9Db2x1bW5cIjtcbmltcG9ydCB7IENvbmNhdCB9IGZyb20gXCIuLi9hc3QvQ29uY2F0XCI7XG5pbXBvcnQgeyBBbHRlclRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0FsdGVyVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlSW5kZXhRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlSW5kZXhRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVGFibGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnksIFZpcnR1YWxUYWJsZU1vZHVsZSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZVZpZXdRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBEZWxldGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvRGVsZXRlUXVlcnlcIjtcbmltcG9ydCB7IERyb3BJbmRleFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9Ecm9wSW5kZXhRdWVyeVwiO1xuaW1wb3J0IHsgRHJvcFRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BUYWJsZVF1ZXJ5XCI7XG5pbXBvcnQgeyBEcm9wVmlld1F1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9Ecm9wVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvVXBkYXRlUXVlcnlcIjtcbmltcG9ydCB7IEV4aXN0c0V4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0V4aXN0c0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IEZyb20sIEZyb21MaWtlLCBKc29uRWFjaEZyb20sIFN1YnF1ZXJ5RnJvbSwgVGFibGVGcm9tIH0gZnJvbSBcIi4uL2FzdC9Gcm9tXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Z1bmN0aW9uRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgRnVuY3Rpb25OYW1lIH0gZnJvbSBcIi4uL2FzdC9GdW5jdGlvbk5hbWVcIjtcbmltcG9ydCB7IEluRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvSW5FeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeSB9IGZyb20gXCIuLi9hc3QvSW5zZXJ0UXVlcnlcIjtcbmltcG9ydCB7IEpvaW4sIEpvaW5UeXBlIH0gZnJvbSBcIi4uL2FzdC9Kb2luXCI7XG5pbXBvcnQgeyBOdWxsTGl0ZXJhbCwgTnVtYmVyTGl0ZXJhbCwgUGFyYW0sIFN0cmluZ0xpdGVyYWwgfSBmcm9tIFwiLi4vYXN0L0xpdGVyYWxzXCI7XG5pbXBvcnQgeyBPcGVyYXRvciB9IGZyb20gXCIuLi9hc3QvT3BlcmF0b3JcIjtcbmltcG9ydCB7IE9yZGVyQnksIE9yZGVyQnlEaXJlY3Rpb24gfSBmcm9tIFwiLi4vYXN0L09yZGVyQnlcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9TZWxlY3RRdWVyeVwiO1xuaW1wb3J0IHsgVW5hcnlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9VbmFyeUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IFdpdGggfSBmcm9tIFwiLi4vYXN0L1dpdGhcIjtcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL1F1ZXJ5QnVpbGRlclwiO1xuXG50eXBlIFByaW1pdGl2ZVZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5cbnR5cGUgTGF6eUV4cHJlc3Npb24gPSBFeHByZXNzaW9uIHwgUHJpbWl0aXZlVmFsdWU7XG5cbnR5cGUgTGF6eUNhc2VJdGVtID0geyBXSEVOPzogTGF6eUV4cHJlc3Npb247IFRIRU4/OiBMYXp5RXhwcmVzc2lvbjsgRUxTRT86IExhenlFeHByZXNzaW9uIH07XG5cbnR5cGUgTGF6eUZyb20gPSBzdHJpbmcgfCBGcm9tIHwgQWxpYXM8RnJvbT4gfCBTZWxlY3RRdWVyeTtcblxudHlwZSBMYXp5Q29sdW1uID0gQ29sdW1uTGlrZSB8IFByaW1pdGl2ZVZhbHVlO1xuXG5leHBvcnQgZnVuY3Rpb24gVkFMKHZhbDogUHJpbWl0aXZlVmFsdWUpOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgcmV0dXJuIExBWlkodmFsKTtcbn1cblxuLy8gLS0tIE9wZXJhdG9ycyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIEVRKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkVRVUFMUywgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTk9UX0VRKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk5PVF9FUVVBTFMsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5PVChleHByOiBMYXp5RXhwcmVzc2lvbik6IFVuYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yLk5PVCwgTEFaWShleHByKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHVChsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5HUkVBVEVSX1RIQU4sIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExUKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkxFU1NfVEhBTiwgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR1RFKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTCwgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTFRFKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkxFU1NfVEhBTl9PUl9FUVVBTCwgTEFaWShyaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTElLRShsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgcmlnaHQ6IExhenlFeHByZXNzaW9uKTogQmluYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5MSUtFLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHTE9CKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLkdMT0IsIExBWlkocmlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1BVENIKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1BVENILCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBCRVRXRUVOKG9wZXJhbmQ6IExhenlFeHByZXNzaW9uLCBsb3c6IExhenlFeHByZXNzaW9uLCBoaWdoOiBMYXp5RXhwcmVzc2lvbik6IEJldHdlZW5FeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCZXR3ZWVuRXhwcmVzc2lvbihMQVpZKG9wZXJhbmQpLCBMQVpZKGxvdyksIExBWlkoaGlnaCksIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5PVF9CRVRXRUVOKG9wZXJhbmQ6IExhenlFeHByZXNzaW9uLCBsb3c6IExhenlFeHByZXNzaW9uLCBoaWdoOiBMYXp5RXhwcmVzc2lvbik6IEJldHdlZW5FeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCZXR3ZWVuRXhwcmVzc2lvbihMQVpZKG9wZXJhbmQpLCBMQVpZKGxvdyksIExBWlkoaGlnaCksIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSVNfTlVMTChleHByOiBMYXp5RXhwcmVzc2lvbik6IFVuYXJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yLklTX05VTEwsIExBWlkoZXhwcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSVNfTk9UX05VTEwoZXhwcjogTGF6eUV4cHJlc3Npb24pOiBVbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5JU19OT1RfTlVMTCwgTEFaWShleHByKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQTFVTKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodD86IExhenlFeHByZXNzaW9uKTogQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIGlmIChyaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3IuUExVUywgTEFaWShsZWZ0KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLlBMVVMsIExBWlkocmlnaHQpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gTUlOVVMobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0PzogTGF6eUV4cHJlc3Npb24pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKHJpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvci5NSU5VUywgTEFaWShsZWZ0KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1JTlVTLCBMQVpZKHJpZ2h0KSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1VTFRJUExZKGxlZnQ6IExhenlFeHByZXNzaW9uLCByaWdodDogTGF6eUV4cHJlc3Npb24pOiBCaW5hcnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk1VTFRJUExZLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBESVZJREUobGVmdDogTGF6eUV4cHJlc3Npb24sIHJpZ2h0OiBMYXp5RXhwcmVzc2lvbik6IEJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEJpbmFyeUV4cHJlc3Npb24oTEFaWShsZWZ0KSwgT3BlcmF0b3IuRElWSURFLCBMQVpZKHJpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBTkQoLi4uYXJnczogTGF6eUV4cHJlc3Npb25bXSk6IEFsaWFzYWJsZUV4cHJlc3Npb24ge1xuICBpZiAoYXJncy5sZW5ndGggPT0gMSkge1xuICAgIHJldHVybiBMQVpZKGFyZ3NbMF0pXG4gIH0gaWYgKGFyZ3MubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQU5EIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudHMnKTtcbiAgfVxuICByZXR1cm4gYXJncy5yZWR1Y2UoKGxlZnQsIHJpZ2h0KSA9PiBuZXcgQmluYXJ5RXhwcmVzc2lvbihMQVpZKGxlZnQpLCBPcGVyYXRvci5BTkQsIExBWlkocmlnaHQpKSkgYXMgQWxpYXNhYmxlRXhwcmVzc2lvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE9SKC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09IDEpIHtcbiAgICByZXR1cm4gTEFaWShhcmdzWzBdKVxuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT1IgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50cycpO1xuICB9XG4gIHJldHVybiBhcmdzLnJlZHVjZSgobGVmdCwgcmlnaHQpID0+IG5ldyBCaW5hcnlFeHByZXNzaW9uKExBWlkobGVmdCksIE9wZXJhdG9yLk9SLCBMQVpZKHJpZ2h0KSkpIGFzIEFsaWFzYWJsZUV4cHJlc3Npb247XG59XG5cbi8vIC0tLSBFWElTVFMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBFWElTVFMoc3VicXVlcnk6IFNlbGVjdFF1ZXJ5KTogRXhpc3RzRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRXhpc3RzRXhwcmVzc2lvbihzdWJxdWVyeSk7XG59XG5cbi8vIC0tLSBDb2x1bW5zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQ09MVU1OKGFyZzE6IHN0cmluZywgYXJnMj86IHN0cmluZyk6IENvbHVtbiB7XG4gIHJldHVybiBuZXcgQ29sdW1uKGFyZzEsIGFyZzIpO1xufVxuXG4vLyAtLS0gU2VsZWN0IFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBTRUxFQ1QoLi4uYXJnczogKEZyb21MaWtlIHwgSm9pbiB8IExhenlDb2x1bW4pW10pOiBTZWxlY3RRdWVyeSB7XG4gIHJldHVybiBhZGRDbGF1c2VzVG9TZWxlY3QoUXVlcnlCdWlsZGVyLnNlbGVjdCgpLCBhcmdzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNFTEVDVF9ESVNUSU5DVCguLi5hcmdzOiAoRnJvbUxpa2UgfCBKb2luIHwgTGF6eUNvbHVtbilbXSk6IFNlbGVjdFF1ZXJ5IHtcbiAgcmV0dXJuIGFkZENsYXVzZXNUb1NlbGVjdChRdWVyeUJ1aWxkZXIuc2VsZWN0KCkuZGlzdGluY3QoKSwgYXJncyk7XG59XG5cbmZ1bmN0aW9uIGFkZENsYXVzZXNUb1NlbGVjdChxdWVyeTogU2VsZWN0UXVlcnksIGFyZ3M6IChGcm9tTGlrZSB8IEpvaW4gfCBMYXp5Q29sdW1uKVtdKTogU2VsZWN0UXVlcnkge1xuICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBKb2luKSB7XG4gICAgICBxdWVyeS5qb2luKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBGcm9tKSB7XG4gICAgICBxdWVyeS5mcm9tKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBDb2x1bW4pIHtcbiAgICAgIHF1ZXJ5LmNvbHVtbihhcmcpO1xuICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQWxpYXMpIHtcbiAgICAgIGNvbnN0IHJlZmVyZW50ID0gYXJnLnJlZmVyZW50IGFzIGFueTtcbiAgICAgIGlmIChyZWZlcmVudCBpbnN0YW5jZW9mIEZyb20pIHtcbiAgICAgICAgcXVlcnkuZnJvbShhcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkuY29sdW1uKGFyZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgJ3JlZmVyZW50JyBpbiAoYXJnIGFzIGFueSkgJiYgJ2FsaWFzJyBpbiAoYXJnIGFzIGFueSkpIHtcbiAgICAgIC8vIEhhbmRsZSBDb2x1bW5MaWtlIG9iamVjdCBmb3JtXG4gICAgICBxdWVyeS5jb2x1bW4obmV3IEFsaWFzKChhcmcgYXMgYW55KS5yZWZlcmVudCwgKGFyZyBhcyBhbnkpLmFsaWFzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5LmNvbHVtbihMQVpZKGFyZyBhcyBMYXp5RXhwcmVzc2lvbikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcXVlcnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGUk9NKGFyZzE6IExhenlGcm9tLCBhcmcyPzogc3RyaW5nKTogRnJvbXxBbGlhczxGcm9tPiB7XG4gIC8vIFR3by1hcmd1bWVudCBmb3JtOiBGUk9NKGRhdGFiYXNlLCB0YWJsZSlcbiAgaWYgKHR5cGVvZiBhcmcxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYXJnMiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlRnJvbShgJHthcmcxfS4ke2FyZzJ9YCk7XG4gIH1cblxuICAvLyBTaW5nbGUtYXJndW1lbnQgZm9ybSAoZXhpc3RpbmcgYmVoYXZpb3IpXG4gIGlmICh0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlRnJvbShhcmcxKTtcbiAgfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgQWxpYXMpIHtcbiAgICByZXR1cm4gYXJnMTtcbiAgfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICByZXR1cm4gbmV3IFN1YnF1ZXJ5RnJvbShhcmcxKTtcbiAgfSBlbHNlIGlmIChcbiAgICBhcmcxIGluc3RhbmNlb2YgVGFibGVGcm9tIHx8XG4gICAgYXJnMSBpbnN0YW5jZW9mIFN1YnF1ZXJ5RnJvbSB8fFxuICAgIGFyZzEgaW5zdGFuY2VvZiBKc29uRWFjaEZyb21cbiAgKSB7XG4gICAgcmV0dXJuIGFyZzE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGFyZ3VtZW50IHR5cGUgZm9yIEZST006ICcgKyBKU09OLnN0cmluZ2lmeShhcmcxKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVOSU9OKC4uLnF1ZXJpZXM6IFNlbGVjdFF1ZXJ5W10pOiBTZWxlY3RRdWVyeSB7XG4gIGNvbnN0IHF1ZXJ5ID0gUXVlcnlCdWlsZGVyLnNlbGVjdCgpO1xuICBxdWVyaWVzLmZvckVhY2gocSA9PiBxdWVyeS51bmlvbihxKSk7XG4gIHJldHVybiBxdWVyeTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElOVEVSU0VDVCguLi5xdWVyaWVzOiBTZWxlY3RRdWVyeVtdKTogU2VsZWN0UXVlcnkge1xuICBjb25zdCBxdWVyeSA9IFF1ZXJ5QnVpbGRlci5zZWxlY3QoKTtcbiAgcXVlcmllcy5mb3JFYWNoKHEgPT4gcXVlcnkuaW50ZXJzZWN0KHEpKTtcbiAgcmV0dXJuIHF1ZXJ5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRVhDRVBUKC4uLnF1ZXJpZXM6IFNlbGVjdFF1ZXJ5W10pOiBTZWxlY3RRdWVyeSB7XG4gIGNvbnN0IHF1ZXJ5ID0gUXVlcnlCdWlsZGVyLnNlbGVjdCgpO1xuICBxdWVyaWVzLmZvckVhY2gocSA9PiBxdWVyeS5leGNlcHQocSkpO1xuICByZXR1cm4gcXVlcnk7XG59XG5cbi8vIC0tLSBKb2lucyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIEpPSU4odGFibGVOYW1lOiBzdHJpbmcsIGFsaWFzOiBzdHJpbmcsIG9uOiBMYXp5RXhwcmVzc2lvbik6IEpvaW4ge1xuICByZXR1cm4gbmV3IEpvaW4oSm9pblR5cGUuSU5ORVIsIHRhYmxlTmFtZSwgYWxpYXMsIExBWlkob24pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExFRlRfSk9JTih0YWJsZU5hbWU6IHN0cmluZywgYWxpYXM6IHN0cmluZywgb246IExhenlFeHByZXNzaW9uKTogSm9pbiB7XG4gIHJldHVybiBuZXcgSm9pbihKb2luVHlwZS5MRUZULCB0YWJsZU5hbWUsIGFsaWFzLCBMQVpZKG9uKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDUk9TU19KT0lOKHRhYmxlTmFtZTogc3RyaW5nLCBhbGlhczogc3RyaW5nKTogSm9pbiB7XG4gIHJldHVybiBuZXcgSm9pbihKb2luVHlwZS5DUk9TUywgdGFibGVOYW1lLCBhbGlhcywgbmV3IFN0cmluZ0xpdGVyYWwoJ1RSVUUnKSk7XG59XG5cbi8vIC0tLSBTUUwgRnVuY3Rpb25zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQUJTKGNvbHVtbjpFeHByZXNzaW9uKTogRnVuY3Rpb25FeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oJ0FCUycsIFsgY29sdW1uIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ09VTlQoY29sdW1uOkNvbHVtbnxGdW5jdGlvbkV4cHJlc3Npb258QWxpYXNhYmxlRXhwcmVzc2lvbik6IEZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKCdDT1VOVCcsIFsgY29sdW1uIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gU1VNKGNvbHVtbjpDb2x1bW58RnVuY3Rpb25FeHByZXNzaW9ufEFsaWFzYWJsZUV4cHJlc3Npb24pOiBGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbignU1VNJywgWyBjb2x1bW4gXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGTihuYW1lOiBGdW5jdGlvbk5hbWUsIC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihuYW1lLCBhcmdzLm1hcChMQVpZKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGTl9ESVNUSU5DVChuYW1lOiBGdW5jdGlvbk5hbWUsIC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihuYW1lLCBhcmdzLm1hcChMQVpZKSwgdHJ1ZSk7XG59XG5cbi8vIC0tLSBDb25jYXRlbmF0aW9uIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQ09OQ0FUKC4uLmFyZ3M6IExhenlFeHByZXNzaW9uW10pOiBDb25jYXQge1xuICByZXR1cm4gbmV3IENvbmNhdCguLi5hcmdzLm1hcChMQVpZKSk7XG59XG5cbi8vIC0tLSBQYXJhbWV0ZXJzIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gUEFSQU0obmFtZT86IHN0cmluZyk6IFBhcmFtIHtcbiAgcmV0dXJuIG5ldyBQYXJhbShuYW1lKTtcbn1cblxuLy8gLS0tIEluc2VydCBRdWVyaWVzIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gSU5TRVJUKHRhYmxlTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBzdHJpbmdbXSwgdmFsdWVzOiBMYXp5RXhwcmVzc2lvbltdKTogSW5zZXJ0UXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmluc2VydEludG8odGFibGVOYW1lKVxuICAgIC5jb2x1bW5zKC4uLmNvbHVtbnMpXG4gICAgLnZhbHVlcyguLi52YWx1ZXMubWFwKExBWlkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElOU0VSVF9JTlRPKHRhYmxlTmFtZTogc3RyaW5nKTogSW5zZXJ0UXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmluc2VydEludG8odGFibGVOYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElOU0VSVF9PUl9SRVBMQUNFKGRhdGFiYXNlOiBzdHJpbmcsIHRhYmxlOiBzdHJpbmcsIGNvbHVtbnM6IHN0cmluZ1tdLCB2YWx1ZXM6IExhenlFeHByZXNzaW9uW10pOiBJbnNlcnRRdWVyeTtcbmV4cG9ydCBmdW5jdGlvbiBJTlNFUlRfT1JfUkVQTEFDRSh0YWJsZU5hbWU6IHN0cmluZywgY29sdW1uczogc3RyaW5nW10sIHZhbHVlczogTGF6eUV4cHJlc3Npb25bXSk6IEluc2VydFF1ZXJ5O1xuZXhwb3J0IGZ1bmN0aW9uIElOU0VSVF9PUl9SRVBMQUNFKGFyZzE6IHN0cmluZywgYXJnMjogc3RyaW5nIHwgc3RyaW5nW10sIGFyZzM/OiBzdHJpbmdbXSB8IExhenlFeHByZXNzaW9uW10sIGFyZzQ/OiBMYXp5RXhwcmVzc2lvbltdKTogSW5zZXJ0UXVlcnkge1xuICAvLyBGb3VyLWFyZ3VtZW50IGZvcm06IElOU0VSVF9PUl9SRVBMQUNFKGRhdGFiYXNlLCB0YWJsZSwgY29sdW1ucywgdmFsdWVzKVxuICBpZiAodHlwZW9mIGFyZzIgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkoYXJnMykgJiYgQXJyYXkuaXNBcnJheShhcmc0KSkge1xuICAgIGNvbnN0IHF1YWxpZmllZFRhYmxlTmFtZSA9IGAke2FyZzF9LiR7YXJnMn1gO1xuICAgIHJldHVybiBRdWVyeUJ1aWxkZXIuaW5zZXJ0SW50byhxdWFsaWZpZWRUYWJsZU5hbWUpXG4gICAgICAub3JSZXBsYWNlKClcbiAgICAgIC5jb2x1bW5zKC4uLihhcmczIGFzIHN0cmluZ1tdKSlcbiAgICAgIC52YWx1ZXMoLi4uYXJnNC5tYXAoTEFaWSkpO1xuICB9XG5cbiAgLy8gVGhyZWUtYXJndW1lbnQgZm9ybTogSU5TRVJUX09SX1JFUExBQ0UodGFibGVOYW1lLCBjb2x1bW5zLCB2YWx1ZXMpXG4gIGlmIChBcnJheS5pc0FycmF5KGFyZzIpICYmIEFycmF5LmlzQXJyYXkoYXJnMykpIHtcbiAgICByZXR1cm4gUXVlcnlCdWlsZGVyLmluc2VydEludG8oYXJnMSlcbiAgICAgIC5vclJlcGxhY2UoKVxuICAgICAgLmNvbHVtbnMoLi4uYXJnMilcbiAgICAgIC52YWx1ZXMoLi4uKGFyZzMgYXMgTGF6eUV4cHJlc3Npb25bXSkubWFwKExBWlkpKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgZm9yIElOU0VSVF9PUl9SRVBMQUNFJyk7XG59XG5cbi8vIC0tLSBPdGhlciBDbGF1c2VzIC0tLVxuXG4vLyBPdmVybG9hZHMgZm9yIElOXG5leHBvcnQgZnVuY3Rpb24gSU4obGVmdDogTGF6eUV4cHJlc3Npb24sIC4uLnZhbHVlczogTGF6eUV4cHJlc3Npb25bXSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiwgdmFsdWVzOiBTZWxlY3RRdWVyeSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbltdLCB2YWx1ZXM6IExhenlFeHByZXNzaW9uW11bXSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbltdLCB2YWx1ZXM6IFNlbGVjdFF1ZXJ5KTogSW5FeHByZXNzaW9uO1xuXG4vLyBJbXBsZW1lbnRhdGlvbiBmb3IgSU5cbmV4cG9ydCBmdW5jdGlvbiBJTihsZWZ0OiBMYXp5RXhwcmVzc2lvbiB8IExhenlFeHByZXNzaW9uW10sIC4uLmFyZ3M6IGFueVtdKTogSW5FeHByZXNzaW9uIHtcbiAgY29uc3Qgbm90ID0gZmFsc2U7XG4gIGNvbnN0IHJlc29sdmVkTGVmdCA9IEFycmF5LmlzQXJyYXkobGVmdCkgPyBsZWZ0Lm1hcChMQVpZKSA6IExBWlkobGVmdCk7XG4gIGxldCByZXNvbHZlZFZhbHVlczogRXhwcmVzc2lvbltdW10gfCBTZWxlY3RRdWVyeTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobGVmdCkpIHtcbiAgICAvLyBNdWx0aS1jb2x1bW4gY2FzZVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJnc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmFsdWVzQXJnID0gYXJnc1swXSBhcyBMYXp5RXhwcmVzc2lvbltdW107XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IHZhbHVlc0FyZy5tYXAoc2V0ID0+IHNldC5tYXAoTEFaWSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTaW5nbGUtY29sdW1uIGNhc2VcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgYXJnc1swXSBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5KSB7XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmVkVmFsdWVzID0gYXJncy5tYXAoTEFaWSkubWFwKHYgPT4gW3ZdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBJbkV4cHJlc3Npb24ocmVzb2x2ZWRMZWZ0LCByZXNvbHZlZFZhbHVlcywgbm90KTtcbn1cblxuLy8gT3ZlcmxvYWRzIGZvciBOT1RfSU5cbmV4cG9ydCBmdW5jdGlvbiBOT1RfSU4obGVmdDogTGF6eUV4cHJlc3Npb24sIC4uLnZhbHVlczogTGF6eUV4cHJlc3Npb25bXSk6IEluRXhwcmVzc2lvbjtcbmV4cG9ydCBmdW5jdGlvbiBOT1RfSU4obGVmdDogTGF6eUV4cHJlc3Npb24sIHZhbHVlczogU2VsZWN0UXVlcnkpOiBJbkV4cHJlc3Npb247XG5leHBvcnQgZnVuY3Rpb24gTk9UX0lOKGxlZnQ6IExhenlFeHByZXNzaW9uW10sIHZhbHVlczogTGF6eUV4cHJlc3Npb25bXVtdKTogSW5FeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIE5PVF9JTihsZWZ0OiBMYXp5RXhwcmVzc2lvbltdLCB2YWx1ZXM6IFNlbGVjdFF1ZXJ5KTogSW5FeHByZXNzaW9uO1xuXG4vLyBJbXBsZW1lbnRhdGlvbiBmb3IgTk9UX0lOXG5leHBvcnQgZnVuY3Rpb24gTk9UX0lOKGxlZnQ6IExhenlFeHByZXNzaW9uIHwgTGF6eUV4cHJlc3Npb25bXSwgLi4uYXJnczogYW55W10pOiBJbkV4cHJlc3Npb24ge1xuICBjb25zdCBub3QgPSB0cnVlO1xuICBjb25zdCByZXNvbHZlZExlZnQgPSBBcnJheS5pc0FycmF5KGxlZnQpID8gbGVmdC5tYXAoTEFaWSkgOiBMQVpZKGxlZnQpO1xuICBsZXQgcmVzb2x2ZWRWYWx1ZXM6IEV4cHJlc3Npb25bXVtdIHwgU2VsZWN0UXVlcnk7XG4gIGlmIChBcnJheS5pc0FycmF5KGxlZnQpKSB7XG4gICAgLy8gTXVsdGktY29sdW1uIGNhc2VcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgYXJnc1swXSBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5KSB7XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlc0FyZyA9IGFyZ3NbMF0gYXMgTGF6eUV4cHJlc3Npb25bXVtdO1xuICAgICAgcmVzb2x2ZWRWYWx1ZXMgPSB2YWx1ZXNBcmcubWFwKHNldCA9PiBzZXQubWFwKExBWlkpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU2luZ2xlLWNvbHVtbiBjYXNlXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBTZWxlY3RRdWVyeSkge1xuICAgICAgcmVzb2x2ZWRWYWx1ZXMgPSBhcmdzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlZFZhbHVlcyA9IGFyZ3MubWFwKExBWlkpLm1hcCh2ID0+IFt2XSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgSW5FeHByZXNzaW9uKHJlc29sdmVkTGVmdCwgcmVzb2x2ZWRWYWx1ZXMsIG5vdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHUk9VUF9CWSguLi5jb2x1bW5zOiAoQ29sdW1uIHwgc3RyaW5nKVtdKTogQ29sdW1uW10ge1xuICByZXR1cm4gY29sdW1ucy5tYXAoY29sID0+ICh0eXBlb2YgY29sID09PSAnc3RyaW5nJyA/IENPTFVNTihjb2wpIDogY29sKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIQVZJTkcoZXhwcjogTGF6eUV4cHJlc3Npb24pOiBFeHByZXNzaW9uIHtcbiAgcmV0dXJuIExBWlkoZXhwcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBPUkRFUl9CWShjb2x1bW46IENvbHVtbiB8IHN0cmluZywgZGlyZWN0aW9uOiBPcmRlckJ5RGlyZWN0aW9uID0gT3JkZXJCeURpcmVjdGlvbi5BU0MpOiBPcmRlckJ5IHtcbiAgcmV0dXJuIG5ldyBPcmRlckJ5KHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnID8gQ09MVU1OKGNvbHVtbikgOiBjb2x1bW4sIGRpcmVjdGlvbik7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFBBUlRJVElPTiBCWSBjbGF1c2UgZm9yIHdpbmRvdyBmdW5jdGlvbnMuXG4gKlxuICogUmV0dXJucyBhbiBFeHByZXNzaW9uW10gdGhhdCBjYW4gYmUgcGFzc2VkIHRvIEZ1bmN0aW9uRXhwcmVzc2lvbi5vdmVyKClcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogRk4oJ1JBTksnKS5vdmVyKFBBUlRJVElPTl9CWSgnY2F0ZWdvcnknKSwgT1JERVJfQlkoJ3ByaWNlJywgREVTQykpXG4gKiAvLyBSQU5LKCkgT1ZFUiAoUEFSVElUSU9OIEJZIGNhdGVnb3J5IE9SREVSIEJZIHByaWNlIERFU0MpXG4gKlxuICogRk4oJ1JPV19OVU1CRVInKS5vdmVyKFBBUlRJVElPTl9CWSgnZGVwYXJ0bWVudCcsICdsb2NhdGlvbicpLCBPUkRFUl9CWSgnc2FsYXJ5JykpXG4gKiAvLyBST1dfTlVNQkVSKCkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcGFydG1lbnQsIGxvY2F0aW9uIE9SREVSIEJZIHNhbGFyeSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gUEFSVElUSU9OX0JZKC4uLmNvbHVtbnM6IChDb2x1bW4gfCBzdHJpbmcpW10pOiBFeHByZXNzaW9uW10ge1xuICByZXR1cm4gY29sdW1ucy5tYXAoY29sID0+ICh0eXBlb2YgY29sID09PSAnc3RyaW5nJyA/IENPTFVNTihjb2wpIDogY29sKSk7XG59XG5cbi8vIC0tLSBDQVNFIEV4cHJlc3Npb25zIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQ0FTRShsYXp5Q2FzZXM6IExhenlDYXNlSXRlbVtdKTogQ2FzZUV4cHJlc3Npb24ge1xuICBsZXQgZWxzZUV4cHI6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGNvbnN0IGNhc2VJdGVtczogQ2FzZUl0ZW1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGMgb2YgbGF6eUNhc2VzKSB7XG4gICAgaWYgKGMuV0hFTiAhPT0gdW5kZWZpbmVkICYmIGMuVEhFTiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZWxzZUV4cHIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFTFNFIG11c3QgYmUgdGhlIGxhc3QgY2xhdXNlIGluIGEgQ0FTRSBleHByZXNzaW9uJyk7XG4gICAgICB9XG4gICAgICBjYXNlSXRlbXMucHVzaCh7IHdoZW46IExBWlkoYy5XSEVOKSwgdGhlbjogTEFaWShjLlRIRU4pIH0pO1xuICAgIH0gZWxzZSBpZiAoYy5FTFNFICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbHNlRXhwcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NBU0UgZXhwcmVzc2lvbiBjYW4gb25seSBoYXZlIG9uZSBFTFNFIGNsYXVzZScpO1xuICAgICAgfVxuICAgICAgZWxzZUV4cHIgPSBMQVpZKGMuRUxTRSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgQ2FzZUV4cHJlc3Npb24oY2FzZUl0ZW1zLCBlbHNlRXhwcik7XG59XG5cbi8vIC0tLSBTdWJxdWVyaWVzIGFuZCBXSVRIIENsYXVzZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBXSVRIKG5hbWU6IHN0cmluZywgcXVlcnk6IFNlbGVjdFF1ZXJ5KTogV2l0aCB7XG4gIHJldHVybiBuZXcgV2l0aChuYW1lLCBxdWVyeSk7XG59XG5cbi8vIC0tLSBEZWxldGUgUXVlcmllcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIERFTEVURV9GUk9NKHRhYmxlTmFtZTogc3RyaW5nKTogRGVsZXRlUXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmRlbGV0ZUZyb20odGFibGVOYW1lKTtcbn1cblxuLy8gLS0tIFVwZGF0ZSBRdWVyaWVzIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gVVBEQVRFKHRhYmxlTmFtZTogc3RyaW5nKTogVXBkYXRlUXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLnVwZGF0ZSh0YWJsZU5hbWUpO1xufVxuXG4vLyAtLS0gQ3JlYXRlIFRhYmxlIFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDUkVBVEVfVEFCTEUodGFibGVOYW1lOiBzdHJpbmcpOiBDcmVhdGVUYWJsZVF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5jcmVhdGVUYWJsZSh0YWJsZU5hbWUpO1xufVxuXG4vLyAtLS0gQ3JlYXRlIFZpcnR1YWwgVGFibGUgUXVlcmllcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIENSRUFURV9WSVJUVUFMX1RBQkxFKHRhYmxlTmFtZTogc3RyaW5nLCBtb2R1bGU6IFZpcnR1YWxUYWJsZU1vZHVsZSk6IENyZWF0ZVZpcnR1YWxUYWJsZVF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5jcmVhdGVWaXJ0dWFsVGFibGUodGFibGVOYW1lLCBtb2R1bGUpO1xufVxuXG4vLyAtLS0gQ3JlYXRlIEluZGV4IFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDUkVBVEVfSU5ERVgoaW5kZXhOYW1lOiBzdHJpbmcpOiBDcmVhdGVJbmRleFF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5jcmVhdGVJbmRleChpbmRleE5hbWUpO1xufVxuXG4vLyAtLS0gQWx0ZXIgVGFibGUgUXVlcmllcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIEFMVEVSX1RBQkxFKHRhYmxlTmFtZTogc3RyaW5nKTogQWx0ZXJUYWJsZVF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5hbHRlclRhYmxlKHRhYmxlTmFtZSk7XG59XG5cbi8vIC0tLSBEcm9wIFF1ZXJpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBEUk9QX1RBQkxFKHRhYmxlTmFtZTogc3RyaW5nKTogRHJvcFRhYmxlUXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmRyb3BUYWJsZSh0YWJsZU5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRFJPUF9JTkRFWChpbmRleE5hbWU6IHN0cmluZyk6IERyb3BJbmRleFF1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5kcm9wSW5kZXgoaW5kZXhOYW1lKTtcbn1cblxuLy8gLS0tIFZpZXcgUXVlcmllcyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIENSRUFURV9WSUVXKHZpZXdOYW1lOiBzdHJpbmcpOiBDcmVhdGVWaWV3UXVlcnkge1xuICByZXR1cm4gUXVlcnlCdWlsZGVyLmNyZWF0ZVZpZXcodmlld05hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRFJPUF9WSUVXKHZpZXdOYW1lOiBzdHJpbmcpOiBEcm9wVmlld1F1ZXJ5IHtcbiAgcmV0dXJuIFF1ZXJ5QnVpbGRlci5kcm9wVmlldyh2aWV3TmFtZSk7XG59XG5cbi8vIC0tLSBBbGlhc2VzIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gQUxJQVMocmVmZXJlbnQ6IEFsaWFzYWJsZUV4cHJlc3Npb24sIGFsaWFzOiBzdHJpbmcpOiBBbGlhczxBbGlhc2FibGVFeHByZXNzaW9uPjtcbmV4cG9ydCBmdW5jdGlvbiBBTElBUyhyZWZlcmVudDogRnJvbSwgYWxpYXM6IHN0cmluZyk6IEFsaWFzPEZyb20+O1xuZXhwb3J0IGZ1bmN0aW9uIEFMSUFTKHJlZmVyZW50OiBBbGlhc2FibGVFeHByZXNzaW9uIHwgRnJvbSwgYWxpYXM6IHN0cmluZyk6IEFsaWFzPEFsaWFzYWJsZUV4cHJlc3Npb24+IHwgQWxpYXM8RnJvbT4ge1xuICBpZiAocmVmZXJlbnQgaW5zdGFuY2VvZiBGcm9tKSB7XG4gICAgcmV0dXJuIG5ldyBBbGlhczxGcm9tPihyZWZlcmVudCwgYWxpYXMpO1xuICB9XG4gIHJldHVybiBuZXcgQWxpYXM8QWxpYXNhYmxlRXhwcmVzc2lvbj4ocmVmZXJlbnQgYXMgQWxpYXNhYmxlRXhwcmVzc2lvbiwgYWxpYXMpO1xufVxuXG4vLyAtLS0gQ0FTVCBFeHByZXNzaW9ucyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIENBU1QoZXhwcjogTGF6eUV4cHJlc3Npb24sIHRhcmdldFR5cGU6IHN0cmluZyk6IENhc3RFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBDYXN0RXhwcmVzc2lvbihMQVpZKGV4cHIpLCB0YXJnZXRUeXBlKTtcbn1cblxuLy8gLS0tIENPTExBVEUgRXhwcmVzc2lvbnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBDT0xMQVRFKGV4cHI6IExhenlFeHByZXNzaW9uLCBjb2xsYXRpb246IHN0cmluZyk6IENvbGxhdGVFeHByZXNzaW9uIHtcbiAgcmV0dXJuIG5ldyBDb2xsYXRlRXhwcmVzc2lvbihMQVpZKGV4cHIpLCBjb2xsYXRpb24pO1xufVxuXG4vLyAtLS0gU3VicXVlcnkgRXhwcmVzc2lvbnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBTVUJRVUVSWShxdWVyeTogU2VsZWN0UXVlcnkpOiBTdWJxdWVyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gbmV3IFN1YnF1ZXJ5RXhwcmVzc2lvbihxdWVyeSk7XG59XG5cbi8vIC0tLSBMaXRlcmFsIENvbnZlcnNpb24gLS0tXG5cbmZ1bmN0aW9uIExBWlkodmFsdWU6IExhenlFeHByZXNzaW9uKTogQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBOdWxsTGl0ZXJhbC5JTlNUQU5DRTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBuZXcgTnVtYmVyTGl0ZXJhbCh2YWx1ZSA/IDEgOiAwKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJpbmdMaXRlcmFsKHZhbHVlKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG5ldyBOdW1iZXJMaXRlcmFsKHZhbHVlKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFsaWFzYWJsZUV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB2YWx1ZSB0eXBlOiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgfVxufVxuIl19