flexdataset 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/src/model.d.ts
CHANGED
|
@@ -25,14 +25,15 @@ export interface Column {
|
|
|
25
25
|
readonly description: string;
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
* A partition entry. The meaning of `type` is engine-specific: for
|
|
29
|
-
*
|
|
30
|
-
*
|
|
28
|
+
* A partition entry. The meaning of `name` and `type` is engine-specific: for
|
|
29
|
+
* Hive, `name` is a new partition column and `type` is a normal type; for
|
|
30
|
+
* Iceberg, `name` is a source data column and `type` is a transform; for
|
|
31
|
+
* Postgres, `name` is an existing key column and `type` is the strategy.
|
|
31
32
|
*/
|
|
32
33
|
export interface Partition {
|
|
33
|
-
/** Hive: new partition column name. Iceberg:
|
|
34
|
+
/** Hive: new partition column name. Iceberg / Postgres: existing data/key column name. */
|
|
34
35
|
readonly name: string;
|
|
35
|
-
/** Hive: a normal type. Iceberg: a transform (e.g. `day`, `bucket[16]`). */
|
|
36
|
+
/** Hive: a normal type. Iceberg: a transform (e.g. `day`, `bucket[16]`). Postgres: a strategy (`range` / `list` / `hash`). */
|
|
36
37
|
readonly type: string;
|
|
37
38
|
/** Human description. */
|
|
38
39
|
readonly description: string;
|
package/dist/src/model.js
CHANGED
|
@@ -23,4 +23,4 @@ exports.TABLE_TYPES = [
|
|
|
23
23
|
TableType.ICEBERG_PARQUET,
|
|
24
24
|
TableType.POSTGRES_18,
|
|
25
25
|
];
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCx3RUFBd0U7QUFDeEUsSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ2pCLDBDQUE2QixDQUFBO0lBQzdCLGdEQUFtQyxDQUFBO0lBQ25DLHdDQUEyQixDQUFBO0FBQy9CLENBQUMsRUFKVyxTQUFTLHlCQUFULFNBQVMsUUFJcEI7QUFFRCw2REFBNkQ7QUFDaEQsUUFBQSxXQUFXLEdBQXNCO0lBQzFDLFNBQVMsQ0FBQyxZQUFZO0lBQ3RCLFNBQVMsQ0FBQyxlQUFlO0lBQ3pCLFNBQVMsQ0FBQyxXQUFXO0NBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcmUgZGF0YSBtb2RlbCBmb3IgdGhlIEZsZXhpYmxlIERhdGFzZXQgRGVmaW5pdGlvbiAoRkREKSBzdGFuZGFyZC5cbiAqXG4gKiBUaGVzZSBpbnRlcmZhY2VzIGRlc2NyaWJlIHRoZSAqcHVyZSBkYXRhKiBzaGFwZSBvZiBhIGRhdGFzZXQ6IGNvbHVtbnMsXG4gKiBwYXJ0aXRpb25zLCBmb3JlaWduIGtleXMsIHRhYmxlIGRlZmluaXRpb25zLCBhbmQgdGhlIHZpb2xhdGlvbnMgdGhlXG4gKiB2YWxpZGF0b3IgZW1pdHMuIFRoZSBsb2FkZWQgd29ybGQgKHNjaGVtYXMgKyB0YWJsZSBpbnN0YW5jZXMpIGFuZCB0aGVcbiAqIGFic3RyYWN0IHRhYmxlIGJhc2UgY2xhc3MgbGl2ZSBpbiBgLi93b3JsZGAgYW5kIGAuL3RhYmxlLXR5cGVgIHNvIHRoaXNcbiAqIG1vZHVsZSBzdGF5cyBhIGxlYWYgd2l0aCBubyBiZWhhdmlvci5cbiAqL1xuXG4vKiogVGFibGUgZW5naW5lLiBFYWNoIHZhbHVlIHVubG9ja3MgZW5naW5lLXNwZWNpZmljIHNlbWFudGljIGNoZWNrcy4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlVHlwZSB7XG4gICAgSElWRV9QQVJRVUVUID0gJ2hpdmVfcGFycXVldCcsXG4gICAgSUNFQkVSR19QQVJRVUVUID0gJ2ljZWJlcmdfcGFycXVldCcsXG4gICAgUE9TVEdSRVNfMTggPSAncG9zdGdyZXNfMTgnLFxufVxuXG4vKiogRXZlcnkga25vd24gYHRhYmxlVHlwZWAgc3RyaW5nLCBmb3IgbWVtYmVyc2hpcCBjaGVja3MuICovXG5leHBvcnQgY29uc3QgVEFCTEVfVFlQRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAgIFRhYmxlVHlwZS5ISVZFX1BBUlFVRVQsXG4gICAgVGFibGVUeXBlLklDRUJFUkdfUEFSUVVFVCxcbiAgICBUYWJsZVR5cGUuUE9TVEdSRVNfMTgsXG5dO1xuXG4vKiogQSBzaW5nbGUgZGF0YSBjb2x1bW4uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gICAgLyoqIENvbHVtbiBuYW1lICh1bmlxdWUgd2l0aGluIGEgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBFbmdpbmUtc3BlY2lmaWMgdHlwZSBzdHJpbmcgKGUuZy4gYGxvbmdgLCBgdmFyY2hhcigyNTUpYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwYXJ0aXRpb24gZW50cnkuIFRoZSBtZWFuaW5nIG9mIGBuYW1lYCBhbmQgYHR5cGVgIGlzIGVuZ2luZS1zcGVjaWZpYzogZm9yXG4gKiBIaXZlLCBgbmFtZWAgaXMgYSBuZXcgcGFydGl0aW9uIGNvbHVtbiBhbmQgYHR5cGVgIGlzIGEgbm9ybWFsIHR5cGU7IGZvclxuICogSWNlYmVyZywgYG5hbWVgIGlzIGEgc291cmNlIGRhdGEgY29sdW1uIGFuZCBgdHlwZWAgaXMgYSB0cmFuc2Zvcm07IGZvclxuICogUG9zdGdyZXMsIGBuYW1lYCBpcyBhbiBleGlzdGluZyBrZXkgY29sdW1uIGFuZCBgdHlwZWAgaXMgdGhlIHN0cmF0ZWd5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpdGlvbiB7XG4gICAgLyoqIEhpdmU6IG5ldyBwYXJ0aXRpb24gY29sdW1uIG5hbWUuIEljZWJlcmcgLyBQb3N0Z3JlczogZXhpc3RpbmcgZGF0YS9rZXkgY29sdW1uIG5hbWUuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEhpdmU6IGEgbm9ybWFsIHR5cGUuIEljZWJlcmc6IGEgdHJhbnNmb3JtIChlLmcuIGBkYXlgLCBgYnVja2V0WzE2XWApLiBQb3N0Z3JlczogYSBzdHJhdGVneSAoYHJhbmdlYCAvIGBsaXN0YCAvIGBoYXNoYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBBIGZvcmVpZ24ta2V5IHJlZmVyZW5jZSB0byBhIGNvbHVtbiBpbiBhbm90aGVyIHRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JlaWduS2V5IHtcbiAgICAvKiogUmVmZXJlbmNlZCB0YWJsZSBpbiBgc2NoZW1hLnRhYmxlYCBmb3JtYXQuICovXG4gICAgcmVhZG9ubHkgc291cmNlVGFibGU6IHN0cmluZztcblxuICAgIC8qKiBSZWZlcmVuY2VkIGNvbHVtbiBpbiB0aGUgc291cmNlIHRhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHNvdXJjZUNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIExvY2FsIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSByZWZlcmVuY2UuICovXG4gICAgcmVhZG9ubHkgbG9jYWxDb2x1bW46IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBsb2NhbCBjb2x1bW4gbWF5IGJlIG51bGwuICovXG4gICAgcmVhZG9ubHkgYWxsb3dOdWxsczogYm9vbGVhbjtcbn1cblxuLyoqIE5vcm1hbGl6ZWQgdGFibGUgZGVmaW5pdGlvbiAob3B0aW9uYWwgYXJyYXlzIGRlZmF1bHRlZCB0byBlbXB0eSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRGVmaW5pdGlvbiB7XG4gICAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgZmlsZS4gKi9cbiAgICByZWFkb25seSBzcGVjVmVyc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKiogRW5naW5lLiBNYXkgYmUgYW4gdW5rbm93biBzdHJpbmcgaWYgdGhlIGZpbGUgZmFpbGVkIHN0cnVjdHVyYWwgY2hlY2tzLiAqL1xuICAgIHJlYWRvbmx5IHRhYmxlVHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhpcyB0YWJsZSBpcyB0aGUgdG9wIG9mIHRoZSBwaXBlbGluZS4gKi9cbiAgICByZWFkb25seSBpc1Jhd0RhdGE6IGJvb2xlYW47XG5cbiAgICAvKiogRGF0YSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gICAgLyoqIFByaW1hcnkta2V5IGNvbHVtbiBuYW1lcy4gKi9cbiAgICByZWFkb25seSBwcmltYXJ5S2V5OiBzdHJpbmdbXTtcblxuICAgIC8qKiBQYXJ0aXRpb24gZW50cmllcyAoZW5naW5lLXNwZWNpZmljIHNlbWFudGljcykuICovXG4gICAgcmVhZG9ubHkgcGFydGl0aW9uczogUGFydGl0aW9uW107XG5cbiAgICAvKiogVXBzdHJlYW0gdGFibGVzIGluIGBzY2hlbWEudGFibGVgIGZvcm1hdC4gKi9cbiAgICByZWFkb25seSBkZXBlbmRzT246IHN0cmluZ1tdO1xuXG4gICAgLyoqIEZvcmVpZ24ga2V5cy4gKi9cbiAgICByZWFkb25seSBmb3JlaWduS2V5czogRm9yZWlnbktleVtdO1xufVxuXG4vKiogQSBzY2hlbWEtZGVzY3JpcHRpb24gZmlsZSdzIG5vcm1hbGl6ZWQgY29udGVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hRGVzY3JpcHRpb24ge1xuICAgIC8qKiBTcGVjIHZlcnNpb24gb2YgdGhlIGZpbGUuICovXG4gICAgcmVhZG9ubHkgc3BlY1ZlcnNpb246IHN0cmluZztcblxuICAgIC8qKiBIdW1hbiBkZXNjcmlwdGlvbi4gKi9cbiAgICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG4vKiogU2V2ZXJpdHkgb2YgYSB2aW9sYXRpb24uICovXG5leHBvcnQgdHlwZSBWaW9sYXRpb25MZXZlbCA9ICdlcnJvcicgfCAnd2FybmluZyc7XG5cbi8qKiBBIHNpbmdsZSB2YWxpZGF0aW9uIGZpbmRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpb2xhdGlvbiB7XG4gICAgLyoqIFNldmVyaXR5LiBgZXJyb3JgIGZhaWxzIHZhbGlkYXRpb247IGB3YXJuaW5nYCBkb2VzIG5vdC4gKi9cbiAgICByZWFkb25seSBsZXZlbDogVmlvbGF0aW9uTGV2ZWw7XG5cbiAgICAvKiogU3RhYmxlIG1hY2hpbmUtcmVhZGFibGUgcnVsZSBjb2RlIChlLmcuIGBQS19DT0xVTU5TX0VYSVNUYCkuICovXG4gICAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG4gICAgLyoqIE93bmluZyBzY2hlbWEsIGlmIGFwcGxpY2FibGUuICovXG4gICAgcmVhZG9ubHkgc2NoZW1hPzogc3RyaW5nO1xuXG4gICAgLyoqIE93bmluZyB0YWJsZSwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSB0YWJsZT86IHN0cmluZztcblxuICAgIC8qKiBGaWVsZCBwYXRoIHdpdGhpbiB0aGUgZmlsZSwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSBmaWVsZD86IHN0cmluZztcblxuICAgIC8qKiBTb3VyY2UgZmlsZSBwYXRoLCBpZiBhcHBsaWNhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbWVzc2FnZS4gKi9cbiAgICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgYWdncmVnYXRlIHJlc3VsdCBvZiB2YWxpZGF0aW5nIGEgcm9vdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgLyoqIFRydWUgd2hlbiB0aGVyZSBhcmUgbm8gYGVycm9yYC1sZXZlbCB2aW9sYXRpb25zLiAqL1xuICAgIHJlYWRvbmx5IG9rOiBib29sZWFuO1xuXG4gICAgLyoqIEFsbCBmaW5kaW5ncywgZXJyb3JzIGFuZCB3YXJuaW5ncy4gKi9cbiAgICByZWFkb25seSB2aW9sYXRpb25zOiBWaW9sYXRpb25bXTtcbn1cbiJdfQ==
|
package/dist/src/table-type.d.ts
CHANGED
|
@@ -84,9 +84,8 @@ export declare abstract class TableTypeBase {
|
|
|
84
84
|
*/
|
|
85
85
|
abstract isValidColumnType(type: string): boolean;
|
|
86
86
|
/**
|
|
87
|
-
* Engine-specific partition rules: duplicate detection
|
|
88
|
-
*
|
|
89
|
-
* support them.
|
|
87
|
+
* Engine-specific partition rules: duplicate detection plus the engine's
|
|
88
|
+
* key/column resolution and type / transform / strategy legality.
|
|
90
89
|
*
|
|
91
90
|
* @returns Every partition-related violation this table produces.
|
|
92
91
|
*/
|
package/dist/src/table-type.js
CHANGED
|
@@ -272,4 +272,4 @@ class TableTypeBase {
|
|
|
272
272
|
}
|
|
273
273
|
}
|
|
274
274
|
exports.TableTypeBase = TableTypeBase;
|
|
275
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWJsZS10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOzs7QUFtQ0g7Ozs7Ozs7R0FPRztBQUNILE1BQXNCLGFBQWE7SUFDL0IsMEJBQTBCO0lBQ1YsTUFBTSxDQUFTO0lBRS9CLGtCQUFrQjtJQUNGLElBQUksQ0FBUztJQUU3QixpQ0FBaUM7SUFDakIsYUFBYSxDQUFTO0lBRXRDLHdDQUF3QztJQUN4QixRQUFRLENBQVM7SUFFakMsNkRBQTZEO0lBQzdDLGlCQUFpQixDQUFVO0lBRTNDLDZCQUE2QjtJQUNiLFVBQVUsQ0FBa0I7SUFFNUM7Ozs7O09BS0c7SUFDSCxZQUFZLE1BQXVCO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLHNEQUFzRDtJQUV0RDs7Ozs7T0FLRztJQUNPLFNBQVMsQ0FBQyxPQUFxRDtRQUNyRSxNQUFNLFFBQVEsR0FBbUI7WUFDN0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDdEIsQ0FBQztRQUNGLE9BQU87WUFDSCxHQUFHLE9BQU87WUFDVixHQUFHLFFBQVE7U0FDZCxDQUFD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QyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0NBQ0o7QUE1U0Qsc0NBNFNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIGxvYWRlZCB0YWJsZS4gT25lIHN1YmNsYXNzIHBlciBlbmdpbmUuXG4gKlxuICogSG9sZHMgdGhlIG5vcm1hbGl6ZWQgdGFibGUgaWRlbnRpdHkgYW5kIGRlZmluaXRpb24sIHBsdXMgdGhlXG4gKiBlbmdpbmUtYWdub3N0aWMgTGF5ZXIgMiBydWxlcyBhcyBjb25jcmV0ZSBtZXRob2RzLiBFbmdpbmUtc3BlY2lmaWMgcnVsZXNcbiAqIChjb2x1bW4tdHlwZSB2YWxpZGl0eSwgcGFydGl0aW9uIHNlbWFudGljcykgYXJlIGFic3RyYWN0IOKAlCBlYWNoIHN1YmNsYXNzXG4gKiBpbXBsZW1lbnRzIHRoZW0sIHdoaWNoIGlzIHRoZSBsZXZlciB0aGF0IGxldHMgbmV3IGVuZ2luZXMgcGx1ZyBpbiB3aXRob3V0XG4gKiBlZGl0aW5nIHNjYXR0ZXJlZCBzd2l0Y2hlcy4gVGhlIGNyb3NzLWZpbGUgcnVsZXMgYXJlIGNvbmNyZXRlIGhlcmUgdG9vO1xuICogdGhleSB0YWtlIHRoZSB3b3JsZCBieSBhbiBpbnRlcmZhY2Ugc28gdGhlIGN5Y2xlIGJldHdlZW4gdGhpcyBtb2R1bGUgYW5kXG4gKiBgLi93b3JsZGAgaXMga2VwdCBhdCB0eXBlLWxldmVsIG9ubHkuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBGb3JlaWduS2V5LFxuICAgIFRhYmxlRGVmaW5pdGlvbixcbiAgICBWaW9sYXRpb24sXG59IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHR5cGUge1xuICAgIFdvcmxkLFxufSBmcm9tICcuL3dvcmxkJztcblxuLyoqIEZpZWxkcyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgYW55IGNvbmNyZXRlIHRhYmxlIHN1YmNsYXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZVR5cGVGaWVsZHMge1xuICAgIC8qKiBPd25pbmcgc2NoZW1hIG5hbWUgKHRoZSBmb2xkZXIgbmFtZSkuICovXG4gICAgcmVhZG9ubHkgc2NoZW1hOiBzdHJpbmc7XG5cbiAgICAvKiogVGFibGUgbmFtZSAodGhlIGZpbGUgbmFtZSB3aXRob3V0IGAuanNvbmApLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBgc2NoZW1hLnRhYmxlYCBpZGVudGlmaWVyLiAqL1xuICAgIHJlYWRvbmx5IHF1YWxpZmllZE5hbWU6IHN0cmluZztcblxuICAgIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZS4gKi9cbiAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGZpbGUgcGFzc2VkIExheWVyIDEgc3RydWN0dXJhbCB2YWxpZGF0aW9uLiAqL1xuICAgIHJlYWRvbmx5IHN0cnVjdHVyYWxseVZhbGlkOiBib29sZWFuO1xuXG4gICAgLyoqIE5vcm1hbGl6ZWQgZGVmaW5pdGlvbi4gKi9cbiAgICByZWFkb25seSBkZWZpbml0aW9uOiBUYWJsZURlZmluaXRpb247XG59XG5cbi8qKiBQcmUtZmlsbGVkIGxvY2F0aW9uIGZpZWxkcyBhdHRhY2hlZCB0byBldmVyeSB2aW9sYXRpb24gYSB0YWJsZSBlbWl0cy4gKi9cbnR5cGUgTG9jYXRpb25GaWVsZHMgPSBQaWNrPFZpb2xhdGlvbiwgJ3NjaGVtYScgfCAndGFibGUnIHwgJ3BhdGgnPjtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgZW5naW5lLXNwZWNpZmljIHRhYmxlIHR5cGVzLlxuICpcbiAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGBpc1ZhbGlkQ29sdW1uVHlwZWAgKHRoZSBlbmdpbmUncyB0eXBlIHJlZ2lzdHJ5KSBhbmRcbiAqIGBwYXJ0aXRpb25WaW9sYXRpb25zYCAodGhlIGVuZ2luZSdzIHBhcnRpdGlvbiBzZW1hbnRpY3MpLiBFdmVyeXRoaW5nIGVsc2VcbiAqIOKAlCBwcmltYXJ5LWtleSBjaGVja3MsIGR1cGVzLCByYXcgY29uc2lzdGVuY3ksIGRlcGVuZHMtb24gcmVzb2x1dGlvbixcbiAqIGZvcmVpZ24ta2V5IGNoZWNrcyDigJQgaXMgaWRlbnRpY2FsIGFjcm9zcyBlbmdpbmVzIGFuZCBsaXZlcyBoZXJlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVUeXBlQmFzZSB7XG4gICAgLyoqIE93bmluZyBzY2hlbWEgbmFtZS4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hOiBzdHJpbmc7XG5cbiAgICAvKiogVGFibGUgbmFtZS4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIGBzY2hlbWEudGFibGVgIGlkZW50aWZpZXIuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHF1YWxpZmllZE5hbWU6IHN0cmluZztcblxuICAgIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZS4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBmaWxlIHBhc3NlZCBMYXllciAxIHN0cnVjdHVyYWwgdmFsaWRhdGlvbi4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RydWN0dXJhbGx5VmFsaWQ6IGJvb2xlYW47XG5cbiAgICAvKiogTm9ybWFsaXplZCBkZWZpbml0aW9uLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkZWZpbml0aW9uOiBUYWJsZURlZmluaXRpb247XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSB0YWJsZSBpbnN0YW5jZSBmcm9tIHRoZSBub3JtYWxpemVkIGZpZWxkcyBwcm9kdWNlZCBieSB0aGVcbiAgICAgKiBsb2FkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGRzIFRoZSB0YWJsZSBpZGVudGl0eSBwbHVzIGl0cyBwYXJzZWQsIG5vcm1hbGl6ZWQgZGVmaW5pdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihmaWVsZHM6IFRhYmxlVHlwZUZpZWxkcykge1xuICAgICAgICB0aGlzLnNjaGVtYSA9IGZpZWxkcy5zY2hlbWE7XG4gICAgICAgIHRoaXMubmFtZSA9IGZpZWxkcy5uYW1lO1xuICAgICAgICB0aGlzLnF1YWxpZmllZE5hbWUgPSBmaWVsZHMucXVhbGlmaWVkTmFtZTtcbiAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpZWxkcy5maWxlUGF0aDtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmFsbHlWYWxpZCA9IGZpZWxkcy5zdHJ1Y3R1cmFsbHlWYWxpZDtcbiAgICAgICAgdGhpcy5kZWZpbml0aW9uID0gZmllbGRzLmRlZmluaXRpb247XG4gICAgfVxuXG4gICAgLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEhlbHBlcnMgc2hhcmVkIGJ5IGludHJhLXRhYmxlIGFuZCBjcm9zcy1maWxlIHJ1bGVzLlxuXG4gICAgLyoqXG4gICAgICogQnVpbGQgYSB2aW9sYXRpb24gcHJlLWZpbGxlZCB3aXRoIHRoaXMgdGFibGUncyBsb2NhdGlvbiBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFydGlhbCBUaGUgZmllbGRzIHNwZWNpZmljIHRvIHRoZSBydWxlIGZpcmluZyAoY29kZSwgbGV2ZWwsIG1lc3NhZ2UsIGZpZWxkKS5cbiAgICAgKiBAcmV0dXJucyBBIGZ1bGwgYFZpb2xhdGlvbmAgd2l0aCBgc2NoZW1hYCwgYHRhYmxlYCwgYW5kIGBwYXRoYCBzZXQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHZpb2xhdGlvbihwYXJ0aWFsOiBPbWl0PFZpb2xhdGlvbiwgJ3NjaGVtYScgfCAndGFibGUnIHwgJ3BhdGgnPik6IFZpb2xhdGlvbiB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uOiBMb2NhdGlvbkZpZWxkcyA9IHtcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgcGF0aDogdGhpcy5maWxlUGF0aCxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnBhcnRpYWwsXG4gICAgICAgICAgICAuLi5sb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgdGFibGUgZGVjbGFyZXMgYSBkYXRhIGNvbHVtbiB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgQ29sdW1uIG5hbWUgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gYG5hbWVgIG1hdGNoZXMgYW55IGNvbHVtbiBpbiBgZGVmaW5pdGlvbi5jb2x1bW5zYC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFzQ29sdW1uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBuYW1lcyB0aGF0IGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiBhIGxpc3QsIHByZXNlcnZpbmcgdGhlIG9yZGVyXG4gICAgICogb2YgZmlyc3QgZHVwbGljYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZXMgTmFtZXMgdG8gc2Nhbi5cbiAgICAgKiBAcmV0dXJucyBEdXBsaWNhdGVkIG5hbWVzLCBlYWNoIGxpc3RlZCBvbmNlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBmaW5kRHVwbGljYXRlcyhuYW1lczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXMuYWRkKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2Vlbi5hZGQobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIC4uLmR1cGxpY2F0ZXMsXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEVuZ2luZS1zcGVjaWZpYyBjb250cmFjdC5cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYHR5cGVgIGlzIGEgdmFsaWQgY29sdW1uLXR5cGUgc3RyaW5nIGZvciB0aGlzIGVuZ2luZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIENvbHVtbiB0eXBlIHN0cmluZyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGVuZ2luZSBhY2NlcHRzIHRoZSB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBpc1ZhbGlkQ29sdW1uVHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogRW5naW5lLXNwZWNpZmljIHBhcnRpdGlvbiBydWxlczogZHVwbGljYXRlIGRldGVjdGlvbiwgdHlwZS90cmFuc2Zvcm1cbiAgICAgKiBsZWdhbGl0eSwgYW5kIHRoZSBcIm5vIHBhcnRpdGlvbnMgYWxsb3dlZFwiIHJ1bGUgZm9yIGVuZ2luZXMgdGhhdCBkb24ndFxuICAgICAqIHN1cHBvcnQgdGhlbS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHBhcnRpdGlvbi1yZWxhdGVkIHZpb2xhdGlvbiB0aGlzIHRhYmxlIHByb2R1Y2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBwYXJ0aXRpb25WaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdO1xuXG4gICAgLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEFnbm9zdGljIGludHJhLXRhYmxlIHJ1bGVzLlxuXG4gICAgLy8vIFBLX0NPTFVNTlNfRVhJU1Qg4oCUIGV2ZXJ5IHByaW1hcnkta2V5IGNvbHVtbiBleGlzdHMgaW4gYGNvbHVtbnNgLlxuICAgIHByaXZhdGUgcHJpbWFyeUtleVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBrQ29sdW1uIG9mIHRoaXMuZGVmaW5pdGlvbi5wcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKHBrQ29sdW1uKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUEtfQ09MVU1OU19FWElTVCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAncHJpbWFyeUtleScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBwcmltYXJ5LWtleSBjb2x1bW4gXCIke3BrQ29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gTk9fRFVQTElDQVRFX0NPTFVNTlMg4oCUIGNvbHVtbiBuYW1lcyBhcmUgdW5pcXVlIHdpdGhpbiBhIHRhYmxlLlxuICAgIHByaXZhdGUgZHVwbGljYXRlQ29sdW1uVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZER1cGxpY2F0ZXMobmFtZXMpLm1hcCgoZHVwbGljYXRlKSA9PiB0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGNvZGU6ICdOT19EVVBMSUNBVEVfQ09MVU1OUycsXG4gICAgICAgICAgICBmaWVsZDogJ2NvbHVtbnMnLFxuICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBjb2x1bW4gbmFtZSBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vLyBDT0xVTU5fVFlQRV9WQUxJRCDigJQgZXZlcnkgY29sdW1uIHR5cGUgaXMgdmFsaWQgZm9yIHRoZSB0YWJsZSdzIGVuZ2luZS5cbiAgICBwcml2YXRlIGNvbHVtblR5cGVWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRDb2x1bW5UeXBlKGNvbHVtbi50eXBlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnQ09MVU1OX1RZUEVfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYGNvbHVtbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke2NvbHVtbi50eXBlfVwiIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5kZWZpbml0aW9uLnRhYmxlVHlwZX0gdHlwZSBgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGBmb3IgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIFJBV19OT19ERVBFTkRTX09OIC8gTk9OUkFXX1JFUVVJUkVTX0RFUEVORFNfT04uXG4gICAgcHJpdmF0ZSByYXdDb25zaXN0ZW5jeVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc1Jhd0RhdGEsXG4gICAgICAgICAgICBkZXBlbmRzT24sXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG4gICAgICAgIGlmIChpc1Jhd0RhdGEgJiYgZGVwZW5kc09uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1JBV19OT19ERVBFTkRTX09OJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2RlcGVuZHNPbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ3JhdyB0YWJsZXMgKGlzUmF3RGF0YT10cnVlKSBtdXN0IG5vdCBkZWNsYXJlIGRlcGVuZHNPbicsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1Jhd0RhdGEgJiYgZGVwZW5kc09uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnTk9OUkFXX1JFUVVJUkVTX0RFUEVORFNfT04nLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZGVwZW5kc09uJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnbm9uLXJhdyB0YWJsZXMgKGlzUmF3RGF0YT1mYWxzZSkgbXVzdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSBkZXBlbmRzT24nLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbCBpbnRyYS10YWJsZSB2aW9sYXRpb25zIGZvciB0aGlzIHRhYmxlIChlbmdpbmUtYWdub3N0aWMgcnVsZXMgcGx1c1xuICAgICAqIHRoZSBlbmdpbmUtc3BlY2lmaWMgcGFydGl0aW9uIHJ1bGVzKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGludHJhLXRhYmxlIHZpb2xhdGlvbiB0aGlzIHRhYmxlIHByb2R1Y2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnRyYVRhYmxlVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi50aGlzLnByaW1hcnlLZXlWaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLmR1cGxpY2F0ZUNvbHVtblZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuY29sdW1uVHlwZVZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMucGFydGl0aW9uVmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5yYXdDb25zaXN0ZW5jeVZpb2xhdGlvbnMoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQ3Jvc3MtZmlsZSBydWxlcy5cblxuICAgIC8vLyBERVBFTkRTX09OX1JFU09MVkVTIOKAlCBldmVyeSBkZXBlbmRzT24gZW50cnkgcmVzb2x2ZXMgdG8gYSByZWFsIHRhYmxlLlxuICAgIHByaXZhdGUgZGVwZW5kc09uVmlvbGF0aW9ucyh3b3JsZDogV29ybGQpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5kZXBlbmRzT24uZm9yRWFjaCgoZGVwZW5kZW5jeSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghd29ybGQudGFibGVzLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnREVQRU5EU19PTl9SRVNPTFZFUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgZGVwZW5kc09uWyR7aW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkZXBlbmRzT24gXCIke2RlcGVuZGVuY3l9XCIgZG9lcyBub3QgcmVzb2x2ZSB0byBhIGtub3duIHRhYmxlYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gRm9yZWlnbi1rZXkgY2hlY2tzIGZvciBhIHNpbmdsZSBGSyBlbnRyeS5cbiAgICBwcml2YXRlIGZvcmVpZ25LZXlWaW9sYXRpb25zKHdvcmxkOiBXb3JsZCwgZms6IEZvcmVpZ25LZXksIGluZGV4OiBudW1iZXIpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IGZpZWxkID0gYGZvcmVpZ25LZXlzWyR7aW5kZXh9XWA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihmay5sb2NhbENvbHVtbikpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0ZLX0xPQ0FMX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0ubG9jYWxDb2x1bW5gLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBsb2NhbCBjb2x1bW4gXCIke2ZrLmxvY2FsQ29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8vIEEgc2VsZi1yZWZlcmVudGlhbCBmb3JlaWduIGtleSAoZS5nLiBhIGBwYXJlbnRfaWRgIHBvaW50aW5nIGF0IHRoZSBzYW1lXG4gICAgICAgIC8vLyB0YWJsZSdzIGtleSkgZG9lcyBub3QgY3JlYXRlIGEgcGlwZWxpbmUgZGVwZW5kZW5jeSwgc28gaXQgaXMgZXhlbXB0IGZyb21cbiAgICAgICAgLy8vIEZLX0lNUExJRVNfREVQRU5ERU5DWSDigJQgcmVxdWlyaW5nIGEgc2VsZi1gZGVwZW5kc09uYCB3b3VsZCBvdGhlcndpc2UgZm9yY2VcbiAgICAgICAgLy8vIGEgc3B1cmlvdXMgZGVwZW5kZW5jeSBjeWNsZS5cbiAgICAgICAgY29uc3QgaXNTZWxmUmVmZXJlbmNlID0gZmsuc291cmNlVGFibGUgPT09IHRoaXMucXVhbGlmaWVkTmFtZTtcbiAgICAgICAgaWYgKCFpc1NlbGZSZWZlcmVuY2UgJiYgIXRoaXMuZGVmaW5pdGlvbi5kZXBlbmRzT24uaW5jbHVkZXMoZmsuc291cmNlVGFibGUpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdGS19JTVBMSUVTX0RFUEVOREVOQ1knLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uc291cmNlVGFibGVgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBmb3JlaWduIGtleSB0YXJnZXRzIFwiJHtmay5zb3VyY2VUYWJsZX1cIiBidXQgaXQgaXMgbm90IGxpc3RlZCBpbiBkZXBlbmRzT25gLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gd29ybGQudGFibGVzLmdldChmay5zb3VyY2VUYWJsZSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRktfU09VUkNFX1RBQkxFX1JFU09MVkVTJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnNvdXJjZVRhYmxlYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZm9yZWlnbiBrZXkgc291cmNlIHRhYmxlIFwiJHtmay5zb3VyY2VUYWJsZX1cIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEga25vd24gdGFibGVgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLy8gVGhlIHRhcmdldCdzIG93biBzdHJ1Y3R1cmFsIGVycm9ycyAocmVwb3J0ZWQgYnkgTGF5ZXIgMSkgYWxyZWFkeSBleHBsYWluXG4gICAgICAgIC8vLyB3aHkgaXRzIGNvbHVtbnMgY2FuJ3QgYmUgdHJ1c3RlZDsgc2tpcCBjb2x1bW4tbGV2ZWwgY2hlY2tzIHRvIGF2b2lkXG4gICAgICAgIC8vLyBwaWxpbmcgbWlzbGVhZGluZyBmaW5kaW5ncyBvbiB0b3AuXG4gICAgICAgIGlmICghdGFyZ2V0LnN0cnVjdHVyYWxseVZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldEhhc0NvbHVtbiA9IHRhcmdldC5kZWZpbml0aW9uLmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gZmsuc291cmNlQ29sdW1uKTtcbiAgICAgICAgaWYgKCF0YXJnZXRIYXNDb2x1bW4pIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0ZLX1NPVVJDRV9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnNvdXJjZUNvbHVtbmAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGZvcmVpZ24ga2V5IHNvdXJjZSBjb2x1bW4gXCIke2ZrLnNvdXJjZUNvbHVtbn1cIiBpcyBub3QgZGVmaW5lZCBpbiBcIiR7Zmsuc291cmNlVGFibGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldC5kZWZpbml0aW9uLnByaW1hcnlLZXkuaW5jbHVkZXMoZmsuc291cmNlQ29sdW1uKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdGS19TT1VSQ0VfSVNfS0VZJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnNvdXJjZUNvbHVtbmAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGZvcmVpZ24ga2V5IHNvdXJjZSBjb2x1bW4gXCIke2ZrLnNvdXJjZUNvbHVtbn1cIiBpcyBub3QgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXkgYFxuICAgICAgICAgICAgICAgICAgICArIGBvZiBcIiR7Zmsuc291cmNlVGFibGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsIGNyb3NzLWZpbGUgdmlvbGF0aW9ucyBmb3IgdGhpcyB0YWJsZSAoYGRlcGVuZHNPbmAgcmVzb2x1dGlvbiBwbHVzXG4gICAgICogdGhlIGZ1bGwgZm9yZWlnbi1rZXkgc3VpdGUpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdvcmxkIFRoZSBsb2FkZWQgZGF0YXNldCByb290LlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGNyb3NzLWZpbGUgdmlvbGF0aW9uIHRoaXMgdGFibGUgcHJvZHVjZXMuXG4gICAgICovXG4gICAgcHVibGljIGNyb3NzRmlsZVZpb2xhdGlvbnMod29ybGQ6IFdvcmxkKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuZGVwZW5kc09uVmlvbGF0aW9ucyh3b3JsZCksXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5mb3JlaWduS2V5cy5mb3JFYWNoKChmaywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCguLi50aGlzLmZvcmVpZ25LZXlWaW9sYXRpb25zKHdvcmxkLCBmaywgaW5kZXgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cbn1cbiJdfQ==
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWJsZS10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOzs7QUFtQ0g7Ozs7Ozs7R0FPRztBQUNILE1BQXNCLGFBQWE7SUFDL0IsMEJBQTBCO0lBQ1YsTUFBTSxDQUFTO0lBRS9CLGtCQUFrQjtJQUNGLElBQUksQ0FBUztJQUU3QixpQ0FBaUM7SUFDakIsYUFBYSxDQUFTO0lBRXRDLHdDQUF3QztJQUN4QixRQUFRLENBQVM7SUFFakMsNkRBQTZEO0lBQzdDLGlCQUFpQixDQUFVO0lBRTNDLDZCQUE2QjtJQUNiLFVBQVUsQ0FBa0I7SUFFNUM7Ozs7O09BS0c7SUFDSCxZQUFZLE1BQXVCO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLHNEQUFzRDtJQUV0RDs7Ozs7T0FLRztJQUNPLFNBQVMsQ0FBQyxPQUFxRDtRQUNyRSxNQUFNLFFBQVEsR0FBbUI7WUFDN0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDdEIsQ0FBQztRQUNGLE9BQU87WUFDSCxHQUFHLE9BQU87WUFDVixHQUFHLFFBQVE7U0FDZCxDQUFD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QyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0NBQ0o7QUEzU0Qsc0NBMlNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIGxvYWRlZCB0YWJsZS4gT25lIHN1YmNsYXNzIHBlciBlbmdpbmUuXG4gKlxuICogSG9sZHMgdGhlIG5vcm1hbGl6ZWQgdGFibGUgaWRlbnRpdHkgYW5kIGRlZmluaXRpb24sIHBsdXMgdGhlXG4gKiBlbmdpbmUtYWdub3N0aWMgTGF5ZXIgMiBydWxlcyBhcyBjb25jcmV0ZSBtZXRob2RzLiBFbmdpbmUtc3BlY2lmaWMgcnVsZXNcbiAqIChjb2x1bW4tdHlwZSB2YWxpZGl0eSwgcGFydGl0aW9uIHNlbWFudGljcykgYXJlIGFic3RyYWN0IOKAlCBlYWNoIHN1YmNsYXNzXG4gKiBpbXBsZW1lbnRzIHRoZW0sIHdoaWNoIGlzIHRoZSBsZXZlciB0aGF0IGxldHMgbmV3IGVuZ2luZXMgcGx1ZyBpbiB3aXRob3V0XG4gKiBlZGl0aW5nIHNjYXR0ZXJlZCBzd2l0Y2hlcy4gVGhlIGNyb3NzLWZpbGUgcnVsZXMgYXJlIGNvbmNyZXRlIGhlcmUgdG9vO1xuICogdGhleSB0YWtlIHRoZSB3b3JsZCBieSBhbiBpbnRlcmZhY2Ugc28gdGhlIGN5Y2xlIGJldHdlZW4gdGhpcyBtb2R1bGUgYW5kXG4gKiBgLi93b3JsZGAgaXMga2VwdCBhdCB0eXBlLWxldmVsIG9ubHkuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBGb3JlaWduS2V5LFxuICAgIFRhYmxlRGVmaW5pdGlvbixcbiAgICBWaW9sYXRpb24sXG59IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHR5cGUge1xuICAgIFdvcmxkLFxufSBmcm9tICcuL3dvcmxkJztcblxuLyoqIEZpZWxkcyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgYW55IGNvbmNyZXRlIHRhYmxlIHN1YmNsYXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZVR5cGVGaWVsZHMge1xuICAgIC8qKiBPd25pbmcgc2NoZW1hIG5hbWUgKHRoZSBmb2xkZXIgbmFtZSkuICovXG4gICAgcmVhZG9ubHkgc2NoZW1hOiBzdHJpbmc7XG5cbiAgICAvKiogVGFibGUgbmFtZSAodGhlIGZpbGUgbmFtZSB3aXRob3V0IGAuanNvbmApLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBgc2NoZW1hLnRhYmxlYCBpZGVudGlmaWVyLiAqL1xuICAgIHJlYWRvbmx5IHF1YWxpZmllZE5hbWU6IHN0cmluZztcblxuICAgIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZS4gKi9cbiAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGZpbGUgcGFzc2VkIExheWVyIDEgc3RydWN0dXJhbCB2YWxpZGF0aW9uLiAqL1xuICAgIHJlYWRvbmx5IHN0cnVjdHVyYWxseVZhbGlkOiBib29sZWFuO1xuXG4gICAgLyoqIE5vcm1hbGl6ZWQgZGVmaW5pdGlvbi4gKi9cbiAgICByZWFkb25seSBkZWZpbml0aW9uOiBUYWJsZURlZmluaXRpb247XG59XG5cbi8qKiBQcmUtZmlsbGVkIGxvY2F0aW9uIGZpZWxkcyBhdHRhY2hlZCB0byBldmVyeSB2aW9sYXRpb24gYSB0YWJsZSBlbWl0cy4gKi9cbnR5cGUgTG9jYXRpb25GaWVsZHMgPSBQaWNrPFZpb2xhdGlvbiwgJ3NjaGVtYScgfCAndGFibGUnIHwgJ3BhdGgnPjtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgZW5naW5lLXNwZWNpZmljIHRhYmxlIHR5cGVzLlxuICpcbiAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGBpc1ZhbGlkQ29sdW1uVHlwZWAgKHRoZSBlbmdpbmUncyB0eXBlIHJlZ2lzdHJ5KSBhbmRcbiAqIGBwYXJ0aXRpb25WaW9sYXRpb25zYCAodGhlIGVuZ2luZSdzIHBhcnRpdGlvbiBzZW1hbnRpY3MpLiBFdmVyeXRoaW5nIGVsc2VcbiAqIOKAlCBwcmltYXJ5LWtleSBjaGVja3MsIGR1cGVzLCByYXcgY29uc2lzdGVuY3ksIGRlcGVuZHMtb24gcmVzb2x1dGlvbixcbiAqIGZvcmVpZ24ta2V5IGNoZWNrcyDigJQgaXMgaWRlbnRpY2FsIGFjcm9zcyBlbmdpbmVzIGFuZCBsaXZlcyBoZXJlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVUeXBlQmFzZSB7XG4gICAgLyoqIE93bmluZyBzY2hlbWEgbmFtZS4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hOiBzdHJpbmc7XG5cbiAgICAvKiogVGFibGUgbmFtZS4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIGBzY2hlbWEudGFibGVgIGlkZW50aWZpZXIuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHF1YWxpZmllZE5hbWU6IHN0cmluZztcblxuICAgIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZS4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBmaWxlIHBhc3NlZCBMYXllciAxIHN0cnVjdHVyYWwgdmFsaWRhdGlvbi4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RydWN0dXJhbGx5VmFsaWQ6IGJvb2xlYW47XG5cbiAgICAvKiogTm9ybWFsaXplZCBkZWZpbml0aW9uLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkZWZpbml0aW9uOiBUYWJsZURlZmluaXRpb247XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSB0YWJsZSBpbnN0YW5jZSBmcm9tIHRoZSBub3JtYWxpemVkIGZpZWxkcyBwcm9kdWNlZCBieSB0aGVcbiAgICAgKiBsb2FkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGRzIFRoZSB0YWJsZSBpZGVudGl0eSBwbHVzIGl0cyBwYXJzZWQsIG5vcm1hbGl6ZWQgZGVmaW5pdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihmaWVsZHM6IFRhYmxlVHlwZUZpZWxkcykge1xuICAgICAgICB0aGlzLnNjaGVtYSA9IGZpZWxkcy5zY2hlbWE7XG4gICAgICAgIHRoaXMubmFtZSA9IGZpZWxkcy5uYW1lO1xuICAgICAgICB0aGlzLnF1YWxpZmllZE5hbWUgPSBmaWVsZHMucXVhbGlmaWVkTmFtZTtcbiAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpZWxkcy5maWxlUGF0aDtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmFsbHlWYWxpZCA9IGZpZWxkcy5zdHJ1Y3R1cmFsbHlWYWxpZDtcbiAgICAgICAgdGhpcy5kZWZpbml0aW9uID0gZmllbGRzLmRlZmluaXRpb247XG4gICAgfVxuXG4gICAgLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEhlbHBlcnMgc2hhcmVkIGJ5IGludHJhLXRhYmxlIGFuZCBjcm9zcy1maWxlIHJ1bGVzLlxuXG4gICAgLyoqXG4gICAgICogQnVpbGQgYSB2aW9sYXRpb24gcHJlLWZpbGxlZCB3aXRoIHRoaXMgdGFibGUncyBsb2NhdGlvbiBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFydGlhbCBUaGUgZmllbGRzIHNwZWNpZmljIHRvIHRoZSBydWxlIGZpcmluZyAoY29kZSwgbGV2ZWwsIG1lc3NhZ2UsIGZpZWxkKS5cbiAgICAgKiBAcmV0dXJucyBBIGZ1bGwgYFZpb2xhdGlvbmAgd2l0aCBgc2NoZW1hYCwgYHRhYmxlYCwgYW5kIGBwYXRoYCBzZXQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHZpb2xhdGlvbihwYXJ0aWFsOiBPbWl0PFZpb2xhdGlvbiwgJ3NjaGVtYScgfCAndGFibGUnIHwgJ3BhdGgnPik6IFZpb2xhdGlvbiB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uOiBMb2NhdGlvbkZpZWxkcyA9IHtcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgcGF0aDogdGhpcy5maWxlUGF0aCxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnBhcnRpYWwsXG4gICAgICAgICAgICAuLi5sb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgdGFibGUgZGVjbGFyZXMgYSBkYXRhIGNvbHVtbiB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgQ29sdW1uIG5hbWUgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gYG5hbWVgIG1hdGNoZXMgYW55IGNvbHVtbiBpbiBgZGVmaW5pdGlvbi5jb2x1bW5zYC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFzQ29sdW1uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBuYW1lcyB0aGF0IGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiBhIGxpc3QsIHByZXNlcnZpbmcgdGhlIG9yZGVyXG4gICAgICogb2YgZmlyc3QgZHVwbGljYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZXMgTmFtZXMgdG8gc2Nhbi5cbiAgICAgKiBAcmV0dXJucyBEdXBsaWNhdGVkIG5hbWVzLCBlYWNoIGxpc3RlZCBvbmNlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBmaW5kRHVwbGljYXRlcyhuYW1lczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXMuYWRkKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2Vlbi5hZGQobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIC4uLmR1cGxpY2F0ZXMsXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEVuZ2luZS1zcGVjaWZpYyBjb250cmFjdC5cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYHR5cGVgIGlzIGEgdmFsaWQgY29sdW1uLXR5cGUgc3RyaW5nIGZvciB0aGlzIGVuZ2luZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIENvbHVtbiB0eXBlIHN0cmluZyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGVuZ2luZSBhY2NlcHRzIHRoZSB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBpc1ZhbGlkQ29sdW1uVHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogRW5naW5lLXNwZWNpZmljIHBhcnRpdGlvbiBydWxlczogZHVwbGljYXRlIGRldGVjdGlvbiBwbHVzIHRoZSBlbmdpbmUnc1xuICAgICAqIGtleS9jb2x1bW4gcmVzb2x1dGlvbiBhbmQgdHlwZSAvIHRyYW5zZm9ybSAvIHN0cmF0ZWd5IGxlZ2FsaXR5LlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgcGFydGl0aW9uLXJlbGF0ZWQgdmlvbGF0aW9uIHRoaXMgdGFibGUgcHJvZHVjZXMuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IHBhcnRpdGlvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW107XG5cbiAgICAvLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQWdub3N0aWMgaW50cmEtdGFibGUgcnVsZXMuXG5cbiAgICAvLy8gUEtfQ09MVU1OU19FWElTVCDigJQgZXZlcnkgcHJpbWFyeS1rZXkgY29sdW1uIGV4aXN0cyBpbiBgY29sdW1uc2AuXG4gICAgcHJpdmF0ZSBwcmltYXJ5S2V5VmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGtDb2x1bW4gb2YgdGhpcy5kZWZpbml0aW9uLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW4ocGtDb2x1bW4pKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQS19DT0xVTU5TX0VYSVNUJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdwcmltYXJ5S2V5JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHByaW1hcnkta2V5IGNvbHVtbiBcIiR7cGtDb2x1bW59XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8vLyBOT19EVVBMSUNBVEVfQ09MVU1OUyDigJQgY29sdW1uIG5hbWVzIGFyZSB1bmlxdWUgd2l0aGluIGEgdGFibGUuXG4gICAgcHJpdmF0ZSBkdXBsaWNhdGVDb2x1bW5WaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgbmFtZXMgPSB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kRHVwbGljYXRlcyhuYW1lcykubWFwKChkdXBsaWNhdGUpID0+IHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgY29kZTogJ05PX0RVUExJQ0FURV9DT0xVTU5TJyxcbiAgICAgICAgICAgIGZpZWxkOiAnY29sdW1ucycsXG4gICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIGNvbHVtbiBuYW1lIFwiJHtkdXBsaWNhdGV9XCJgLFxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8vIENPTFVNTl9UWVBFX1ZBTElEIOKAlCBldmVyeSBjb2x1bW4gdHlwZSBpcyB2YWxpZCBmb3IgdGhlIHRhYmxlJ3MgZW5naW5lLlxuICAgIHByaXZhdGUgY29sdW1uVHlwZVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZENvbHVtblR5cGUoY29sdW1uLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdDT0xVTU5fVFlQRV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgY29sdW1uc1ske2luZGV4fV0udHlwZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7Y29sdW1uLnR5cGV9XCIgaXMgbm90IGEgdmFsaWQgJHt0aGlzLmRlZmluaXRpb24udGFibGVUeXBlfSB0eXBlIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICsgYGZvciBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gUkFXX05PX0RFUEVORFNfT04gLyBOT05SQVdfUkVRVUlSRVNfREVQRU5EU19PTi5cbiAgICBwcml2YXRlIHJhd0NvbnNpc3RlbmN5VmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGlzUmF3RGF0YSxcbiAgICAgICAgICAgIGRlcGVuZHNPbixcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKGlzUmF3RGF0YSAmJiBkZXBlbmRzT24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUkFXX05PX0RFUEVORFNfT04nLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZGVwZW5kc09uJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAncmF3IHRhYmxlcyAoaXNSYXdEYXRhPXRydWUpIG11c3Qgbm90IGRlY2xhcmUgZGVwZW5kc09uJyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzUmF3RGF0YSAmJiBkZXBlbmRzT24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdOT05SQVdfUkVRVUlSRVNfREVQRU5EU19PTicsXG4gICAgICAgICAgICAgICAgZmllbGQ6ICdkZXBlbmRzT24nLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdub24tcmF3IHRhYmxlcyAoaXNSYXdEYXRhPWZhbHNlKSBtdXN0IGRlY2xhcmUgYXQgbGVhc3Qgb25lIGRlcGVuZHNPbicsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsIGludHJhLXRhYmxlIHZpb2xhdGlvbnMgZm9yIHRoaXMgdGFibGUgKGVuZ2luZS1hZ25vc3RpYyBydWxlcyBwbHVzXG4gICAgICogdGhlIGVuZ2luZS1zcGVjaWZpYyBwYXJ0aXRpb24gcnVsZXMpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgaW50cmEtdGFibGUgdmlvbGF0aW9uIHRoaXMgdGFibGUgcHJvZHVjZXMuXG4gICAgICovXG4gICAgcHVibGljIGludHJhVGFibGVWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIC4uLnRoaXMucHJpbWFyeUtleVZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuZHVwbGljYXRlQ29sdW1uVmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5jb2x1bW5UeXBlVmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5wYXJ0aXRpb25WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnJhd0NvbnNpc3RlbmN5VmlvbGF0aW9ucygpLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBDcm9zcy1maWxlIHJ1bGVzLlxuXG4gICAgLy8vIERFUEVORFNfT05fUkVTT0xWRVMg4oCUIGV2ZXJ5IGRlcGVuZHNPbiBlbnRyeSByZXNvbHZlcyB0byBhIHJlYWwgdGFibGUuXG4gICAgcHJpdmF0ZSBkZXBlbmRzT25WaW9sYXRpb25zKHdvcmxkOiBXb3JsZCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgdGhpcy5kZWZpbml0aW9uLmRlcGVuZHNPbi5mb3JFYWNoKChkZXBlbmRlbmN5LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF3b3JsZC50YWJsZXMuaGFzKGRlcGVuZGVuY3kpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdERVBFTkRTX09OX1JFU09MVkVTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBkZXBlbmRzT25bJHtpbmRleH1dYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGRlcGVuZHNPbiBcIiR7ZGVwZW5kZW5jeX1cIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEga25vd24gdGFibGVgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8vLyBGb3JlaWduLWtleSBjaGVja3MgZm9yIGEgc2luZ2xlIEZLIGVudHJ5LlxuICAgIHByaXZhdGUgZm9yZWlnbktleVZpb2xhdGlvbnMod29ybGQ6IFdvcmxkLCBmazogRm9yZWlnbktleSwgaW5kZXg6IG51bWJlcik6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBgZm9yZWlnbktleXNbJHtpbmRleH1dYDtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKGZrLmxvY2FsQ29sdW1uKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRktfTE9DQUxfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5sb2NhbENvbHVtbmAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGxvY2FsIGNvbHVtbiBcIiR7ZmsubG9jYWxDb2x1bW59XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLy8gQSBzZWxmLXJlZmVyZW50aWFsIGZvcmVpZ24ga2V5IChlLmcuIGEgYHBhcmVudF9pZGAgcG9pbnRpbmcgYXQgdGhlIHNhbWVcbiAgICAgICAgLy8vIHRhYmxlJ3Mga2V5KSBkb2VzIG5vdCBjcmVhdGUgYSBwaXBlbGluZSBkZXBlbmRlbmN5LCBzbyBpdCBpcyBleGVtcHQgZnJvbVxuICAgICAgICAvLy8gRktfSU1QTElFU19ERVBFTkRFTkNZIOKAlCByZXF1aXJpbmcgYSBzZWxmLWBkZXBlbmRzT25gIHdvdWxkIG90aGVyd2lzZSBmb3JjZVxuICAgICAgICAvLy8gYSBzcHVyaW91cyBkZXBlbmRlbmN5IGN5Y2xlLlxuICAgICAgICBjb25zdCBpc1NlbGZSZWZlcmVuY2UgPSBmay5zb3VyY2VUYWJsZSA9PT0gdGhpcy5xdWFsaWZpZWROYW1lO1xuICAgICAgICBpZiAoIWlzU2VsZlJlZmVyZW5jZSAmJiAhdGhpcy5kZWZpbml0aW9uLmRlcGVuZHNPbi5pbmNsdWRlcyhmay5zb3VyY2VUYWJsZSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0ZLX0lNUExJRVNfREVQRU5ERU5DWScsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5zb3VyY2VUYWJsZWAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGZvcmVpZ24ga2V5IHRhcmdldHMgXCIke2ZrLnNvdXJjZVRhYmxlfVwiIGJ1dCBpdCBpcyBub3QgbGlzdGVkIGluIGRlcGVuZHNPbmAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXQgPSB3b3JsZC50YWJsZXMuZ2V0KGZrLnNvdXJjZVRhYmxlKTtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdGS19TT1VSQ0VfVEFCTEVfUkVTT0xWRVMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uc291cmNlVGFibGVgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBmb3JlaWduIGtleSBzb3VyY2UgdGFibGUgXCIke2ZrLnNvdXJjZVRhYmxlfVwiIGRvZXMgbm90IHJlc29sdmUgdG8gYSBrbm93biB0YWJsZWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vLyBUaGUgdGFyZ2V0J3Mgb3duIHN0cnVjdHVyYWwgZXJyb3JzIChyZXBvcnRlZCBieSBMYXllciAxKSBhbHJlYWR5IGV4cGxhaW5cbiAgICAgICAgLy8vIHdoeSBpdHMgY29sdW1ucyBjYW4ndCBiZSB0cnVzdGVkOyBza2lwIGNvbHVtbi1sZXZlbCBjaGVja3MgdG8gYXZvaWRcbiAgICAgICAgLy8vIHBpbGluZyBtaXNsZWFkaW5nIGZpbmRpbmdzIG9uIHRvcC5cbiAgICAgICAgaWYgKCF0YXJnZXQuc3RydWN0dXJhbGx5VmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0SGFzQ29sdW1uID0gdGFyZ2V0LmRlZmluaXRpb24uY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBmay5zb3VyY2VDb2x1bW4pO1xuICAgICAgICBpZiAoIXRhcmdldEhhc0NvbHVtbikge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRktfU09VUkNFX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uc291cmNlQ29sdW1uYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZm9yZWlnbiBrZXkgc291cmNlIGNvbHVtbiBcIiR7Zmsuc291cmNlQ29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIFwiJHtmay5zb3VyY2VUYWJsZX1cImAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGFyZ2V0LmRlZmluaXRpb24ucHJpbWFyeUtleS5pbmNsdWRlcyhmay5zb3VyY2VDb2x1bW4pKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgY29kZTogJ0ZLX1NPVVJDRV9JU19LRVknLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uc291cmNlQ29sdW1uYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZm9yZWlnbiBrZXkgc291cmNlIGNvbHVtbiBcIiR7Zmsuc291cmNlQ29sdW1ufVwiIGlzIG5vdCBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleSBgXG4gICAgICAgICAgICAgICAgICAgICsgYG9mIFwiJHtmay5zb3VyY2VUYWJsZX1cImAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGwgY3Jvc3MtZmlsZSB2aW9sYXRpb25zIGZvciB0aGlzIHRhYmxlIChgZGVwZW5kc09uYCByZXNvbHV0aW9uIHBsdXNcbiAgICAgKiB0aGUgZnVsbCBmb3JlaWduLWtleSBzdWl0ZSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd29ybGQgVGhlIGxvYWRlZCBkYXRhc2V0IHJvb3QuXG4gICAgICogQHJldHVybnMgRXZlcnkgY3Jvc3MtZmlsZSB2aW9sYXRpb24gdGhpcyB0YWJsZSBwcm9kdWNlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3Jvc3NGaWxlVmlvbGF0aW9ucyh3b3JsZDogV29ybGQpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW1xuICAgICAgICAgICAgLi4udGhpcy5kZXBlbmRzT25WaW9sYXRpb25zKHdvcmxkKSxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5kZWZpbml0aW9uLmZvcmVpZ25LZXlzLmZvckVhY2goKGZrLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKC4uLnRoaXMuZm9yZWlnbktleVZpb2xhdGlvbnMod29ybGQsIGZrLCBpbmRleCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxufVxuIl19
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Postgres 18 table type.
|
|
3
3
|
*
|
|
4
|
-
* Postgres
|
|
5
|
-
*
|
|
4
|
+
* Postgres uses declarative partitioning: a table is partitioned by one strategy
|
|
5
|
+
* (`range`, `list`, or `hash`) over one or more existing key columns. Each
|
|
6
|
+
* partition entry names a key column (`name`) and the strategy (`type`); all
|
|
7
|
+
* entries on a table must share one strategy.
|
|
6
8
|
*/
|
|
7
9
|
import { Violation } from '../model';
|
|
8
10
|
import { TableTypeBase } from '../table-type';
|
|
@@ -16,10 +18,15 @@ export declare class Postgres18Table extends TableTypeBase {
|
|
|
16
18
|
*/
|
|
17
19
|
isValidColumnType(type: string): boolean;
|
|
18
20
|
/**
|
|
19
|
-
* Postgres
|
|
20
|
-
* once when any partition entry is present.
|
|
21
|
+
* Postgres partition rules.
|
|
21
22
|
*
|
|
22
|
-
*
|
|
23
|
+
* Emits: `NO_DUPLICATE_PARTITIONS` (a key column listed twice),
|
|
24
|
+
* `POSTGRES_PARTITION_COLUMN_EXISTS` (the key column must be a data column),
|
|
25
|
+
* `POSTGRES_PARTITION_STRATEGY_VALID` (the strategy must be range / list /
|
|
26
|
+
* hash), and `POSTGRES_PARTITION_SINGLE_STRATEGY` (a table partitions by one
|
|
27
|
+
* strategy only).
|
|
28
|
+
*
|
|
29
|
+
* @returns Every partition-related violation.
|
|
23
30
|
*/
|
|
24
31
|
partitionViolations(): Violation[];
|
|
25
32
|
}
|
|
@@ -2,13 +2,20 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Postgres 18 table type.
|
|
4
4
|
*
|
|
5
|
-
* Postgres
|
|
6
|
-
*
|
|
5
|
+
* Postgres uses declarative partitioning: a table is partitioned by one strategy
|
|
6
|
+
* (`range`, `list`, or `hash`) over one or more existing key columns. Each
|
|
7
|
+
* partition entry names a key column (`name`) and the strategy (`type`); all
|
|
8
|
+
* entries on a table must share one strategy.
|
|
7
9
|
*/
|
|
8
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
11
|
exports.Postgres18Table = void 0;
|
|
10
12
|
const table_type_1 = require("../table-type");
|
|
11
13
|
const types_1 = require("../types");
|
|
14
|
+
const STRATEGIES = new Set([
|
|
15
|
+
'range',
|
|
16
|
+
'list',
|
|
17
|
+
'hash',
|
|
18
|
+
]);
|
|
12
19
|
/** Postgres 18 table. */
|
|
13
20
|
class Postgres18Table extends table_type_1.TableTypeBase {
|
|
14
21
|
/**
|
|
@@ -21,24 +28,62 @@ class Postgres18Table extends table_type_1.TableTypeBase {
|
|
|
21
28
|
return (0, types_1.isValidPostgresType)(type);
|
|
22
29
|
}
|
|
23
30
|
/**
|
|
24
|
-
* Postgres
|
|
25
|
-
* once when any partition entry is present.
|
|
31
|
+
* Postgres partition rules.
|
|
26
32
|
*
|
|
27
|
-
*
|
|
33
|
+
* Emits: `NO_DUPLICATE_PARTITIONS` (a key column listed twice),
|
|
34
|
+
* `POSTGRES_PARTITION_COLUMN_EXISTS` (the key column must be a data column),
|
|
35
|
+
* `POSTGRES_PARTITION_STRATEGY_VALID` (the strategy must be range / list /
|
|
36
|
+
* hash), and `POSTGRES_PARTITION_SINGLE_STRATEGY` (a table partitions by one
|
|
37
|
+
* strategy only).
|
|
38
|
+
*
|
|
39
|
+
* @returns Every partition-related violation.
|
|
28
40
|
*/
|
|
29
41
|
partitionViolations() {
|
|
30
|
-
|
|
31
|
-
|
|
42
|
+
const violations = [];
|
|
43
|
+
const { partitions, } = this.definition;
|
|
44
|
+
for (const duplicate of this.findDuplicates(partitions.map((partition) => partition.name))) {
|
|
45
|
+
violations.push(this.violation({
|
|
46
|
+
level: 'error',
|
|
47
|
+
code: 'NO_DUPLICATE_PARTITIONS',
|
|
48
|
+
field: 'partitions',
|
|
49
|
+
message: `duplicate partition key column "${duplicate}"`,
|
|
50
|
+
}));
|
|
32
51
|
}
|
|
33
|
-
|
|
34
|
-
|
|
52
|
+
const strategies = new Set();
|
|
53
|
+
partitions.forEach((partition, index) => {
|
|
54
|
+
if (!this.hasColumn(partition.name)) {
|
|
55
|
+
violations.push(this.violation({
|
|
56
|
+
level: 'error',
|
|
57
|
+
code: 'POSTGRES_PARTITION_COLUMN_EXISTS',
|
|
58
|
+
field: `partitions[${index}].name`,
|
|
59
|
+
message: `partition key column "${partition.name}" is not defined in columns`,
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
const strategy = partition.type.trim().toLowerCase();
|
|
63
|
+
if (STRATEGIES.has(strategy)) {
|
|
64
|
+
strategies.add(strategy);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
violations.push(this.violation({
|
|
68
|
+
level: 'error',
|
|
69
|
+
code: 'POSTGRES_PARTITION_STRATEGY_VALID',
|
|
70
|
+
field: `partitions[${index}].type`,
|
|
71
|
+
message: `"${partition.type}" is not a valid Postgres partition strategy (range, list, hash)`,
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
if (strategies.size > 1) {
|
|
76
|
+
violations.push(this.violation({
|
|
35
77
|
level: 'error',
|
|
36
|
-
code: '
|
|
78
|
+
code: 'POSTGRES_PARTITION_SINGLE_STRATEGY',
|
|
37
79
|
field: 'partitions',
|
|
38
|
-
message:
|
|
39
|
-
|
|
40
|
-
|
|
80
|
+
message: `a partitioned table uses one strategy; found ${[
|
|
81
|
+
...strategies,
|
|
82
|
+
].sort().join(', ')}`,
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
return violations;
|
|
41
86
|
}
|
|
42
87
|
}
|
|
43
88
|
exports.Postgres18Table = Postgres18Table;
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtMTguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFibGUtdHlwZXMvcG9zdGdyZXMtMTgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7OztBQU1ILDhDQUV1QjtBQUN2QixvQ0FFa0I7QUFFbEIsTUFBTSxVQUFVLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQzVDLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtDQUNULENBQUMsQ0FBQztBQUVILHlCQUF5QjtBQUN6QixNQUFhLGVBQWdCLFNBQVEsMEJBQWE7SUFDOUM7Ozs7O09BS0c7SUFDSSxpQkFBaUIsQ0FBQyxJQUFZO1FBQ2pDLE9BQU8sSUFBQSwyQkFBbUIsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLG1CQUFtQjtRQUN0QixNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQ25DLE1BQU0sRUFDRixVQUFVLEdBQ2IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRXBCLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pGLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDM0IsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsSUFBSSxFQUFFLHlCQUF5QjtnQkFDL0IsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLE9BQU8sRUFBRSxtQ0FBbUMsU0FBUyxHQUFHO2FBQzNELENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQW9CLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLGtDQUFrQztvQkFDeEMsS0FBSyxFQUFFLGNBQWMsS0FBSyxRQUFRO29CQUNsQyxPQUFPLEVBQUUseUJBQXlCLFNBQVMsQ0FBQyxJQUFJLDZCQUE2QjtpQkFDaEYsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUsbUNBQW1DO29CQUN6QyxLQUFLLEVBQUUsY0FBYyxLQUFLLFFBQVE7b0JBQ2xDLE9BQU8sRUFBRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLGtFQUFrRTtpQkFDaEcsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUMzQixLQUFLLEVBQUUsT0FBTztnQkFDZCxJQUFJLEVBQUUsb0NBQW9DO2dCQUMxQyxLQUFLLEVBQUUsWUFBWTtnQkFDbkIsT0FBTyxFQUFFLGdEQUFnRDtvQkFDckQsR0FBRyxVQUFVO2lCQUNoQixDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTthQUN4QixDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0NBQ0o7QUExRUQsMENBMEVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3N0Z3JlcyAxOCB0YWJsZSB0eXBlLlxuICpcbiAqIFBvc3RncmVzIHVzZXMgZGVjbGFyYXRpdmUgcGFydGl0aW9uaW5nOiBhIHRhYmxlIGlzIHBhcnRpdGlvbmVkIGJ5IG9uZSBzdHJhdGVneVxuICogKGByYW5nZWAsIGBsaXN0YCwgb3IgYGhhc2hgKSBvdmVyIG9uZSBvciBtb3JlIGV4aXN0aW5nIGtleSBjb2x1bW5zLiBFYWNoXG4gKiBwYXJ0aXRpb24gZW50cnkgbmFtZXMgYSBrZXkgY29sdW1uIChgbmFtZWApIGFuZCB0aGUgc3RyYXRlZ3kgKGB0eXBlYCk7IGFsbFxuICogZW50cmllcyBvbiBhIHRhYmxlIG11c3Qgc2hhcmUgb25lIHN0cmF0ZWd5LlxuICovXG5cbmltcG9ydCB7XG4gICAgUGFydGl0aW9uLFxuICAgIFZpb2xhdGlvbixcbn0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgICBUYWJsZVR5cGVCYXNlLFxufSBmcm9tICcuLi90YWJsZS10eXBlJztcbmltcG9ydCB7XG4gICAgaXNWYWxpZFBvc3RncmVzVHlwZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBTVFJBVEVHSUVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ3JhbmdlJyxcbiAgICAnbGlzdCcsXG4gICAgJ2hhc2gnLFxuXSk7XG5cbi8qKiBQb3N0Z3JlcyAxOCB0YWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0Z3JlczE4VGFibGUgZXh0ZW5kcyBUYWJsZVR5cGVCYXNlIHtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBhIGNvbHVtbiB0eXBlIGFnYWluc3QgdGhlIFBvc3RncmVzIHR5cGUgcmVnaXN0cnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIHN0cmluZyBmcm9tIGEgY29sdW1uIGRlZmluaXRpb24uXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB0eXBlIGlzIGEgdmFsaWQgUG9zdGdyZXMgMTggdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWYWxpZENvbHVtblR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkUG9zdGdyZXNUeXBlKHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvc3RncmVzIHBhcnRpdGlvbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEVtaXRzOiBgTk9fRFVQTElDQVRFX1BBUlRJVElPTlNgIChhIGtleSBjb2x1bW4gbGlzdGVkIHR3aWNlKSxcbiAgICAgKiBgUE9TVEdSRVNfUEFSVElUSU9OX0NPTFVNTl9FWElTVFNgICh0aGUga2V5IGNvbHVtbiBtdXN0IGJlIGEgZGF0YSBjb2x1bW4pLFxuICAgICAqIGBQT1NUR1JFU19QQVJUSVRJT05fU1RSQVRFR1lfVkFMSURgICh0aGUgc3RyYXRlZ3kgbXVzdCBiZSByYW5nZSAvIGxpc3QgL1xuICAgICAqIGhhc2gpLCBhbmQgYFBPU1RHUkVTX1BBUlRJVElPTl9TSU5HTEVfU1RSQVRFR1lgIChhIHRhYmxlIHBhcnRpdGlvbnMgYnkgb25lXG4gICAgICogc3RyYXRlZ3kgb25seSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBwYXJ0aXRpb24tcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHBhcnRpdGlvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYXJ0aXRpb25zLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMocGFydGl0aW9ucy5tYXAoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uLm5hbWUpKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnTk9fRFVQTElDQVRFX1BBUlRJVElPTlMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAncGFydGl0aW9ucycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBwYXJ0aXRpb24ga2V5IGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmF0ZWdpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgcGFydGl0aW9ucy5mb3JFYWNoKChwYXJ0aXRpb246IFBhcnRpdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihwYXJ0aXRpb24ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1BBUlRJVElPTl9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS5uYW1lYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHBhcnRpdGlvbiBrZXkgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gcGFydGl0aW9uLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoU1RSQVRFR0lFUy5oYXMoc3RyYXRlZ3kpKSB7XG4gICAgICAgICAgICAgICAgc3RyYXRlZ2llcy5hZGQoc3RyYXRlZ3kpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1BBUlRJVElPTl9TVFJBVEVHWV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0udHlwZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7cGFydGl0aW9uLnR5cGV9XCIgaXMgbm90IGEgdmFsaWQgUG9zdGdyZXMgcGFydGl0aW9uIHN0cmF0ZWd5IChyYW5nZSwgbGlzdCwgaGFzaClgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHN0cmF0ZWdpZXMuc2l6ZSA+IDEpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1BBUlRJVElPTl9TSU5HTEVfU1RSQVRFR1knLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAncGFydGl0aW9ucycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGEgcGFydGl0aW9uZWQgdGFibGUgdXNlcyBvbmUgc3RyYXRlZ3k7IGZvdW5kICR7W1xuICAgICAgICAgICAgICAgICAgICAuLi5zdHJhdGVnaWVzLFxuICAgICAgICAgICAgICAgIF0uc29ydCgpLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cbn1cbiJdfQ==
|