UNPKG

@aws-cdk/aws-redshift-alpha

Version:

The CDK Construct Library for AWS::Redshift

329 lines 39.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ColumnEncoding = exports.TableSortStyle = exports.TableDistStyle = exports.Table = exports.TableAction = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cdk = require("aws-cdk-lib/core"); const cx_api_1 = require("aws-cdk-lib/cx-api"); const constructs_1 = require("constructs"); const database_query_1 = require("./private/database-query"); const handler_name_1 = require("./private/database-query-provider/handler-name"); const util_1 = require("./private/database-query-provider/util"); /** * An action that a Redshift user can be granted privilege to perform on a table. */ var TableAction; (function (TableAction) { /** * Grants privilege to select data from a table or view using a SELECT statement. */ TableAction[TableAction["SELECT"] = 0] = "SELECT"; /** * Grants privilege to load data into a table using an INSERT statement or a COPY statement. */ TableAction[TableAction["INSERT"] = 1] = "INSERT"; /** * Grants privilege to update a table column using an UPDATE statement. */ TableAction[TableAction["UPDATE"] = 2] = "UPDATE"; /** * Grants privilege to delete a data row from a table. */ TableAction[TableAction["DELETE"] = 3] = "DELETE"; /** * Grants privilege to drop a table. */ TableAction[TableAction["DROP"] = 4] = "DROP"; /** * Grants privilege to create a foreign key constraint. * * You need to grant this privilege on both the referenced table and the referencing table; otherwise, the user can't create the constraint. */ TableAction[TableAction["REFERENCES"] = 5] = "REFERENCES"; /** * Grants all available privileges at once to the specified user or user group. */ TableAction[TableAction["ALL"] = 6] = "ALL"; })(TableAction || (exports.TableAction = TableAction = {})); class TableBase extends constructs_1.Construct { grant(user, ...actions) { user.addTablePrivileges(this, ...actions); } } /** * A table in a Redshift cluster. */ class Table extends TableBase { static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-redshift-alpha.Table", version: "2.237.1-alpha.0" }; /** * Specify a Redshift table using a table name and schema that already exists. */ static fromTableAttributes(scope, id, attrs) { try { jsiiDeprecationWarnings._aws_cdk_aws_redshift_alpha_TableAttributes(attrs); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromTableAttributes); } throw error; } return new class extends TableBase { tableName = attrs.tableName; tableColumns = attrs.tableColumns; cluster = attrs.cluster; databaseName = attrs.databaseName; }(scope, id); } tableName; tableColumns; cluster; databaseName; resource; constructor(scope, id, props) { super(scope, id); try { jsiiDeprecationWarnings._aws_cdk_aws_redshift_alpha_TableProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, Table); } throw error; } this.validateDistKeyColumns(props.tableColumns); if (props.distStyle) { this.validateDistStyle(props.distStyle, props.tableColumns); } if (props.sortStyle) { this.validateSortStyle(props.sortStyle, props.tableColumns); } this.tableColumns = this.configureTableColumns(props.tableColumns); this.cluster = props.cluster; this.databaseName = props.databaseName; const useColumnIds = !!cdk.FeatureFlags.of(this).isEnabled(cx_api_1.REDSHIFT_COLUMN_ID); this.resource = new database_query_1.DatabaseQuery(this, 'Resource', { removalPolicy: cdk.RemovalPolicy.RETAIN, ...props, handler: handler_name_1.HandlerName.Table, properties: { tableName: { prefix: props.tableName ?? cdk.Names.uniqueId(this), generateSuffix: (props.tableName == null).toString(), }, tableColumns: this.tableColumns, distStyle: props.distStyle, sortStyle: props.sortStyle ?? this.getDefaultSortStyle(props.tableColumns), tableComment: props.tableComment, useColumnIds, }, }); this.tableName = props.tableName ?? this.resource.ref; } /** * Apply the given removal policy to this resource * * The Removal Policy controls what happens to this resource when it stops * being managed by CloudFormation, either because you've removed it from the * CDK application or because you've made a change that requires the resource * to be replaced. * * The resource can be destroyed (`RemovalPolicy.DESTROY`), or left in your AWS * account for data recovery and cleanup later (`RemovalPolicy.RETAIN`). * * This resource is retained by default. */ applyRemovalPolicy(policy) { this.resource.applyRemovalPolicy(policy); } validateDistKeyColumns(columns) { try { (0, util_1.getDistKeyColumn)(columns); } catch { throw new cdk.ValidationError('Only one column can be configured as distKey.', this); } } validateDistStyle(distStyle, columns) { const distKeyColumn = (0, util_1.getDistKeyColumn)(columns); if (distKeyColumn && distStyle !== TableDistStyle.KEY) { throw new cdk.ValidationError(`Only 'TableDistStyle.KEY' can be configured when distKey is also configured. Found ${distStyle}`, this); } if (!distKeyColumn && distStyle === TableDistStyle.KEY) { throw new cdk.ValidationError('distStyle of "TableDistStyle.KEY" can only be configured when distKey is also configured.', this); } } validateSortStyle(sortStyle, columns) { const sortKeyColumns = (0, util_1.getSortKeyColumns)(columns); if (sortKeyColumns.length === 0 && sortStyle !== TableSortStyle.AUTO) { throw new cdk.ValidationError(`sortStyle of '${sortStyle}' can only be configured when sortKey is also configured.`, this); } if (sortKeyColumns.length > 0 && sortStyle === TableSortStyle.AUTO) { throw new cdk.ValidationError(`sortStyle of '${TableSortStyle.AUTO}' cannot be configured when sortKey is also configured.`, this); } } getDefaultSortStyle(columns) { const sortKeyColumns = (0, util_1.getSortKeyColumns)(columns); return (sortKeyColumns.length === 0) ? TableSortStyle.AUTO : TableSortStyle.COMPOUND; } configureTableColumns(columns) { const newColumns = [...columns]; const columnIds = new Set(); for (let i = 0; i < columns.length; i++) { const column = newColumns[i]; if (column.id) { if (columnIds.has(column.id)) { throw new cdk.ValidationError(`Column id '${column.id}' is not unique.`, this); } columnIds.add(column.id); } else { if (columnIds.has(column.name)) { throw new cdk.ValidationError(`Column name '${column.name}' is not unique amongst the column ids.`, this); } newColumns[i] = { ...column, id: column.name }; columnIds.add(column.name); } } return newColumns; } } exports.Table = Table; /** * The data distribution style of a table. */ var TableDistStyle; (function (TableDistStyle) { /** * Amazon Redshift assigns an optimal distribution style based on the table data */ TableDistStyle["AUTO"] = "AUTO"; /** * The data in the table is spread evenly across the nodes in a cluster in a round-robin distribution. */ TableDistStyle["EVEN"] = "EVEN"; /** * The data is distributed by the values in the DISTKEY column. */ TableDistStyle["KEY"] = "KEY"; /** * A copy of the entire table is distributed to every node. */ TableDistStyle["ALL"] = "ALL"; })(TableDistStyle || (exports.TableDistStyle = TableDistStyle = {})); /** * The sort style of a table. */ var TableSortStyle; (function (TableSortStyle) { /** * Amazon Redshift assigns an optimal sort key based on the table data. */ TableSortStyle["AUTO"] = "AUTO"; /** * Specifies that the data is sorted using a compound key made up of all of the listed columns, * in the order they are listed. */ TableSortStyle["COMPOUND"] = "COMPOUND"; /** * Specifies that the data is sorted using an interleaved sort key. */ TableSortStyle["INTERLEAVED"] = "INTERLEAVED"; })(TableSortStyle || (exports.TableSortStyle = TableSortStyle = {})); /** * The compression encoding of a column. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Compression_encodings.html */ var ColumnEncoding; (function (ColumnEncoding) { /** * Amazon Redshift assigns an optimal encoding based on the column data. * This is the default. */ ColumnEncoding["AUTO"] = "AUTO"; /** * The column is not compressed. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Raw_encoding.html */ ColumnEncoding["RAW"] = "RAW"; /** * The column is compressed using the AZ64 algorithm. * * @see https://docs.aws.amazon.com/redshift/latest/dg/az64-encoding.html */ ColumnEncoding["AZ64"] = "AZ64"; /** * The column is compressed using a separate dictionary for each block column value on disk. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Byte_dictionary_encoding.html */ ColumnEncoding["BYTEDICT"] = "BYTEDICT"; /** * The column is compressed based on the difference between values in the column. * This records differences as 1-byte values. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Delta_encoding.html */ ColumnEncoding["DELTA"] = "DELTA"; /** * The column is compressed based on the difference between values in the column. * This records differences as 2-byte values. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Delta_encoding.html */ ColumnEncoding["DELTA32K"] = "DELTA32K"; /** * The column is compressed using the LZO algorithm. * * @see https://docs.aws.amazon.com/redshift/latest/dg/lzo-encoding.html */ ColumnEncoding["LZO"] = "LZO"; /** * The column is compressed to a smaller storage size than the original data type. * The compressed storage size is 1 byte. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_MostlyN_encoding.html */ ColumnEncoding["MOSTLY8"] = "MOSTLY8"; /** * The column is compressed to a smaller storage size than the original data type. * The compressed storage size is 2 bytes. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_MostlyN_encoding.html */ ColumnEncoding["MOSTLY16"] = "MOSTLY16"; /** * The column is compressed to a smaller storage size than the original data type. * The compressed storage size is 4 bytes. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_MostlyN_encoding.html */ ColumnEncoding["MOSTLY32"] = "MOSTLY32"; /** * The column is compressed by recording the number of occurrences of each value in the column. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Runlength_encoding.html */ ColumnEncoding["RUNLENGTH"] = "RUNLENGTH"; /** * The column is compressed by recording the first 245 unique words and then using a 1-byte index to represent each word. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Text255_encoding.html */ ColumnEncoding["TEXT255"] = "TEXT255"; /** * The column is compressed by recording the first 32K unique words and then using a 2-byte index to represent each word. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Text255_encoding.html */ ColumnEncoding["TEXT32K"] = "TEXT32K"; /** * The column is compressed using the ZSTD algorithm. * * @see https://docs.aws.amazon.com/redshift/latest/dg/zstd-encoding.html */ ColumnEncoding["ZSTD"] = "ZSTD"; })(ColumnEncoding || (exports.ColumnEncoding = ColumnEncoding = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLHdDQUF3QztBQUN4QywrQ0FBd0Q7QUFDeEQsMkNBQW1EO0FBR25ELDZEQUF5RDtBQUN6RCxpRkFBNkU7QUFDN0UsaUVBQTZGO0FBSTdGOztHQUVHO0FBQ0gsSUFBWSxXQXFDWDtBQXJDRCxXQUFZLFdBQVc7SUFDckI7O09BRUc7SUFDSCxpREFBTSxDQUFBO0lBRU47O09BRUc7SUFDSCxpREFBTSxDQUFBO0lBRU47O09BRUc7SUFDSCxpREFBTSxDQUFBO0lBRU47O09BRUc7SUFDSCxpREFBTSxDQUFBO0lBRU47O09BRUc7SUFDSCw2Q0FBSSxDQUFBO0lBRUo7Ozs7T0FJRztJQUNILHlEQUFVLENBQUE7SUFFVjs7T0FFRztJQUNILDJDQUFHLENBQUE7QUFDTCxDQUFDLEVBckNXLFdBQVcsMkJBQVgsV0FBVyxRQXFDdEI7QUFxS0QsTUFBZSxTQUFVLFNBQVEsc0JBQVM7SUFLeEMsS0FBSyxDQUFDLElBQVcsRUFBRSxHQUFHLE9BQXNCO1FBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztLQUMzQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLEtBQU0sU0FBUSxTQUFTOztJQUNsQzs7T0FFRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjs7Ozs7Ozs7OztRQUM3RSxPQUFPLElBQUksS0FBTSxTQUFRLFNBQVM7WUFDdkIsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDNUIsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDbEMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDeEIsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FDNUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFD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SUFFYjs7T0FFRztJQUNILDZCQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILDZCQUFXLENBQUE7QUFDYixDQUFDLEVBcEJXLGNBQWMsOEJBQWQsY0FBYyxRQW9CekI7QUFFRDs7R0FFRztBQUNILElBQVksY0FnQlg7QUFoQkQsV0FBWSxjQUFjO0lBQ3hCOztPQUVHO0lBQ0gsK0JBQWEsQ0FBQTtJQUViOzs7T0FHRztJQUNILHVDQUFxQixDQUFBO0lBRXJCOztPQUVHO0lBQ0gsNkNBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQWhCVyxjQUFjLDhCQUFkLGNBQWMsUUFnQnpCO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksY0FzR1g7QUF0R0QsV0FBWSxjQUFjO0lBQ3hCOzs7T0FHRztJQUNILCtCQUFhLENBQUE7SUFFYjs7OztPQUlHO0lBQ0gsNkJBQVcsQ0FBQTtJQUVYOzs7O09BSUc7SUFDSCwrQkFBYSxDQUFBO0lBRWI7Ozs7T0FJRztJQUNILHVDQUFxQixDQUFBO0lBRXJCOzs7OztPQUtHO0lBQ0gsaUNBQWUsQ0FBQTtJQUVmOzs7OztPQUtHO0lBQ0gsdUNBQXFCLENBQUE7SUFFckI7Ozs7T0FJRztJQUNILDZCQUFXLENBQUE7SUFFWDs7Ozs7T0FLRztJQUNILHFDQUFtQixDQUFBO0lBRW5COzs7OztPQUtHO0lBQ0gsdUNBQXFCLENBQUE7SUFFckI7Ozs7O09BS0c7SUFDSCx1Q0FBcUIsQ0FBQTtJQUVyQjs7OztPQUlHO0lBQ0gseUNBQXVCLENBQUE7SUFFdkI7Ozs7T0FJRztJQUNILHFDQUFtQixDQUFBO0lBRW5COzs7O09BSUc7SUFDSCxxQ0FBbUIsQ0FBQTtJQUVuQjs7OztPQUlHO0lBQ0gsK0JBQWEsQ0FBQTtBQUNmLENBQUMsRUF0R1csY0FBYyw4QkFBZCxjQUFjLFFBc0d6QiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgUkVEU0hJRlRfQ09MVU1OX0lEIH0gZnJvbSAnYXdzLWNkay1saWIvY3gtYXBpJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSUNsdXN0ZXIgfSBmcm9tICcuL2NsdXN0ZXInO1xuaW1wb3J0IHsgRGF0YWJhc2VPcHRpb25zIH0gZnJvbSAnLi9kYXRhYmFzZS1vcHRpb25zJztcbmltcG9ydCB7IERhdGFiYXNlUXVlcnkgfSBmcm9tICcuL3ByaXZhdGUvZGF0YWJhc2UtcXVlcnknO1xuaW1wb3J0IHsgSGFuZGxlck5hbWUgfSBmcm9tICcuL3ByaXZhdGUvZGF0YWJhc2UtcXVlcnktcHJvdmlkZXIvaGFuZGxlci1uYW1lJztcbmltcG9ydCB7IGdldERpc3RLZXlDb2x1bW4sIGdldFNvcnRLZXlDb2x1bW5zIH0gZnJvbSAnLi9wcml2YXRlL2RhdGFiYXNlLXF1ZXJ5LXByb3ZpZGVyL3V0aWwnO1xuaW1wb3J0IHsgVGFibGVIYW5kbGVyUHJvcHMgfSBmcm9tICcuL3ByaXZhdGUvaGFuZGxlci1wcm9wcyc7XG5pbXBvcnQgeyBJVXNlciB9IGZyb20gJy4vdXNlcic7XG5cbi8qKlxuICogQW4gYWN0aW9uIHRoYXQgYSBSZWRzaGlmdCB1c2VyIGNhbiBiZSBncmFudGVkIHByaXZpbGVnZSB0byBwZXJmb3JtIG9uIGEgdGFibGUuXG4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlQWN0aW9uIHtcbiAgLyoqXG4gICAqIEdyYW50cyBwcml2aWxlZ2UgdG8gc2VsZWN0IGRhdGEgZnJvbSBhIHRhYmxlIG9yIHZpZXcgdXNpbmcgYSBTRUxFQ1Qgc3RhdGVtZW50LlxuICAgKi9cbiAgU0VMRUNULFxuXG4gIC8qKlxuICAgKiBHcmFudHMgcHJpdmlsZWdlIHRvIGxvYWQgZGF0YSBpbnRvIGEgdGFibGUgdXNpbmcgYW4gSU5TRVJUIHN0YXRlbWVudCBvciBhIENPUFkgc3RhdGVtZW50LlxuICAgKi9cbiAgSU5TRVJULFxuXG4gIC8qKlxuICAgKiBHcmFudHMgcHJpdmlsZWdlIHRvIHVwZGF0ZSBhIHRhYmxlIGNvbHVtbiB1c2luZyBhbiBVUERBVEUgc3RhdGVtZW50LlxuICAgKi9cbiAgVVBEQVRFLFxuXG4gIC8qKlxuICAgKiBHcmFudHMgcHJpdmlsZWdlIHRvIGRlbGV0ZSBhIGRhdGEgcm93IGZyb20gYSB0YWJsZS5cbiAgICovXG4gIERFTEVURSxcblxuICAvKipcbiAgICogR3JhbnRzIHByaXZpbGVnZSB0byBkcm9wIGEgdGFibGUuXG4gICAqL1xuICBEUk9QLFxuXG4gIC8qKlxuICAgKiBHcmFudHMgcHJpdmlsZWdlIHRvIGNyZWF0ZSBhIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQuXG4gICAqXG4gICAqIFlvdSBuZWVkIHRvIGdyYW50IHRoaXMgcHJpdmlsZWdlIG9uIGJvdGggdGhlIHJlZmVyZW5jZWQgdGFibGUgYW5kIHRoZSByZWZlcmVuY2luZyB0YWJsZTsgb3RoZXJ3aXNlLCB0aGUgdXNlciBjYW4ndCBjcmVhdGUgdGhlIGNvbnN0cmFpbnQuXG4gICAqL1xuICBSRUZFUkVOQ0VTLFxuXG4gIC8qKlxuICAgKiBHcmFudHMgYWxsIGF2YWlsYWJsZSBwcml2aWxlZ2VzIGF0IG9uY2UgdG8gdGhlIHNwZWNpZmllZCB1c2VyIG9yIHVzZXIgZ3JvdXAuXG4gICAqL1xuICBBTEwsXG59XG5cbi8qKlxuICogQSBjb2x1bW4gaW4gYSBSZWRzaGlmdCB0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2x1bW4ge1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb2x1bW4uXG4gICAqXG4gICAqIFRoaXMgaXMgbm90IHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4sIGFuZCByZW5hbWluZyB0aGlzIGlkZW50aWZpZXIgd2lsbCBjYXVzZSBhIG5ldyBjb2x1bW4gdG8gYmUgY3JlYXRlZCBhbmQgdGhlIG9sZCBjb2x1bW4gdG8gYmUgZHJvcHBlZC5cbiAgICpcbiAgICogKipOT1RFKiogLSBUaGlzIGZpZWxkIHdpbGwgYmUgc2V0LCBob3dldmVyLCBvbmx5IGJ5IHNldHRpbmcgdGhlIGBAYXdzLWNkay9hd3MtcmVkc2hpZnQ6Y29sdW1uSWRgIGZlYXR1cmUgZmxhZyB3aWxsIHRoaXMgZmllbGQgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgY29sdW1uIG5hbWUgaXMgdXNlZCBhcyB0aGUgaWRlbnRpZmllclxuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4uIFRoaXMgd2lsbCBhcHBlYXIgb24gQW1hem9uIFJlZHNoaWZ0LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW4uXG4gICAqL1xuICByZWFkb25seSBkYXRhVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyB0byBiZSBjb25maWd1cmVkIGFzIERJU1RLRVkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY29sdW1uIGlzIG5vdCBESVNUS0VZXG4gICAqL1xuICByZWFkb25seSBkaXN0S2V5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQm9vbGVhbiB2YWx1ZSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgdG8gYmUgY29uZmlndXJlZCBhcyBTT1JUS0VZLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGNvbHVtbiBpcyBub3QgYSBTT1JUS0VZXG4gICAqL1xuICByZWFkb25seSBzb3J0S2V5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGVuY29kaW5nIHRvIHVzZSBmb3IgdGhlIGNvbHVtbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBbWF6b24gUmVkc2hpZnQgZGV0ZXJtaW5lcyB0aGUgZW5jb2RpbmcgYmFzZWQgb24gdGhlIGRhdGEgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IGVuY29kaW5nPzogQ29sdW1uRW5jb2Rpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGNvbHVtbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb21tZW50XG4gICAqL1xuICByZWFkb25seSBjb21tZW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNvbmZpZ3VyaW5nIGEgUmVkc2hpZnQgdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVQcm9wcyBleHRlbmRzIERhdGFiYXNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBuYW1lIGlzIGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSB0YWJsZUNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdHJpYnV0aW9uIHN0eWxlIG9mIHRoZSB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgVGFibGVEaXN0U3R5bGUuQVVUT1xuICAgKi9cbiAgcmVhZG9ubHkgZGlzdFN0eWxlPzogVGFibGVEaXN0U3R5bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3J0IHN0eWxlIG9mIHRoZSB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgVGFibGVTb3J0U3R5bGUuQVVUTyBpZiBubyBzb3J0IGtleSBpcyBzcGVjaWZpZWQsIFRhYmxlU29ydFN0eWxlLkNPTVBPVU5EIGlmIGEgc29ydCBrZXkgaXMgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBzb3J0U3R5bGU/OiBUYWJsZVNvcnRTdHlsZTtcblxuICAvKipcbiAgICogVGhlIHBvbGljeSB0byBhcHBseSB3aGVuIHRoaXMgcmVzb3VyY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgY2RrLlJlbW92YWxQb2xpY3kuUmV0YWluXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQ29tbWVudD86IHN0cmluZztcblxuICAvKipcbiAgICogSGFuZGxlciB0aW1lb3V0IGR1cmF0aW9uLlxuICAgKlxuICAgKiBWYWxpZCB2YWx1ZXMgYXJlIGJldHdlZW4gMSBzZWNvbmQgYW5kIDE1IG1pbnV0ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gMSBtaW51dGVcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBjZGsuRHVyYXRpb247XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRhYmxlIGluIGEgUmVkc2hpZnQgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRhYmxlIGV4dGVuZHMgSUNvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSB0YWJsZUNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBUaGUgY2x1c3RlciB3aGVyZSB0aGUgdGFibGUgaXMgbG9jYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNsdXN0ZXI6IElDbHVzdGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2Ugd2hlcmUgdGhlIHRhYmxlIGlzIGxvY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnQgYSB1c2VyIHByaXZpbGVnZSB0byBhY2Nlc3MgdGhpcyB0YWJsZS5cbiAgICovXG4gIGdyYW50KHVzZXI6IElVc2VyLCAuLi5hY3Rpb25zOiBUYWJsZUFjdGlvbltdKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIGZ1bGwgc3BlY2lmaWNhdGlvbiBvZiBhIFJlZHNoaWZ0IHRhYmxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW1wb3J0IGl0IGZsdWVudGx5IGludG8gdGhlIENESyBhcHBsaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZUF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbHVtbnMgb2YgdGhlIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVDb2x1bW5zOiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogVGhlIGNsdXN0ZXIgd2hlcmUgdGhlIHRhYmxlIGlzIGxvY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyOiBJQ2x1c3RlcjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHdoZXJlIHRoZSB0YWJsZSBpcyBsb2NhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG59XG5cbmFic3RyYWN0IGNsYXNzIFRhYmxlQmFzZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElUYWJsZSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuICBhYnN0cmFjdCByZWFkb25seSB0YWJsZUNvbHVtbnM6IENvbHVtbltdO1xuICBhYnN0cmFjdCByZWFkb25seSBjbHVzdGVyOiBJQ2x1c3RlcjtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG4gIGdyYW50KHVzZXI6IElVc2VyLCAuLi5hY3Rpb25zOiBUYWJsZUFjdGlvbltdKSB7XG4gICAgdXNlci5hZGRUYWJsZVByaXZpbGVnZXModGhpcywgLi4uYWN0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHRhYmxlIGluIGEgUmVkc2hpZnQgY2x1c3Rlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlIGV4dGVuZHMgVGFibGVCYXNlIHtcbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBSZWRzaGlmdCB0YWJsZSB1c2luZyBhIHRhYmxlIG5hbWUgYW5kIHNjaGVtYSB0aGF0IGFscmVhZHkgZXhpc3RzLlxuICAgKi9cbiAgc3RhdGljIGZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFRhYmxlQXR0cmlidXRlcyk6IElUYWJsZSB7XG4gICAgcmV0dXJuIG5ldyBjbGFzcyBleHRlbmRzIFRhYmxlQmFzZSB7XG4gICAgICByZWFkb25seSB0YWJsZU5hbWUgPSBhdHRycy50YWJsZU5hbWU7XG4gICAgICByZWFkb25seSB0YWJsZUNvbHVtbnMgPSBhdHRycy50YWJsZUNvbHVtbnM7XG4gICAgICByZWFkb25seSBjbHVzdGVyID0gYXR0cnMuY2x1c3RlcjtcbiAgICAgIHJlYWRvbmx5IGRhdGFiYXNlTmFtZSA9IGF0dHJzLmRhdGFiYXNlTmFtZTtcbiAgICB9KHNjb3BlLCBpZCk7XG4gIH1cblxuICByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGFibGVDb2x1bW5zOiBDb2x1bW5bXTtcbiAgcmVhZG9ubHkgY2x1c3RlcjogSUNsdXN0ZXI7XG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVzb3VyY2U6IERhdGFiYXNlUXVlcnk8VGFibGVIYW5kbGVyUHJvcHM+O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUYWJsZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMudmFsaWRhdGVEaXN0S2V5Q29sdW1ucyhwcm9wcy50YWJsZUNvbHVtbnMpO1xuICAgIGlmIChwcm9wcy5kaXN0U3R5bGUpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVEaXN0U3R5bGUocHJvcHMuZGlzdFN0eWxlLCBwcm9wcy50YWJsZUNvbHVtbnMpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuc29ydFN0eWxlKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlU29ydFN0eWxlKHByb3BzLnNvcnRTdHlsZSwgcHJvcHMudGFibGVDb2x1bW5zKTtcbiAgICB9XG5cbiAgICB0aGlzLnRhYmxlQ29sdW1ucyA9IHRoaXMuY29uZmlndXJlVGFibGVDb2x1bW5zKHByb3BzLnRhYmxlQ29sdW1ucyk7XG4gICAgdGhpcy5jbHVzdGVyID0gcHJvcHMuY2x1c3RlcjtcbiAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZTtcblxuICAgIGNvbnN0IHVzZUNvbHVtbklkcyA9ICEhY2RrLkZlYXR1cmVGbGFncy5vZih0aGlzKS5pc0VuYWJsZWQoUkVEU0hJRlRfQ09MVU1OX0lEKTtcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgRGF0YWJhc2VRdWVyeTxUYWJsZUhhbmRsZXJQcm9wcz4odGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgcmVtb3ZhbFBvbGljeTogY2RrLlJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyTmFtZS5UYWJsZSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdGFibGVOYW1lOiB7XG4gICAgICAgICAgcHJlZml4OiBwcm9wcy50YWJsZU5hbWUgPz8gY2RrLk5hbWVzLnVuaXF1ZUlkKHRoaXMpLFxuICAgICAgICAgIGdlbmVyYXRlU3VmZml4OiAocHJvcHMudGFibGVOYW1lID09IG51bGwpLnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICAgIHRhYmxlQ29sdW1uczogdGhpcy50YWJsZUNvbHVtbnMsXG4gICAgICAgIGRpc3RTdHlsZTogcHJvcHMuZGlzdFN0eWxlLFxuICAgICAgICBzb3J0U3R5bGU6IHByb3BzLnNvcnRTdHlsZSA/PyB0aGlzLmdldERlZmF1bHRTb3J0U3R5bGUocHJvcHMudGFibGVDb2x1bW5zKSxcbiAgICAgICAgdGFibGVDb21tZW50OiBwcm9wcy50YWJsZUNvbW1lbnQsXG4gICAgICAgIHVzZUNvbHVtbklkcyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhYmxlTmFtZSA9IHByb3BzLnRhYmxlTmFtZSA/PyB0aGlzLnJlc291cmNlLnJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgZ2l2ZW4gcmVtb3ZhbCBwb2xpY3kgdG8gdGhpcyByZXNvdXJjZVxuICAgKlxuICAgKiBUaGUgUmVtb3ZhbCBQb2xpY3kgY29udHJvbHMgd2hhdCBoYXBwZW5zIHRvIHRoaXMgcmVzb3VyY2Ugd2hlbiBpdCBzdG9wc1xuICAgKiBiZWluZyBtYW5hZ2VkIGJ5IENsb3VkRm9ybWF0aW9uLCBlaXRoZXIgYmVjYXVzZSB5b3UndmUgcmVtb3ZlZCBpdCBmcm9tIHRoZVxuICAgKiBDREsgYXBwbGljYXRpb24gb3IgYmVjYXVzZSB5b3UndmUgbWFkZSBhIGNoYW5nZSB0aGF0IHJlcXVpcmVzIHRoZSByZXNvdXJjZVxuICAgKiB0byBiZSByZXBsYWNlZC5cbiAgICpcbiAgICogVGhlIHJlc291cmNlIGNhbiBiZSBkZXN0cm95ZWQgKGBSZW1vdmFsUG9saWN5LkRFU1RST1lgKSwgb3IgbGVmdCBpbiB5b3VyIEFXU1xuICAgKiBhY2NvdW50IGZvciBkYXRhIHJlY292ZXJ5IGFuZCBjbGVhbnVwIGxhdGVyIChgUmVtb3ZhbFBvbGljeS5SRVRBSU5gKS5cbiAgICpcbiAgICogVGhpcyByZXNvdXJjZSBpcyByZXRhaW5lZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHVibGljIGFwcGx5UmVtb3ZhbFBvbGljeShwb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZXNvdXJjZS5hcHBseVJlbW92YWxQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVEaXN0S2V5Q29sdW1ucyhjb2x1bW5zOiBDb2x1bW5bXSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBnZXREaXN0S2V5Q29sdW1uKGNvbHVtbnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ09ubHkgb25lIGNvbHVtbiBjYW4gYmUgY29uZmlndXJlZCBhcyBkaXN0S2V5LicsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVEaXN0U3R5bGUoZGlzdFN0eWxlOiBUYWJsZURpc3RTdHlsZSwgY29sdW1uczogQ29sdW1uW10pOiB2b2lkIHtcbiAgICBjb25zdCBkaXN0S2V5Q29sdW1uID0gZ2V0RGlzdEtleUNvbHVtbihjb2x1bW5zKTtcbiAgICBpZiAoZGlzdEtleUNvbHVtbiAmJiBkaXN0U3R5bGUgIT09IFRhYmxlRGlzdFN0eWxlLktFWSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoYE9ubHkgJ1RhYmxlRGlzdFN0eWxlLktFWScgY2FuIGJlIGNvbmZpZ3VyZWQgd2hlbiBkaXN0S2V5IGlzIGFsc28gY29uZmlndXJlZC4gRm91bmQgJHtkaXN0U3R5bGV9YCwgdGhpcyk7XG4gICAgfVxuICAgIGlmICghZGlzdEtleUNvbHVtbiAmJiBkaXN0U3R5bGUgPT09IFRhYmxlRGlzdFN0eWxlLktFWSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ2Rpc3RTdHlsZSBvZiBcIlRhYmxlRGlzdFN0eWxlLktFWVwiIGNhbiBvbmx5IGJlIGNvbmZpZ3VyZWQgd2hlbiBkaXN0S2V5IGlzIGFsc28gY29uZmlndXJlZC4nLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlU29ydFN0eWxlKHNvcnRTdHlsZTogVGFibGVTb3J0U3R5bGUsIGNvbHVtbnM6IENvbHVtbltdKTogdm9pZCB7XG4gICAgY29uc3Qgc29ydEtleUNvbHVtbnMgPSBnZXRTb3J0S2V5Q29sdW1ucyhjb2x1bW5zKTtcbiAgICBpZiAoc29ydEtleUNvbHVtbnMubGVuZ3RoID09PSAwICYmIHNvcnRTdHlsZSAhPT0gVGFibGVTb3J0U3R5bGUuQVVUTykge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoYHNvcnRTdHlsZSBvZiAnJHtzb3J0U3R5bGV9JyBjYW4gb25seSBiZSBjb25maWd1cmVkIHdoZW4gc29ydEtleSBpcyBhbHNvIGNvbmZpZ3VyZWQuYCwgdGhpcyk7XG4gICAgfVxuICAgIGlmIChzb3J0S2V5Q29sdW1ucy5sZW5ndGggPiAwICYmIHNvcnRTdHlsZSA9PT0gVGFibGVTb3J0U3R5bGUuQVVUTykge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoYHNvcnRTdHlsZSBvZiAnJHtUYWJsZVNvcnRTdHlsZS5BVVRPfScgY2Fubm90IGJlIGNvbmZpZ3VyZWQgd2hlbiBzb3J0S2V5IGlzIGFsc28gY29uZmlndXJlZC5gLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRTb3J0U3R5bGUoY29sdW1uczogQ29sdW1uW10pOiBUYWJsZVNvcnRTdHlsZSB7XG4gICAgY29uc3Qgc29ydEtleUNvbHVtbnMgPSBnZXRTb3J0S2V5Q29sdW1ucyhjb2x1bW5zKTtcbiAgICByZXR1cm4gKHNvcnRLZXlDb2x1bW5zLmxlbmd0aCA9PT0gMCkgPyBUYWJsZVNvcnRTdHlsZS5BVVRPIDogVGFibGVTb3J0U3R5bGUuQ09NUE9VTkQ7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZVRhYmxlQ29sdW1ucyhjb2x1bW5zOiBDb2x1bW5bXSk6IENvbHVtbltdIHtcbiAgICBjb25zdCBuZXdDb2x1bW5zID0gWy4uLmNvbHVtbnNdO1xuICAgIGNvbnN0IGNvbHVtbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29sdW1uID0gbmV3Q29sdW1uc1tpXTtcbiAgICAgIGlmIChjb2x1bW4uaWQpIHtcbiAgICAgICAgaWYgKGNvbHVtbklkcy5oYXMoY29sdW1uLmlkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGBDb2x1bW4gaWQgJyR7Y29sdW1uLmlkfScgaXMgbm90IHVuaXF1ZS5gLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjb2x1bW5JZHMuYWRkKGNvbHVtbi5pZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29sdW1uSWRzLmhhcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihgQ29sdW1uIG5hbWUgJyR7Y29sdW1uLm5hbWV9JyBpcyBub3QgdW5pcXVlIGFtb25nc3QgdGhlIGNvbHVtbiBpZHMuYCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3Q29sdW1uc1tpXSA9IHsgLi4uY29sdW1uLCBpZDogY29sdW1uLm5hbWUgfTtcbiAgICAgICAgY29sdW1uSWRzLmFkZChjb2x1bW4ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdDb2x1bW5zO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGRhdGEgZGlzdHJpYnV0aW9uIHN0eWxlIG9mIGEgdGFibGUuXG4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlRGlzdFN0eWxlIHtcbiAgLyoqXG4gICAqICBBbWF6b24gUmVkc2hpZnQgYXNzaWducyBhbiBvcHRpbWFsIGRpc3RyaWJ1dGlvbiBzdHlsZSBiYXNlZCBvbiB0aGUgdGFibGUgZGF0YVxuICAgKi9cbiAgQVVUTyA9ICdBVVRPJyxcblxuICAvKipcbiAgICogVGhlIGRhdGEgaW4gdGhlIHRhYmxlIGlzIHNwcmVhZCBldmVubHkgYWNyb3NzIHRoZSBub2RlcyBpbiBhIGNsdXN0ZXIgaW4gYSByb3VuZC1yb2JpbiBkaXN0cmlidXRpb24uXG4gICAqL1xuICBFVkVOID0gJ0VWRU4nLFxuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBpcyBkaXN0cmlidXRlZCBieSB0aGUgdmFsdWVzIGluIHRoZSBESVNUS0VZIGNvbHVtbi5cbiAgICovXG4gIEtFWSA9ICdLRVknLFxuXG4gIC8qKlxuICAgKiBBIGNvcHkgb2YgdGhlIGVudGlyZSB0YWJsZSBpcyBkaXN0cmlidXRlZCB0byBldmVyeSBub2RlLlxuICAgKi9cbiAgQUxMID0gJ0FMTCcsXG59XG5cbi8qKlxuICogVGhlIHNvcnQgc3R5bGUgb2YgYSB0YWJsZS5cbiAqL1xuZXhwb3J0IGVudW0gVGFibGVTb3J0U3R5bGUge1xuICAvKipcbiAgICogQW1hem9uIFJlZHNoaWZ0IGFzc2lnbnMgYW4gb3B0aW1hbCBzb3J0IGtleSBiYXNlZCBvbiB0aGUgdGFibGUgZGF0YS5cbiAgICovXG4gIEFVVE8gPSAnQVVUTycsXG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGF0IHRoZSBkYXRhIGlzIHNvcnRlZCB1c2luZyBhIGNvbXBvdW5kIGtleSBtYWRlIHVwIG9mIGFsbCBvZiB0aGUgbGlzdGVkIGNvbHVtbnMsXG4gICAqIGluIHRoZSBvcmRlciB0aGV5IGFyZSBsaXN0ZWQuXG4gICAqL1xuICBDT01QT1VORCA9ICdDT01QT1VORCcsXG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGF0IHRoZSBkYXRhIGlzIHNvcnRlZCB1c2luZyBhbiBpbnRlcmxlYXZlZCBzb3J0IGtleS5cbiAgICovXG4gIElOVEVSTEVBVkVEID0gJ0lOVEVSTEVBVkVEJyxcbn1cblxuLyoqXG4gKiBUaGUgY29tcHJlc3Npb24gZW5jb2Rpbmcgb2YgYSBjb2x1bW4uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL2NfQ29tcHJlc3Npb25fZW5jb2RpbmdzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gQ29sdW1uRW5jb2Rpbmcge1xuICAvKipcbiAgICogQW1hem9uIFJlZHNoaWZ0IGFzc2lnbnMgYW4gb3B0aW1hbCBlbmNvZGluZyBiYXNlZCBvbiB0aGUgY29sdW1uIGRhdGEuXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQuXG4gICAqL1xuICBBVVRPID0gJ0FVVE8nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIG5vdCBjb21wcmVzc2VkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9yZWRzaGlmdC9sYXRlc3QvZGcvY19SYXdfZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgUkFXID0gJ1JBVycsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCB1c2luZyB0aGUgQVo2NCBhbGdvcml0aG0uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9hejY0LWVuY29kaW5nLmh0bWxcbiAgICovXG4gIEFaNjQgPSAnQVo2NCcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCB1c2luZyBhIHNlcGFyYXRlIGRpY3Rpb25hcnkgZm9yIGVhY2ggYmxvY2sgY29sdW1uIHZhbHVlIG9uIGRpc2suXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX0J5dGVfZGljdGlvbmFyeV9lbmNvZGluZy5odG1sXG4gICAqL1xuICBCWVRFRElDVCA9ICdCWVRFRElDVCcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHZhbHVlcyBpbiB0aGUgY29sdW1uLlxuICAgKiBUaGlzIHJlY29yZHMgZGlmZmVyZW5jZXMgYXMgMS1ieXRlIHZhbHVlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL2NfRGVsdGFfZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgREVMVEEgPSAnREVMVEEnLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIGNvbXByZXNzZWQgYmFzZWQgb24gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2YWx1ZXMgaW4gdGhlIGNvbHVtbi5cbiAgICogVGhpcyByZWNvcmRzIGRpZmZlcmVuY2VzIGFzIDItYnl0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX0RlbHRhX2VuY29kaW5nLmh0bWxcbiAgICovXG4gIERFTFRBMzJLID0gJ0RFTFRBMzJLJyxcblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBpcyBjb21wcmVzc2VkIHVzaW5nIHRoZSBMWk8gYWxnb3JpdGhtLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9yZWRzaGlmdC9sYXRlc3QvZGcvbHpvLWVuY29kaW5nLmh0bWxcbiAgICovXG4gIExaTyA9ICdMWk8nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIGNvbXByZXNzZWQgdG8gYSBzbWFsbGVyIHN0b3JhZ2Ugc2l6ZSB0aGFuIHRoZSBvcmlnaW5hbCBkYXRhIHR5cGUuXG4gICAqIFRoZSBjb21wcmVzc2VkIHN0b3JhZ2Ugc2l6ZSBpcyAxIGJ5dGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX01vc3RseU5fZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgTU9TVExZOCA9ICdNT1NUTFk4JyxcblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBpcyBjb21wcmVzc2VkIHRvIGEgc21hbGxlciBzdG9yYWdlIHNpemUgdGhhbiB0aGUgb3JpZ2luYWwgZGF0YSB0eXBlLlxuICAgKiBUaGUgY29tcHJlc3NlZCBzdG9yYWdlIHNpemUgaXMgMiBieXRlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL2NfTW9zdGx5Tl9lbmNvZGluZy5odG1sXG4gICAqL1xuICBNT1NUTFkxNiA9ICdNT1NUTFkxNicsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCB0byBhIHNtYWxsZXIgc3RvcmFnZSBzaXplIHRoYW4gdGhlIG9yaWdpbmFsIGRhdGEgdHlwZS5cbiAgICogVGhlIGNvbXByZXNzZWQgc3RvcmFnZSBzaXplIGlzIDQgYnl0ZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX01vc3RseU5fZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgTU9TVExZMzIgPSAnTU9TVExZMzInLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIGNvbXByZXNzZWQgYnkgcmVjb3JkaW5nIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgZWFjaCB2YWx1ZSBpbiB0aGUgY29sdW1uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9yZWRzaGlmdC9sYXRlc3QvZGcvY19SdW5sZW5ndGhfZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgUlVOTEVOR1RIID0gJ1JVTkxFTkdUSCcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCBieSByZWNvcmRpbmcgdGhlIGZpcnN0IDI0NSB1bmlxdWUgd29yZHMgYW5kIHRoZW4gdXNpbmcgYSAxLWJ5dGUgaW5kZXggdG8gcmVwcmVzZW50IGVhY2ggd29yZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL2NfVGV4dDI1NV9lbmNvZGluZy5odG1sXG4gICAqL1xuICBURVhUMjU1ID0gJ1RFWFQyNTUnLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIGNvbXByZXNzZWQgYnkgcmVjb3JkaW5nIHRoZSBmaXJzdCAzMksgdW5pcXVlIHdvcmRzIGFuZCB0aGVuIHVzaW5nIGEgMi1ieXRlIGluZGV4IHRvIHJlcHJlc2VudCBlYWNoIHdvcmQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX1RleHQyNTVfZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgVEVYVDMySyA9ICdURVhUMzJLJyxcblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBpcyBjb21wcmVzc2VkIHVzaW5nIHRoZSBaU1REIGFsZ29yaXRobS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL3pzdGQtZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgWlNURCA9ICdaU1REJyxcbn1cbiJdfQ==